django orm表关系创建
1.表关系判断
2.orm外键字段创建
"""
to后面既可以写字符串也可以直接写类名
如果直接写类名一定要确保该类出现在代码的上方
"""
models.ForeignKey(to=‘表名‘)
models.OneToOneField(to=‘表名‘)
上述两个自动加_id后缀
models.ManyToManyField(to=‘表名‘)
虚拟字段自动创建第三张关系表
浏览器
web服务网关接口
wsgiref模块 uwsgi模块 WSGI协议
django后端
django中间件
路由层
视图层
模板层
模型层
关系型数据库
缓存数据库
路由层之路由匹配
url(正则表达式,函数内存地址)
?
1.路由匹配的本质
只要能够匹配到内容就算符合规则
直接执行对应的视图函数
2.自动添加斜杠
django后端重定向
APPEND_SLASH = True
无名分组
给正则表达式加括号分组
匹配到内容之后会将括号内正则表达式匹配到的内容当做位置参数传递给视图函数
url(r‘^index/(\d+)/‘,views.index) # index(request,内容)
有名分组
给正则表达式加括号并且起别名分组
匹配到内容之后会将括号内正则表达式匹配到的内容当做关键字参数传递给视图函数
url(r‘^index/(?P<user_id>\d+)/‘,views.index) # index(request,user_id=内容)
补充
无名有名不能混合使用
单个情况下可以重复使用
反向解析
"""
先给路由匹配起别名 之后根据别名反向解析出一个结果
该结果可以匹配到对应的url并执行视图函数
"""
url(r‘^login/‘,views.login,name=‘login_view‘)
前端
{% url ‘login_view‘ %}
后端
from django.shortcuts import reverse
url = reverse(‘login_view‘)
redirect(‘login_view‘)
无名有名反向解析
路由分发(分组开发)
名称空间(了解)
伪静态页面
虚拟环境(实际开发使用较多)
视图层(三板斧、JsonResponse、form表单、CBV)
url(r‘^login/(\d+)/‘,views.login,name=‘login_view‘)
reverse(‘login_view‘,args=(1,))
{% url ‘login_view‘ 1 %}
# 数字只要能够让\d+匹配到就可以 在实际项目中一般都是动态获取
?
?
url(r‘^reg/(?P<user_id>\d+)/‘,views.reg,name=‘reg_view‘)
reverse(‘reg_view‘,kwargs={‘user_id‘:666})
{% url ‘reg_view‘ user_id=123 %}
?
"""无论是无名分组还是有名分组的反向解析都可以使用一样的格式"""
url(r‘^reg/(?P<user_id>\d+)/‘,views.reg,name=‘reg_view‘)
reverse(‘reg_view‘,args=(123,))
{% url ‘reg_view‘ 123 %}
项目需求:反向解析完成用户的编辑与删除
编辑功能
1.选开设一个编辑数据的url接口
2.思考如何携带用户想要编辑的数据的主键值
有名分组
3.查询出用户想要编辑的数据展示给用户看
删除功能
1.思考如何携带用户想要编辑的数据的主键值
无名分组
2.获取数据主键值并删除
当django的app特别多的时候 一个urls.py太过冗余
在django中每一个app都可以拥有自己的urls.py static文件夹 templates文件夹
路由分发
总路由不再做url与视图函数直接匹配
而是先根据url分辨出请求哪个业务
之后分配给下面的app再去匹配视图函数
复杂版本
from app01 import urls as app01_urls
from app02 import urls as app02_urls
url(r‘^app01/‘,include(app01_urls)),
url(r‘^app02/‘,include(app02_urls)),
简化版本
url(r‘^app01/‘,include(‘app01.urls‘)),
url(r‘^app02/‘,include(‘app02.urls‘)),
# 子路由还是按照之前总路由的写法
多个应用在反向解析的时候出现了别名冲突的情况
django是无法做到一一对应的 >>>名称空间
url(r‘^app01/‘,include(‘app01.urls‘,namespace=‘app01‘)),
url(r‘^app02/‘,include(‘app02.urls‘,namespace=‘app02‘)),
reverse(‘app01:index_view‘)
reverse(‘app02:index_view‘)
{% url ‘app01:index_view‘ %}
{% url ‘app02:index_view‘ %}
# 名称空间其实也可以不需要使用
只需要确保多个应用之间别名也不冲突的情况
eg:起别名的时候加上应用名前缀
静态页面 页面上的数据一般都是直接写死的 伪静态页面 目的是为了提升网页被SEO查询出来的概率 如何优化都干不过RMB玩家 """所有的搜索引擎都是爬虫程序"""
针对不同的项目配置专属的解释器环境
项目1
pymysql
django
项目2
flask
jinja2
项目3
tornado
websocket
虚拟环境
能够在一台计算机上给不同的项目配置专属的解释器环境
django1.X与django2.X、django3.X区别
1.路由层
1.X使用的url方法
2.X和3.X使用的path方法
‘‘‘url第一个参数是正则表达式 path第一个参数不支持正则‘‘‘
from django.urls import path,re_path
‘‘‘如果还想使用正则 可以考虑re_path与url一模一样‘‘‘
path还支持五种默认的转换器(自动帮你转换数据类型)
并且还支持自定义转换器
str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
int,匹配正整数,包含0。
slug,匹配字母、数字以及横杠、下划线组成的字符串。
uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
path,匹配任何非空字符串,包含了路径分隔符(/)(不能用?)
class MonthConverter:
regex=‘\d{2}‘ # 属性名必须为regex
def to_python(self, value):
return int(value)
def to_url(self, value):
return value # 匹配的regex是两个数字,返回的结果也必须是两个数字数字
register_converter(MonthConverter,‘mon‘)
from app01 import views
urlpatterns = [
path(‘articles/<int:year>/<mon:month>/<slug:other>/‘, views.article_detail, name=‘aaa‘),
]
2.模型层
1.X模型层创建外键的时候默认就是级联更新级联删除
2.X和3.X需要通过参数自己指定
1.小白必会三板斧
HttpResponse
render
redirect
# 视图函数必须返回一个HttpResponse对象
2.JsonResponse
# 锻炼思维
import json
from django.http import JsonResponse
def index(request):
d = {"username":‘jason高大威武‘,‘password‘:123}
# res = json.dumps(d,ensure_ascii=False)
# return HttpResponse(res)
l = [11,22,33,44,55]
# return JsonResponse(d,json_dumps_params={‘ensure_ascii‘:False})
return JsonResponse(l,safe=False)
1.利用反向解析完成用户数据的增删改查
2.自行百度模型层区别、同步异步框架
利用2或者3版本做表关系创建
3.拔高题
from datetime import datetime
import json
# 自己写一个类 替换掉cls
d = {‘t1‘:datetime.today()}
res = json.dumps(d)
print(res)
原文:https://www.cnblogs.com/chijintao/p/14797455.html