django路由层 虚拟环境

简介: 路由匹配(正则匹配 动态匹配) 反向解析(动态反向解析)路由分发 与虚拟环境的创建方法

django请求生命周期流程图

image

django的请求周期分布解析

python
1.浏览器
	发送请求(HTTP协议)

2.web服务网关接口
	1.请求来的时候解析封装
		响应走的时候打包处理

	2.django默认的wsgiref模块不能承受高并发 最大只有1000左右
		上线之后会替换成uwsgi来增加并发量
	
	3.WSGI跟wsgiref和uwsgi是什么关系
		WSGI是协议
		wsgiref和uwsgi是实现该协议的功能模块

3.django后端
	1.django中间件(暂时不考虑 后面讲)
		
		
	2.urls.py  路由层
		识别路由匹配对应的视图函数,路由匹配,正则匹配,反向解析动态反向解析
	
	3.views.py	视图层
		网站整体的业务逻辑
		
	4.templates文件夹		模版层
		网站所有的html文件
	
	5.models.py			   模型层
		ORM
额外扩展:缓存数据库的作用
缓存数据库

缓存数据库: 提前已经将你想要的数据准备好了 你来直接拿就可以 提高效率和响应时间

django路由层

路由匹配

django 2.x 版本以上 path第一个参数写什么就会匹配什么
path('admin/', 视图函数)
"我们在网址栏输入的时候并没有填写/ django 会帮我挨个匹配如果没有匹配上的情况下,会自动加上 / 进行二次匹配"

django 1.x  第一个参数是正则表达式
无论什么版本django都有会自动加 /后缀 匹配的功能
# 可以在settings里关闭该功能
 APPEND_SLASH = False
 开启就是 True

转换器

​ 将对应位置匹配到的数据转换成固定的数据类型

一个网站内部的各种页面的都是有很多相似的网址,我们每一个都开一个路由不合理。可以使用转换器进行动态匹配

django2.x 及以上版本一共有五种转换器

str: 匹配除路径分隔符外的任何非空字符
int: 匹配0或任意正整数
slug:匹配任意一个由字母或数字组成的字符串。
uuid:匹配格式化后的UUID。
path:能够匹配完整的URL路径
ps:还支持自定义转换器(自己写正则表达式匹配更加细化的内容) 

代码

path('index/<str:info>/',views.index_func)
info会自动把匹配到的数据传给函数index_func
# 注意这里自动把匹配到的内容会传到函数内,所以需要2个形参 第一个 request 第二个 info
"使用此种方法都是  关键字参数"

组合使用
path('index/<str:info>/<int:id>'views.index_func)
2种转换器 函数除了需要request之外 还需要 关键字参数 info与id

正则匹配

django 2.x 及以上的版本有 re_path 模块 第一个参数是正则。

​ 本质是只要第一个正则表达式能够从用户输入的路由中匹配到数据对应的数据就算匹配成功,如果后面有该数据以外的数据 还是会会立刻停止路由层其他匹配直接执行对应的视图函数

为了避免可以添加开头与结尾匹配

re_path('^test/$',views.test)
必须匹配到test/ 才可以执行对应的视图函数
django1.x 版本使用的是url()  功能与django 2.x及以上版本的re_path() 方法一致
无名分组与有名分组

无名分组

re_path('^test/\d{4}/',views.test)
在不分组的情况下匹配并不会报错
re_path('^test/(\d{4})/',views.test)
# 分组后会报错,会将分组内的正则表达式匹配到的内容当做位置参数传给 视图函数。

有名分组

re_path('test/(?P<year>\d{4}/)',views.test)
# 会将分组的正则表达式匹配到的内容当做关键字参数year="匹配到的内容"传给视图函数

注意:

无名分组与有名分组不能混合使用。

反向解析

正常情况下我们需要获取到路由才能去执行视图函数,如果路由需要经常更换那么我们就需要反复的去修改 路由关系。太过繁琐

