1.Django请求生命周期流程图
1.路由层、视图层、模板层、模型层、组件、BBS项目

2.django路由层
1.路由匹配:
'''当我们输入一个地址时,接口后面的/不用输入,也可以自动跳转'''
django2.X以上版本,path第一个参数末尾可以不加/,django也会自动补全该接口。
django1.X版本:第一个参数是正则表达式,无法补全。
如果想取消django2.X以上版本的自动补全功能,需要在settings.py中加入:APPEND_SLASH = False。
2.转换器:
'''正常情况下很多网站都会有很多相似的网址,如果我们每一个都单独开发开设路由不合理'''
2.1当我们想在接口后面继续增加一个后缀时,我们可以在接口后面加上/<str:info>/,比如:path('index/<str:a>/', views.index)表示index/后面两个/之间输入任意字符串内容,该地址访问到的还是/index/地址,并且该字符串还能被index()函数接收到。index函数有两个参数:index(request,a),这个a表示的就是index/后面接收到的字符串(可以带数字)。

2.2/<int:num>/:匹配0或者任意正整数。


2.3其他匹配内容:
slug:匹配任意一个由字母或数字组成的字符串。
uuid:匹配格式化后的UUID。
path:能够匹配完整的URL路径
ps:还支持自定义转换器(自己写正则表达式匹配更加细化的内容)
3.正则匹配:
django2.X以上版本可以通过正则来匹配,需要提前导入模块re_path,第一个参数是正则。当我们在urls中写入一个接口,第一个参数只要能通过正则匹配到地址栏输入的接口,那么就可以匹配到该接口对应的功能能。


"""
但是不加任何符号匹配也有弊端,比如在urls中分别定义一个'test'和'testadd'的接口(test接口在上),那么我们能在地址栏输入/testadd/时,通过正则从上到下首先匹配到的是'test',所以我们匹配到的是test对应的功能,然后结束路由层的匹配,直接执行视图函数。想要解决该问题可以将接口改为re_path('test/', views.test)。或者是加上正则筛选条件:
urlpatterns = [
re_path('^test/$', views.test),
re_path('^testadd/$',views.testadd)
]
"""


4.正则匹配的无名有名分组:
4.1无名分组:re_path('test/(\d{4})/',views.test),会将括号内的正则匹配到的内容当做位置参数传递给视图函数。


4.2有名分组:re_path('func/(?P<num>\d{4})/(?P<var>\d{4})',views.function),会将括号内的正则匹配到的内容当做关键字参数传递给视图函数,所以视图函数在定义形参时需要将request以外的形参定义成<>内的名字。
'''无名、有名分组不能混用'''


3.反向解析
反向解析:在a标签中,如果一个路由经常变化,那么我们可以通过一个名字反向解析出一个结果,该结果可以直接访问到某个对应的路由,而不通过路由访问。
1.路由关系起别名基本语法:
path('login/', views.login, name='login_view')
<a href="{% url 'login_view' %}">home界面</a>
2.反向解析语法:
urls语法:path('login001/', views.login, name='login_view')
html页面上模板语法:<a href="{% url 'login_view' %}">home界面</a>
后端语法:reverse('login_view')
3.动态路由的反向解析
path('func1/<str:others>/', views.func1_func, name='func1_view')
html页面上模板语法:{% url 'func1_view' 'jason' %}
后端语法:reverse('func1_view', args=('嘿嘿嘿',))
4.路由分发
1.Django当中很多业务不只有一个应用,Django支持每个应用都可以有自己独立的路由层(urls)、静态文件、模板层。基于该特性多人开发项目就可以完全解耦合,之后利用路由分发还可以整合到一起。
2.在每个应用下建一个urls.py,该路由层只负责和本应用下的views中的功能连接。而总的urls负责和各个应用的urls连接。这样我们在访问地址时需要指明是哪个app,然后就可以访问到不同app下的功能。
3.此后我们访问app下的路由名就变成了:应用名/路由/。
app01:
urls:
urlpatterns = [
path('func/', views.func)
]
views:
def func(request):
return HttpResponse('from app01 func')
app02:
urls:
urlpatterns = [
path('func/', views.func)
]
views:
def func(request):
return HttpResponse('from app02 func')
总urls:
urlpatterns = [
path('admin/', admin.site.urls),
path('app01/', include('app01.urls')),
path('app02/', include('app02.urls'))
]


5.名称空间
1.如果我们在路由分发之后,需要在不同的app下面有相同的别名,可以通过名称空间反向解析出不同的应用前缀。
如果想要正常识别区分有两种方式
方式1:名称空间
总路由
path('app01/', include(('app01.urls', 'app01'), namespace='app01')),
path('app02/', include(('app02.urls', 'app02'), namespace='app02')),
反向解析
reverse('app01:index_view')
reverse('app02:index_view')
2.上述过程较为繁琐,我们可以直接在别名的前面加上app的名字。
app中urls:
urlpatterns = [
path('func/', views.func,name='app02_func_view')
]
app中views:
def func(request):
print(reverse('app02_func_view'))
return HttpResponse('from app02 func')
6.虚拟环境
1.在实际项目中,我们可能需要使用不同的django版本,因为下载模块需要消耗资源,为了节省资源,只给需要的项目配备适当的模块,所以我们需要使用虚拟环境。虚拟环境相当于一个解释的多个分身,每个解释器可以实现多个虚拟环境共存。每个分身可以有自己独立的环境。
2.pycharm创建虚拟环境:每创建一个虚拟环境就相当于重新下载了一个全新的解释器。
3.命令行的方式: python -m venv pyvenv38
4.在cmd窗口中将路径切换到Scripts目录下,输入dir查看所有文件。输入activate激活虚拟环境,输入deactivate关闭虚拟环境。当左侧出现虚拟文件目录名的时候说明虚拟环境已经激活。

"""
注意:python命令此处不支持多版本共存的操作,在命令行创建在python后面不支持写版本号,在环境变量中哪个解释器靠前就选择哪个解释器。想使用哪个解释器需要在解释器中把改路径排在前面。
"""
虚拟环境界面:

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!