Django-路由层

1.Django请求生命周期流程图

1.路由层、视图层、模板层、模型层、组件、BBS项目

2.django路由层

1.路由匹配:
'''当我们输入一个地址时,接口后面的/不用输入,也可以自动跳转'''
	django2.X以上版本,path第一个参数末尾可以不加/,django也会自动补全该接口。
	django1.X版本:第一个参数是正则表达式,无法补全。
	如果想取消django2.X以上版本的自动补全功能,需要在settings.py中加入:APPEND_SLASH = False2.转换器:
'''正常情况下很多网站都会有很多相似的网址,如果我们每一个都单独开发开设路由不合理'''
	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>  # 点击home界面就可以直接访问到login/路由对应的功能

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后面不支持写版本号,在环境变量中哪个解释器靠前就选择哪个解释器。想使用哪个解释器需要在解释器中把改路径排在前面。
"""
虚拟环境界面:

posted @   ERROR404Notfound  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
Title
点击右上角即可分享
微信分享提示