反向解析就是通过 一个名字可以反向解析出一个结果,该结果可以访问到某个对应的路由,类似于静态文件中的动态解析

基本使用

路由关系起别名
path('login001/',views.login, name = 'login_view')

<a href="{% url 'login_view'%}">12</a> # 可以通过login_view 动态的解析到该关系的匹配内容

反向解析语法

html页面上模板语法	{% url 'login_view' %}

后端语法 
#导入reverse模块 和三板斧属于一个模块
reverse('login_view')

动态路由的反向解析

动态匹配的路由进行反向解析的结果,可以访问该路由的结果有N多个. 因此我们需要提前告诉他解析成什么。

path('func1/<str:others>/', views.func1_func, name='func_view')
路由后面的动态匹配是接收用户输入的字符并需要传给视图函数 是一个关键字others参数= ‘用户输的’ 

htrml 页面上的语法结构
 {% url 'func1_view' 'jason' %}
后端语法		 
reverse('func1_view', args=('嘿嘿嘿',))    

路由分发

​ 路由分发是用于在多人开发项目,在多人开发项目时不可能每个人都在路由层加入对应关系,应当每个人都有自己独立的路由层,静态文件,模板层。

​ 此时每个人app的路由层称为子路由

​ django项目下的路由层称为总路由

​ 多个应用都有很多和路由与视图函数对应的关系,可以拆分到各个app里路由层中,当多个app开发完成后 进行整合后,只需要在总路由层按照应用名分配 匹配关系。

路由分发前 总路由直接与视图函数进行匹配
path('login/',login_view)

路由分发准备
在个app下创建urls.py 复制总路由的代码放在其中,删掉admin模块 与admin path

路由分发后 总路由按照应用名分配匹配方向
"关键字 include"
path('应用名/',include('应用名.urls'))  
"应用名根据具体业务来起名" 

名称空间

路由分发后根据相同的别名 默认是不能无法直接识别应用前缀的。

解决方法

# 1.利用名称空间的概念
	总路由层中:   "namespace 名称空间"
    path('app01/',include(('app01.urls','app01'), namespace='app01')),
    path('app02/',include(('app02.urls','app02'), namespace='app02')),
    通过反向解析可以得出是哪个app下的哪个视图函数
    reverse('app01:app1_login_view')
    reverse('app02:app2_login_view')

​ 可以看出上述方法过于繁琐,在我们日常工作中不同应用应该规定 别名不能冲突,如何让别名不冲突最好的方法就是 使用应用名作为别名的前缀

# 2.不同的别名
path('login/', views.index, name ='app01_login_view')
path('login/', views.index, name ='app02_login_view')

简单便捷

虚拟环境

工作中可能会遇到不同的项目需要不同版本的django ,我们不可能每次都去把django 删除去下载对应的版本。

可以使用虚拟环境来给项目下载该项目所需要使用的环境(各种模块),不需要使用的不用配备。

虚拟环境:就是用来针对相同版本的解释器 可以创建多个分身,每个都可以拥有独立的环境。(即各种版本的django模块)

创建虚拟环境的方法

pycharm 中 
点击File 选择New porject 

image

等待即可

cmd命令行方式创建虚拟环境

打开cmd
注意: 不支持多版本共存需要调整环境变量顺序或者进入 该版本的python目录下
python -m venv xuni1  # 没有提示就说明创建成功

"激活"  # 进入该xuni1 文件目录下的Scripts 进行激活
	activate 输入该指令自动进入xuni1 环境下
 # 有多个activate版本对应不同的系统
"关闭"
	deactivate 输入该指令退出
 
使用pip下载django中可能会报错
pip install --index-url http://mirrors.aliyun.com/pypi/simple/ django==1.11.11 --trusted-host mirrors.aliyun.com
 在后缀下加上 --trusted-host mirrors.aliyun.com 即可下载
posted @ 2022-12-12 21:32  李阿鸡  阅读(47)  评论(0编辑  收藏  举报
Title