Django小白级开发入门
1、Django概述
Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,视图V和模版T。
Django 框架的核心组件有:
- 用于创建模型的对象关系映射
- 为最终用户设计较好的管理界面
- URL 设计
- 设计者友好的模板语言
- 缓存系统
Django已经成为web开发者的首选框架,是一个遵循 MVC 设计模式的框架。MVC是Model、View、Controller三个单词的简写,分别代表模型、视图、控制器。Django其实也是一个MTV 的设计模式。
MTV是Model、Template、View三个单词的简写,分别代表模型、模版、视图 。但是在Django中,控制器接受用户输入的部分由框架自行处理,所以 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),称为 MTV模式。
层次 | 职责 |
模型(Model),即数据存取层 | 处理与数据相关的所有事务:如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等 |
模板(Template),即表现层 | 处理与表现相关的决定:如何在页面或其他类型文档中进行显示。 |
视图(View),即业务逻辑层 | 存取模型及调取恰当模板的相关逻辑。模型与模板的桥梁。 |
2、Django项目环境搭建
主要步骤是:
- 创建并激活虚拟环境
- 安装Django模块
- 创建Django项目
- 创建app应用程序
- 注册app
- 编写Django视图
- 编写Django路由
- 启动Django项目
(1)创建并激活虚拟环境
cd D:\djangotest #自己创建空文件夹存放项目
python -m venv djangoenv #创建虚拟环境
运行以下命令,激活虚拟环境
cd D:\djangotest
djangoenv\Scripts\activate #激活虚拟环境
(2)安装Django模块
#1激活虚拟环境
cd D:\djangotest
djangoenv\Scripts\activate
#2安装django模块
pip install Django #激活虚拟环境后安装Django模块
上述命令执行后,会把Django模块,安装到了djangoenv/Lib/site-packages 下,也就是说,此Django模块仅仅在虚拟环境中,而不是安装在Python全 局环境。目录如下图所示:
(3)创建Django项目
安装了Django之后,我们就可以使用Django的管理工具------>django-admin了
我们创建一个名称为loginweb的Django项目,命令如下:
#1激活虚拟环境
cd D:\djangotest
djangoenv\Scripts\activate
#2创建一个loginweb的项目
django-admin startproject loginweb
此命令执行后,会在djenv的同级目录,创建一个名称loginweb的Django 项目。目录结构如下图所示:
用Pycharm打开项目,项目结构文件含义如下:
- 外层的loginweb目录:是项目的容器,Django不关心它的名字,我 们可以将它重命名为任何我们喜欢的名字
- 里面的loginweb目录:它是一个纯python包。我们可以称呼它为项目的名称,不能随意重命名
- manage.py :它是Django的一个非常重要的工具,通过它可以调用 django shell和数据库等,如:创建app应用程序、创建数据库表、清 空数据、启动项目等操作
- settings.py :Django 项目的配置文件。包含了项目的默认设置,包 括数据库信息,调试标志以及其他一些工作的变量
- urls.py :Django 项目的URL路由声明,负责把URL模式映射到应用 程序
- wsgi.py:Web服务器网关接口(Python Web Server Gateway Interface的缩写),Python应用和Web服务器之间的一种接口,可以 看成是一种协议、规范。它是基于Http协议的,不支持WebSoket
- asgi.py:异步网关协议接口,能够处理多种通用的协议类型,包括 HTTP,HTTP2和WebSocket,可以看成ASGI是WSGI的扩展
(4)创建app应用程序
一般一个项目包含多个app应用程序(当然,通用的app也可以在多个项目中使用) 下面我们为loginweb项目,创建login
#1激活虚拟环境
cd D:\djangotest
djangoenv\Scripts\activate
#2切到django项目中
cd loginweb
#3创建一个叫login的应用
django-admin startapp login
上述命令执行后,目录结构如下图所示:
(5)注册app
app应用程序创建以后,必须把app注册到Django,才能够被Django项目所管理。我们只需要把login应用的名称,配置到 loginweb/settings.py文件中即可。如下图所示:
(6)编写Django视图
Django视图的作用:用于接受Web请求并且返回Web响应的简单Python 函数。该函数一般定义在各自应用的views.py文件中。在视图函数中,有 两个重要的对象:请求对象和响应对象。
下面是一个最简单的视图函数:
# 例:在login/views.py 中
from django.http import HttpResponse
# Create your views here.def login(request):return HttpResponse("登录页面")
(7)编写Django路由
Django的路由定义文件为:项目目录urls.py文件。我们所有的路由配置,都以列表的方式,定义在urls.py文件中,添加我们想要的路由。
# 例:在loginweb/urls.py 中
from django.contrib import admin
from django.urls import path
from login import views
urlpatterns = [path("admin/", admin.site.urls),path("login/",views.login)
]
(8)启动Django项目
在开发环境下,我们需要在本地启动Django项目,来开发与调试我们的代 码。启动Django项目命令如下:
python manage.py runserver [port]
#[port] 为应用访问端口,可以缺省不写,默认为8000。
此时,我们就可以用浏览器访问我们的项目了。结果如下图所示:
访问我们写好的路由:
3、创建登录页面
在login底下新写建一个templates目录,存放编写的html前端页面。
loginweb -> login -> templates -> login.html:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登录页面</title><style>body{text-align:center;}</style>
</head>
<body>
<form action="/login/" method="post">{% csrf_token %}<h1 align="center">登录页面</h1><p class="divs"><label for="username">用户名:</label><input type="text" id="username" name="username" align="center"></p><p class="divs">   <label for="password">密码:</label><input type="password" id="password" name="password"></p><input type="submit" value="登录"><span style="color:red">{{ error }}</span>
</form></body>
</html>
loginweb -> login -> templates -> index.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>这里是主页</title><style>h1 { color:red }</style>
</head>
<body><h1>这里是主页</h1>
</body>
</html>
loginweb -> login -> views.py
from django.shortcuts import render,redirect
# Create your views here.def login(request):if request.method == 'POST':username = request.POST.get('username')passowrd = request.POST.get('password')if username=='songqin' and passowrd =='123456':return redirect('/index')else:return render(request,'login.html',{"error":"用户名或密码错误"})return render(request,'login.html')def index(request):return render(request,'index.html')
loginweb -> loginweb -> urls.py
from django.contrib import admin
from django.urls import path
from login import views
urlpatterns = [path("admin/", admin.site.urls),path("login/",views.login),path("index/",views.index)
]
再次启动Django项目
python manage.py runserver [port]
#[port] 为应用访问端口,可以缺省不写,默认为8000。
访问http://127.0.0.1:8000/login/项目
输入不是用户名密码不是songqin/123456
输入songqin/123456点击登录 跳转到主页面
4、数据库链接
(1)配置mysql
loginweb -> loginweb -> settings.py
默认的数据库配置如下:
DATABASES = {"default": {"ENGINE": "django.db.backends.sqlite3","NAME": BASE_DIR / "db.sqlite3",}
}
修改后如下所示:
DATABASES = {"default": {"ENGINE": "django.db.backends.mysql","NAME": "数据库名","USER": "用户","PASSWORD": "密码","HOST": "ip","PORT": "3306"}
}
保存后,系统报错,缺少mysql插件,需要安装mysqlclient
,
执行以下命令安装:
pip install mysqlclient
python manage.py runserver
:然后成功运行。
按这个同样可以运行程序。
(2)自动创建数据库表
在loginweb -> login -> models.py中,添加用户类User_01。子类Meta中定义表的元数据,这里指定了表的名称为f_user_01。
from django.db import models# Create your models here.
class User_01(models.Model):u_id = models.AutoField(primary_key=True)username = models.CharField(max_length=64, null=True)name = models.CharField(max_length=64, null=True)password = models.CharField(max_length=64, null=True)sex = models.CharField(max_length=64, null=True)age = models.CharField(max_length=64, null=True)phone = models.CharField(max_length=64, null=True)email = models.CharField(max_length=64, null=True)unit = models.CharField(max_length=64, null=True)avatar = models.CharField(max_length=64, null=True)status = models.CharField(max_length=64, null=True)create_time = models.CharField(max_length=64, null=True)delete_time = models.CharField(max_length=64, null=True)update_time = models.CharField(max_length=64, null=True)class Meta:db_table = "f_user_01"
执行命令:
# 生成迁移数据
python manage.py makemigrations
# 生成数据库表
python manage.py migrate
执行完第一个命令,会在loginweb -> login -> migrations下生成初始化文件,仅仅对我们的类做了一个解读。
执行完第二个命令,会在数据库中生成数据库表。
数据库表中生成如下,只有f_user_01是我们要生成的表,上面其他的表都是Django系统默认生成的表,暂且不管。
(3)手工创建表进行映射
上面的方式是通过django自动创建models中定义的表。
现在我们需要手工创建表,然后在models中进行映射。
在数据库中创建表如下:
然后在loginweb -> login -> models.py中,增加代码如下:
class User(models.Model):id = models.AutoField(primary_key=True)name = models.CharField(max_length=30, null=True)age = models.IntegerField(null=True)email = models.CharField(max_length=50, null=True)class Meta:db_table = "user"
直接运行程序即可。
(4)小结
1、配置mysql,需要安装mysqlclient,编写models的实体类,通过迁移命令可以自动生成mysql数据库表结构。
2、如果数据库表中已经创建好表,则只在model.py中创建对应实体类即可,不用执行迁移的两个命令。这里就和java对应上了,直接编写对应实体类和sql即可。
3、如果数据库没有创建好表,可以在models设计好实体类,使用迁移命令即可自动生成mysql数据库表结构。
(5)添加数据
在loginweb -> login -> views.py中,添加代码如下:
def addUser(request):models.User.objects.create(name='linfuchi', age=90, email='i miss you')result = {'code': 0,'msg': 'success','data': ''}return HttpResponse(json.dumps(result, ensure_ascii=False), content_type='application/json')
在loginweb -> loginweb -> urls.py中,添加代码如下:
测试:
数据库表中的信息:
(6)创建默认的表
在loginweb -> login -> models.py中,增加新的类:
class Info(models.Model):title = models.CharField(max_length=100)author = models.CharField(max_length=100)
此时没有通过class Meta指定具体的表名信息。
那么会自动创建表吗?答案是肯定的。
针对python manage.py migrate,提示没有要执行的。
这是因为迁移记录已被标记为已应用。
SELECT * FROM django_migrations;
如果发现 login
应用的 0001_initial
迁移记录已经存在,说明该迁移已经被应用过了。
如果确认 login
应用的 0001_initial
迁移记录不应该存在,你可以手动删除该记录,然后重新执行迁移。
删除语句:
DELETE FROM django_migrations WHERE app = 'login' AND name = '0001_initial';
然后重新执行迁移:
python manage.py migrate
此时,查询数据库可以发现已经有一个新表了:
5、创建自定义命令
在loginweb -> login下创建目录 management,在其下再创建目录commands。
这里就是存放命令的目录,类似于springboot等其他框架技术,遵循“约定大于配置”的原则。
在其下再创建hello.py的文件,整体结构如下:
hello.py的代码如下:
from django.core.management.base import BaseCommandclass Command(BaseCommand):help = 'Prints a simple greeting message'def handle(self, *args, **options):# 在这里编写命令的具体逻辑self.stdout.write(self.style.SUCCESS('Hello, Django!'))
执行命令:
在上述代码中:
help 属性是命令的简短描述,当你运行 python manage.py help hello 时会显示该描述。
handle 方法是命令的核心逻辑,当你运行该命令时,handle 方法会被执行。self.stdout.write 用于输出信息,self.style.SUCCESS 会将输出信息以绿色高亮显示。
6、创建用户
Django自带的管理界面提供了便捷的用户创建功能。
(1)创建超级用户
在项目根目录下,打开命令行终端,执行以下命令:
python manage.py createsuperuser
按照提示输入用户名、邮箱和密码。
(2)创建普通用户
- 启动服务器:python manage.py runserver
- 登录管理界面:打开浏览器,访问
http://127.0.0.1:8000/admin/
,使用之前创建的超级用户账号和密码登录。 - 创建新用户:登录成功后,在管理界面中找到 “用户” 选项,点击 “添加” 按钮,输入新用户的用户名、密码等信息,然后点击 “保存” 即可创建新用户。
我们创建了账密为hugh/hugh。
7、Rest framework框架
(1)获取token信息
在loginweb -> loginweb -> urls.py中配置token的请求信息。
具体代码如下:
from django.contrib import admin
from django.urls import path
from login import views
from rest_framework_simplejwt.views import (TokenObtainPairView,TokenRefreshView,
)urlpatterns = [path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),path("admin/", admin.site.urls),path("login/", views.login),path("index/", views.index),path("addUser/", views.addUser)
]
然后在cmd中执行如下命令:
curl -X POST -H "Content-Type: application/json" -d "{\"username\": \"hugh\", \"password\": \"hugh\"}" http://127.0.0.1:8000/api/token/
就可以获得token信息。
(2)创建Post请求
首先,修改loginweb -> login -> views.py文件
添加如下代码:
from rest_framework import viewsets, status
from rest_framework.decorators import action
from rest_framework.response import Responseclass BookViewSet(viewsets.ModelViewSet):@action(detail=False, methods=['post'])def hello(self, request, pk=None):message = "Hello! You are interacting with the book!"return Response({'message': message}, status=status.HTTP_200_OK)
action的detail为False,表示URL不会包含对象的主键,它是针对整个资源集合的操作。
然后,在loginweb -> login下添加urls.py文件
内容如下:
from django.urls import path,include
from rest_framework.routers import DefaultRouter
from .views import BookViewSetrouter = DefaultRouter()
router.register(r'books', BookViewSet, basename='books')urlpatterns = [path('', include(router.urls))
]
接着,在loginweb -> loginweb -> urls.py中添加如下代码
此时,通过python manage.py runserver运行程序。
然后在cmd执行curl命令如下:
C:\Users\hugh>curl -X POST -H "Content-Type: application/json" http://127.0.0.1:8000/api/books/hello/
{"message":"Hello! You are interacting with the book!"}