今日学习内容
用户管理系统(单表)
1.浏览器想要某个服务需要发送一个请求以HTTP协议规定的格式发送给web服务网关接口。 2.wsgiref和uwsgi是实现WSGI协议的两个模块 3.中间件是外部进入django的第一层,维护django安全的插件 4.模型层是链接数据库,数据由路由层到视图层,使用模板语法向模板层索要数据后返回然后模板语法去渲染,然后模板语法通过模型层(类)索要数据库数据后面再由视图层返回到路由层,最后响应给浏览器。
path('网址后缀', 函数名):一旦网址后缀匹配上了就会自动执行后面的函数,并结束整个路由匹配。
默认我们在浏览器页面也不写斜杠,django会自动做第二次处理。 第一次匹配不上,会让浏览器加斜杠再次请求。 django配置文件中可以指定是否自动添加斜杠。 APPEND_SLASH = False
作用:当网址后缀不固定的时候,可以使用转换器来匹配。django2.0版本以上才有转换器。 转换器支持的数据类型: 'int':IntConverter(); 'path':PathConverter(); 'slug':SlugConverter(); 'str':StringConverter(); 'uuid':UUIDConverter(); path('func/<int:year>/<str:info>', views.finc) # func(request,year=int(后缀)) 视图函数需要传入一个默认值形参。 转换器匹配到的内容会当做视图函数的关键字参数传入。 转换器里有几个,则传入视图函数的形参就要一一对应。 def func(request, year, info): pass
re_path(正则表达式,函数名) 一旦网址后缀的正则能够匹配到内容就会自动执行后面的视图函数,并且结束整个路由的匹配。 re_path('^test/$', views.test) '^'表示匹配头部、'$'表示匹配尾部
正则匹配之无名分组
re_path('^test/(\d+)/', views.test) '()' 表示分组 正则表达式匹配到的内容会当做视图函数的位置参数传递给视图函数
正则匹配之有名分组
re_path('^test/(?P<year>\d+)/(?P<others>.*?)/', views.test) 正则表达式匹配到的内容会当做视图函数的关键字参数传递给视图函数
在django1.11中,只支持正则匹配并且方法是url() django2,3,4中 path() re_path() 等价于 url()
对于页面上的路由,我们可能会改变,一旦改变会导致所有页面相关的链接失效。
为了防止这种问题发生,我们需要使用反向解析。
反向解析就是返回一个结果,该结果可以访问到对应的路由。
path('register/', views.reg, name='reg_view')
html页面 {% url 'reg_view' %} 后端 from django.shortcuts import reverse reverse('reg_view') 反向解析的操作三个方法都一样 path() re_path() url()
'''settings.py''' path('reg/<str:info>/', view.reg, name='reg_view') 当路由中有不确定的匹配因数,反向解析的时候需要人为给出一个具体的值。 '''views.py''' reverse('reg_view', args=('xz',)) '''xxx.html''' {% url 'reg_view' 'xz'%}
django中应用都可以有自己独立的 urls.py template文件夹 static文件夹 能够让基于django开发的多个应用彼此独立,便于管理和小组开发。
path('app01/', include('app01.urls')), path('app02/', include('app02.urls')), 通过总路由分发到各个应用的路由。总路由相当于做转接线,通过总路由找到各自子路由。
path('after/', views.after) path('after', views.after) 对于项目特别大,应用多的时候可以用路由分发。
对于路由分发下有多个应用在涉及到反向解析起别名时有冲突,无法正常解析有两种解决方法。 解决方案1: 可以利用名称空间 namespace path('app01/', include(('app01.urls', 'app01'),namespace='app01')) path('app01/', include(('app01.urls', 'app02'),namespace='app02')) 解决方案2: 别名不冲突 保证django项目下没有重复的别名。