【请求生命周期流程图】
1 django默认的网关接口 能够承受并发量很低 开发阶段用的!!! 2 wsgiref web服务器网关接口模块 主要作用:帮我们解析http请求数据格式,帮我们处理请求数据的格式!!! 3 4 uwsgi网关接口模块,程序上线之后用的!!! 5 6 两个模块都是基于WSGI协议开发的
PS:
缓存数据库:
提前已经将我们想要的数据准备好,直接拿来就可以,提高效率和响应时间
当我们在修改数据的时候,发现数据并不是立刻修改完成的,而是需要经过一段时间才会修改
。
。
【路由层】
(路由匹配)
1 urls.py 2 3 urlpatterns = [ 4 path('admin/', admin.site.urls), 5 # 路由匹配 6 path('test', views.test), 7 path('testadd', views.testadd) 8 9 ] 10 11 12 -------------------------------------------------------------------------- 13 views.py 14 15 def test(request): 16 return HttpResponse('test') 17 18 19 def testadd(request): 20 return HttpResponse('testadd') 21 22 然后访问页面,访问test页面,页面渲染的是test,但当访问testadd的时候,发现页面渲染的仍然是test,原因是: 23 24 url方法第一个参数是正则表达式:只要第一个参数正则表达式能够匹配到内容,那么就会立刻停止往下匹配,直接执行对应的视图函数。 25 26 解决:路由后面加/ 27 28 path('test/', views.test), 29 path('testadd/', views.testadd) 30 31 -------------------------- 32 但我们还发现当我们输入路由的时候,浏览器会自动给我们添加/ 33 34 原因:django内部帮我们做的重定向,一次匹配不行,url后面加/再来一次 35 解决: 36 取消自动加/(settings文件配置里添加) 37 APPEND_SLASH = False/默认是True 38 39 40
(django版本问题)
。
。
。
【有名无名分组】
(无名分组)
1 分组:就是将某一段正则表达式用小括号括起来 2 3 url() 4 5 6 re_path('^test/\d+/', views.test) 7 8 def test(request,xxx): 9 print(xxx) # 返回的是我输入的数字参数 10 return HttpResponse('test') 11 12 会将括号内正则匹配到的内容,当做位置参数!,传递给视图函数! 13 路由匹配成功后调用视图函数运行 test(实参request对象,括号内正则匹配到的内容) 14 15 16 ----------------------------- 17 注意:如果路由需要填写数字参数,则需要使用re_path,
正则表达式加括号就是分组!!!!
re_path('^test/(\d{4})/(.*?)/', views.test)
如果有两个分组,函数里面就要多加两个位置参数!!!
(有名分组)
1 可以给正则表达式起一个别名 2 3 有名分组(把正则分组后的东西,起个别名,正则表达式前面的?P<year>不影响\d{4}正则匹配) 4 re_path('^test/(?P<year>\d{4})/', views.test) 5 会将括号内正则匹配到的内容!,当做关键字参数!,传递给视图函数! 6 re_path('^test/(?P<year>\d{4})/(?P<others>).*?/', views.test) 7 路由匹配成功后调用视图函数运行 8 test(实参request对象,year='\d{4}匹配到的内容',others='.*?匹配到的内容')
ps:注意上述的分组不能混合使用!!!,但同一个分组可以使用N多次(re_path('^index/(\d+)/(?P<year>\d+)'))
.
。
。
【反向解析】
1 路由有时候根据需求可能会变,但是html页面上的比如a标签跳转的路由又是写死的情况下 2 如果大量的a标签都绑定了该固定的路由,此时改路由,a标签对应的绑定地址就全部要改!!! 3 这个时候就要用到反向解析!!!
通过一个名字可以反向解析出一个结果 该结果可以访问到某个对应的路由!!!
解决办法一:反向解析,路由与视图起一个别名name=''
第二种反向解析方法:使用reverse模块
from django.shortcuts import reverse
。
。
【有名无名分组反向解析】
总结:
1 无名分组反向解析 2 re_path(r'^index/(\d+)/', views.index, name='xxx') 3 前端 4 <a href="">{% url 'xxx' 123 %}</a> 5 后端 6 print(reverse('xxx', args=(1,))) 7 数字需要我们手动添加 8 这个数字写代码的时候应该放的是数据的是数据的主键值,数据的编辑和删除 9 re_path(r'^edit/(\d+)/', views.edit, name='xxx') 10 def edit(request,edit_id): 11 reverse('xxx', args=(edit_id,)) 12 13 14 {% for user_obj in user_queryset %} 15 <a href="{% url 'xxx' user_obj.id %}">{{ user_obj.name }}</a> 16 {% endfor %} 17 18 19 -------------------- 20 有名分组反向解析 21 re_path(r'^func/(?P<year>\d+)/', views.func, name='yyy') 22 前端写法: 23 <a href="{% url 'yyy' year=2019 %}">111</a> 24 或 25 <a href="{% url 'yyy' 2019 %}">222</a> 26 后端写法: 27 print(reverse('yyy',kwargs={'year':2019})) 28 或 29 print(reverse('yyy', args=(2019,)))
。
。
【路由分发】
1 路由分发就是做应用的整合!!! 2 比如一个大项目需要很多人,每个人写一个应用,每个人写的应用里面,各自有自己的路由与视图函数的对应关系 当每个人的应用都写好后。 3 这个时候作为领导只需要把自己建一个空的django项目,把每个人写好的应用代码全部拷贝进来,在settings里面注册一下,然后在项目的总路由里面做一个路由的分发,每个人写的应用就全部都连到一起去了!! 4 (创建的app中没有urls.py文件,需要我们自己手动创建) 5 --------------------------------------------------------------------- 6 --------------------------------------------------------------------- 7 django支持每个应用都可以有自己独立的路由层、静态文件、模板层。基于该特性多人开发项目就可以完全解耦合,之后利用路由分发还可以整合到一起 8 多个应用都有很多路由与视图函数的对应关系 这个时候可以拆分到各自的路由层中 9 使用路由分发之前 总路由直接干路由与视图函数的匹配 10 path('index/', index) 11 12 (问题:app01和app02分别是两个人写的,那我总的url里面怎么写呢) 13 利用路由分发之后,总路由不再干路由与视图函数的直接对应关系,而是做一个分发处理 14 识别当前url是属于哪个应用之下的,直接分发给对应的应用去处理
关键字:include
方式一:
方式二:
。
。
【名称空间】
(问题:当多个应用出现了相同的别名,我们研究反向解析会不会自动识别应用的前缀)
解决办法:
方式二:
1 方式2:别名不冲突即可!!! 用这个简单 2 将应用名作为别名的前缀!!! 3 就可以避免多个应用别名冲突的情况!!! 4 path('reg/', views.reg, name='app01_reg')
。
。
【虚拟环境】
1 不同的项目可能需要不同的模块!!!比如: 2 项目1需要使用的模块:django1.11 python38 3 项目2需要使用的模块:django2.22 pymysql requests python38 4 项目3需要使用的模块:django3.22 request_html flask urllib3 python38 5 ------------------------------------------------------ 6 要求: 7 实际开发项目中我们只会给项目配备所需的环境,不需要的一概不配!!! 8 因为我们下载的多余的模块是要消耗一定资源的!!!目的就是为了节省资源!!! 9 所以我们的需求是针对不同的项目,配备独有无二环境!!! 10 11 12 -------------------- 13 虚拟环境:能够针对相同版本的解释器创建多个分身,每个分身可以有自己独立的环境 14 ------------------------------------------------------ 15 pycharm创建虚拟环境:(每创建一个虚拟环境就相当于重新下载了一个全新的解释器) 16 命令行的方式: python -m venv pyvenv38 17 ------------------------------------------------------ 18 注意:python命令此处不支持多版本共存的操作 python27 python36 python38 19 要用哪个python解释器,就要把哪个解释器的路径,提到环境变量的最上面!!! 20 ------------------------------------------------------ 21 要先cd切换到虚拟环境的项目的script文件里面,在输入命令: 22 激活 23 activate 24 关闭 25 deactivate 26 ------------------------------------------------------ 27 换源下载模块的时候有时候可能需要在命令后面加一行--trusted-host mirrors.aliyun.com 28 告诉系统该源是可信任的!!! 29 pip install --index-url http://mirrors.aliyun.com/pypi/simple/ django==1.11.11 --trusted-host mirrors.aliyun.com
pip freeze > requirements.txt
导出项目模块文件
(pycharm中创建虚拟环境的步骤)
(因为解释器版本问题,创建的虚拟环境,有的venv文件是内置的,检查是否是在虚拟环境下,命令行输入
python -m venv --help,如果出现下列标志,则表示创建成功)
。
。
【django版本之间的区别】
1 【1】路由匹配规则 2 Django1.x路由层使用的是url方法 3 在Django2.x版本以后在路由层使用的是path方法 4 url() 第一个参数支持正则 5 path() 第一个参数不支持正则,写什么就匹配到什么 6 【2】正则匹配规则 7 在Django2.x以后也可以使用正则表单式,但是使用的方法是re_path 8 from django.urls import path, re_path re_path(r'^fuc/(?P<year>\d+)', views.func) # 等价于 url(r'^fuc/(?P<year>\d+)', views.func) 9 【3】转换器 10 str 11 匹配除了 '/' 之外的非空字符串。 12 如果表达式内不包含转换器,则会默认匹配字符串。 13 int 14 匹配 0 或任何正整数。返回一个 int 。 15 slug 16 匹配任意由 ASCII 字母或数字以及连字符和下划线组成的短标签。 17 比如,building-your-1st-django-site 。 18 uuid 19 匹配一个格式化的 UUID 。为了防止多个 URL 映射到同一个页面,必须包含破折号并且字符都为小写。 20 比如,075194d3-6885-417e-a8a8-6c931e272f00。返回一个 UUID 实例。 21 path 22 匹配非空字段,包括路径分隔符 '/' 。 23 它允许你匹配完整的 URL 路径而不是像 str 那样匹配 URL 的一部分。 24 【4】自定义转换器 25 Django支持自定义转换器 26 自定义转换器示例: 27 28 在app01下新建文件path_ converters.py,文件名可以随意命名 29 30 Copyclass MonthConverter: regex='\d{2}' # 属性名必须为regex def to_python(self, value): return int(value) def to_url(self, value): return value # 匹配的regex是两个数字,返回的结果也必须是两个数字 31 在urls.py中,使用register_converter 将其注册到URL配置中: 32 33 Copyfrom django.urls import path,register_converter from app01.path_converts import MonthConverter # 先注册转换器 register_converter(MonthConverter,'mon') from app01 import views urlpatterns = [ path('articles/<int:year>/<mon:month>/<slug:other>/', views.article_detail, name='aaa'), ] 34 views.py中的视图函数article_detail 35 36 Copyfrom django.shortcuts import render,HttpResponse,reverse def article_detail(request,year,month,other): print(year,type(year)) print(month,type(month)) print(other,type(other)) print(reverse('xxx',args=(1988,12,'hello'))) # 反向解析结果/articles/1988/12/hello/ return HttpResponse('xxxx') 37 测试 38 39 Copy# 1、在浏览器输入http://127.0.0.1:8000/articles/2009/12/hello/,path会成功匹配出参数year=2009,month=12,other='hello'传递给函数article_detail # 2、在浏览器输入http://127.0.0.1:8000/articles/2009/123/hello/,path会匹配失败,因为我们自定义的转换器mon
分类:
django
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现