django路由层
django请求生命周期流程图
django路由层
1.路由匹配
django1.X版本路由的第一个参数是正则表达式
django2.X及以上版本的则是path写什么就匹配什么
# 无论什么版本的django都自带加斜杠后缀的功能,我们可以把这个功能手动取消
取消自动加斜杠后缀功能
配置文件中加 APPEND_SLASH = False # 默认为True,且不在配置文件中显示
2.转换器
将对应位置匹配到的数据转换成固定数据类型
正常情况下一个网站会有很多相似的网址,如果每个都开一个路由的话太累了,所以就有了转换器
django2.X及以上版本路由的动态匹配有转换器
五种转换器
str:匹配除路径分隔符外所有的非空字符串
int:匹配0或者任意正整数
slug:匹配任意一个由字母或数字组成的字符串
uuid:匹配格式化之后的UUID
path:匹配完整的URL路径
# 这五种转换器中常用的就是str和int,除了这五种转化器我们还可以自定义转换器(就是自己写一个正则表达式)
eg:
path('index/<str:info>/', views.index_func),
# index_func(实参request对象,info='经过转换器转换过的匹配内容') info就相当于关键字传参
3.正则匹配
django2.X级以上版本有re_path,第一个参数是正则表达式
正则匹配的本质是只要第一个正则表达式能够从用户输入的路由中匹配到对应的数据就匹配成功(无论用户输入了什么),
会立刻停止匹配直接执行对应的视图函数
eg:
re_path('^test/$', views.test) # 只匹配路由为test/的路由
# django1.X路由匹配使用的是url(),功能与django2.X及以上的re_path()一致
4.正则匹配的无名有名分组
无名分组
re_path('^test/(\d{4})/', views.test) # 将括号内正则匹配到的内容当做位置参数传递给视图函数
有名分组
re_path('^test/(?P<year>\d{4})/', views.test) # 对括号内的正则表达式起一个别名
# 将括号内的正则匹配到的内容与别名组成关键字参数传递给视图函数,year='正则匹配到的内容'
注意: 无名分组与有名分组不能混合使用
反向解析
通过一个名字可以反向解析出一个结果,该结果可以访问到某个对应的路由
基本使用
1.路由匹配关系起别名
path('login_01', views.login, name='login_view')
2.反向解析语法
html页面模板语法 {% url 'login_view' %}
后端语法 reverse('login_view')
动态路由的反向解析
path('func1/<str:others>/', views.func1_func, name='func1_view')
html页面上模板语法 {% url 'func1_view' 'jason' %} # 需要一个参数与接收到的路由的第二个参数对应
后端语法 reverse('func1_view', args=('嘿嘿嘿',))
路由分发
django支持每个应用都可以有自己的路由层、静态文件、模板层,基于这个特性我们可以实现多人开发,每个人负责一个应用,之后通过路由分发整合到一起
简单来说路由分发就是 不同应用中有相同的路由可以通过路由分发来避免冲突
应用内的路由层我们可以称之为干路由,它是负责与视图函数的匹配
path('index/', views.index)
dajngo项目的路由层称之为总路由,负责分发路由,按照应用名分配匹配方向
path('app01/', include('app01.urls'))
名称空间
路由分发之后默认情况下相同的别名是不能直接反向解析识别出应用前缀的
如果想要能够识别有两种方式
方式一:名称空间 # 在总路由中添加不同的名称空间
干路由app01和app02中都有
path('index/', views.index, name='indes_view')
总路由
path('app01/', include('app01.urls', 'app01'), namespace='app01'),
path('app02/', include('app02.urls', 'app02'), namespace='app02')
反向解析
reverse('app01:index_view')
reverse('app02:index_view')
方式二:起不同的别名 # 可以使用应用名作为前缀
path('index/', views.index, name='app01_indes_view')
path('index/', views.index, name='app02_indes_view')
虚拟环境
在实际开发项目中我们只会给项目配备需要的环境,不需要的一律不配
正常情况下解释器只有一个,没办法满足实际需要,这个时候就有了虚拟环境,就是创建一个解释器的分身,该分身可以有自己独立的环境,这样我们就可以给不同的项目配备不同的环境
pycharm创建虚拟环境:见图一(每创建一个虚拟环境就相当于重新下载了一遍解释器)
在pycharm中下载模块可能需要执行一下下面这个命令
pip install --index-url http://mirrors.aliyun.com/pypi/simple/ django==1.11.11 --trusted-host mirrors.aliyun.com
命令行创建虚拟环境:
python -m venv pyvenv38 # 这里不支持多版本解释器共存的操作,以环境变量中的先后顺序为准,谁在上面就是谁,最后一个pyvenv38是我们自己起的虚拟环境的名字
激活
activate # 进到虚拟环境目录下再执行
关闭
deacticate
图一