Django技能复苏
依旧是吃吹不忘挖井人环节:https://blog.csdn.net/weixin_41790086/article/details/80726480
MVC : 典型代表(flask):
VC: Model-View-Controller 模型-视图-控制器
- M: 数据处理
- V: 界面显示
- C: 逻辑处理
上个世纪八十年代为Smalltalk语言发明的一种 软件框架模式。最开始用于Desktop程序开发,现在已被广泛使用,包括Web开发。
核心思想: 分层,解耦。MVC分离了 数据处理 和 界面显示 的代码,使得程序可以在不修改数据处理相关逻辑的前提下,方便地切换不同的显示界面
目的: 提高程序的扩展性和可维护性。
Disad:
MVC 层与层之间还是太过紧密,调试应用程序带来了一定的困难。每个构件在使用之前都需要经过彻底的测试。
MVT(虽然本质上还是MVC) 典型:Django
M: Model, 模型 与MVC中的M相同,负责对数据的处理
V: View, 视图 与MVC中的C类似,负责处理用户请求,调用M和T,响应请求
T: Template, 模板 与MVC中的V类似,负责如何显示数据(产生html界面
Django创建的文件层次
-
创建:
pip install django django django-admin startproject project_Name django-admin startapp appName
-
文件树
study_Django │ manage.py # web启动脚本,项目工程入口 │ ├─studyapp0 # app(可有多个),放服务 │ │ admin.py # 后台管理配置脚本 │ │ apps.py # 声明但钱应用的基本信息 │ │ models.py # 数据模型类声明所在脚本 │ │ tests.py # 单元测试类 │ │ views.py # 声明当前应用的试图处理函数或类 │ │ __init__.py | | urls.py # 自创建,当前应用模块的子路由 │ │ │ └─migrations │ __init__.py │ └─study_Django asgi.py settings.py # 设置文件,数据库连接,app注册,中间件与模板配置 urls.py # 总路由 wsgi.py # Django实现wsdi脚本 __init__.py
Task1 (并不是) 第一个 HelloWorld
- 添加urls的主路由配置,并构造路由响应函数:
from django.http import HttpRequest,HttpResponse
# 声明一个view的处理函数
# 所有view处理函数都必须声明request参数
def helloworld(request:HttpRequest):
return HttpResponse('HelloWorld'.encode('utf-8'))
# 主路由
urlpatterns = [
path('admin/', admin.site.urls),
path('hello/',helloworld)
]
-
执行脚本
D:/大三下/Django/venv/Scripts/python.exe manage.py runserver (8000端口)
-
访问成功
Task2 Django的请求参数
上面说到,在view处理函数中我们应该用一个变量承接Http的请求,而从这个请求中我们应该要抽丝剥茧出其参数。请求参数包括请求头,请求方式,查询数据,表单参数,文件byte数据,请求路径,COOKIE等
获取方式, 在request加点后各种打印即可
模板传参,用字典的格式
def model_try(request:HttpRequest):
model_value = {
'name': '小王',
'id':3333333
}
# 提前配置setting里面的templates.dir
return render(request,'first_model.html', {'user':model_value})
# 主路由
urlpatterns = [
path('admin/', admin.site.urls),
path('hello/',helloworld),
path('model/',model_try)
]
<h5>
{{user}}
</h5>
{%for i in user%}
<h6>
{{i}}
</h6>
{% endfor %}
由此也可得出 Django的请求过程:
- 请求发送到url分发器
- urls根据路由规则(正则)分发到viewers
- views调用Model交互数据
- views将数据渲染到模板中
- 模板呈现给用户
然而在生产环境中一般不直接编辑主路由,而是将主路由url复制到子路由下面进行路由导向,同时函数一般卸载子路由的views通过中导包传入子路由
Task3 模型ORM
在使用ORM模型之前,首先要生成迁移文件,在执行迁移命令
-
数据库配置
DATABASES = { 'my_test': { # 说明你要连的库为mysql 'ENGINE': 'django.db.backends.mysql', # 数据库名称 'NAME': 'api_test', # IP 本地为127.0.0.1 'HOST':'127.0.0.1', # 端口默认是3306 oracel默认端口1521 'PORT':'3306', # 数据库用户 'USER':'xxx', # 数据库密码 'PASSWORD':'xxx@123' }
-
迁移
python manage.py makemigrations # 生成迁移文件 No changes detected python manage.py migrate # 开始迁移 Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK
-
一旦生成迁移文件迁移已成功,不要删除迁移文件
简单模型声明
更改apps中的models,自定义你需要的模型。
# app/model.py
# 创建一个玩家的模型
from django.db import models
# Create your models here.
class PlayerEntity(models.Model):
# 默认会生成ID, 不用自己写
virture_name = models.CharField(default = 'GodForever',max_length=20)
level = models.IntegerField(default = 1)
play_valu = models.FloatField(default=0.0)
# 设置存放的数据库表名
class Meta:
db_table = 'player_Inform'
# 生成迁移文件
(venv) D:\大三下\Django\venv\Scripts>python manage.py makemigrations
Migrations for 'test1':
study_Django\test1\migrations\0001_initial.py
- Create model PlayerEntity
# 迁移
(venv) D:\大三下\Django\venv\Scripts>python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, test1
Running migrations:
Applying test1.0001_initial... OK
在数据库中出现了迁移表,well Done
在子路由下获取数据:
# 父路由
# 父路由添加子目录
from django.urls import path,include
urlpatterns = [
# 子目录
path('son/',include('test1.urls'))
]
# 子路由
# 子路由导入刚刚创建的实体
from django.urls import path
from django.http import HttpRequest,HttpResponse
from django.shortcuts import render
from .models import PlayerEntity
def trying(request:HttpRequest):
Player = PlayerEntity.objects.all().values()
print(list(Player))
return render(request,'second_model.html', {'Player':Player})
urlpatterns = [
path('try2/',trying)
]
得到数据库中的结果, well done