随笔 - 149,  文章 - 0,  评论 - 0,  阅读 - 12191

【请求生命周期流程图】

 

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
复制代码

 

 




posted on   认真的六六  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
点击右上角即可分享
微信分享提示