路由系统
路由系统
本质上:URL和函数的对应关系。
传统的路由
from django.contrib import admin
from django.urls import path
from apps.web import views
urlpatterns = [
path('home/', views.home),
path('news/<int:nid>/edit/', views.news),
path('article/', views.article),
]
from django.shortcuts import render, HttpResponse
def home(request):
return HttpResponse("成功")
def news(request, nid):
print(nid)
page = request.GET.get("page")
return HttpResponse("新闻")
def article(request):
nid = request.GET.get("nid")
print(nid)
return HttpResponse("文章")
- int,整数
- str,字符串 /
- slug,字母+数字+下滑线+-
- uuid,uuid格式
- path,路径,可以包含 /
正则表达式路由
- 在django1版本用的多。
- 在django2+版本用的少
路由分发
假如:200个功能。
inlucde + app(一般),将功能拆分不到不同的app中。
手动路由分发,可以与app无关。
path('user/add/', views.login),
path('user/delete/', views.login),
path('user/edit/', views.login),
path('user/list/', views.login),
path('user/', ([
path('add/', views.login),
path('delete/', views.login), # /user/delete/
path('edit/', views.login),
path('list/', views.login),
], None, None)),
纯粹帮助提取功能的URL,防止重复编写。
路由分发的本质:
-
URL对应函数
path('user/add/', views.login),
-
URL对应元组
path('user/add/', (元素,appname元素,namespance元素) ),
path('user/add/', include("apps.api.urls") ), path('user/add/', ([],None,None) ),
小结
-
include或手动元组列表,本质相同。
-
应用场景和意义,想要把一些URL前缀提取出来。
path('user/add/', views.login), path('user/delete/', views.login), path('user/edit/', views.login), path('user/list/', views.login), path('user/', ([ path('add/', views.login), path('delete/', views.login), # /user/delete/ path('edit/', views.login), path('list/', views.login), ], None, None)), path('users', include(([ path('add/', views.login), path('delete/', views.login), # /user/delete/ path('edit/', views.login), path('list/', views.login), ], None))), include("apps.api.urls") # 一般是每个app中urls urlpatterns = [ ]
name
给一个路由起个名字 + 根据名字反向生成URL。
urlpatterns = [
path('login/', views.login),
]
# 很多功能,很多URL
urlpatterns = [
path('login/', views.login, name="v1"),
path('auth/', views.auth, name="v2"),
]
有了名字后,以后一般有两处会用到:
-
在视图函数中生成URL
from django.urls import reverse url = reverse("v2") # /auth/ url = reverse("v1") # /login/
-
HTML模板,页面上有一个a标签,添加xx。
<a href="/xxx/xxx/xx/">添加</a>
<a href="{% url 'v1' %}">添加</a> <a href="{% url 'v2' %}">添加</a>
-
扩展
以后做权限管理,让name属性配合。
namespace
辅助name。
-
主路由
from django.urls import path, re_path, include # 很多功能,很多URL urlpatterns = [ path('api/', include("apps.api.urls",namespace='x1')), path('web/', include("apps.web.urls",namespace='x2')), ]
-
api/urls.py
from django.urls import path, re_path from . import views # 很多功能,很多URL urlpatterns = [ path('login/', views.login,name="login"), path('auth/', views.auth, name='auth'), ]
-
web/urls.py
from django.urls import path, re_path from . import views # 很多功能,很多URL urlpatterns = [ path('home/', views.home,name='home'), path('order/', views.order,name='order'), path('auth/', views.order, name='auth'), ]
以后再某个URL或者视图中反向生成:
from django.urls import reverse
url = reverse("x1:login") # /api/login/
url = reverse("x1:order") # /web/login/
url = reverse("x1:auth") # /api/login/
url = reverse("x2:auth") # /web/login/
两个扩展:
-
namespace需要设置app_name
urlpatterns = [ path('api/', include("apps.api.urls", namespace='x1')), ]
from django.urls import path, re_path from apps.api import views # 很多功能,很多URL urlpatterns = [ path('login/', views.login, name="login"), path('auth/', views.auth, name='auth'), ] app_name = "api"
-
手动分发
赠送:
最后的/如何解决?
APPEND_SLASH = True
path('login/', views.login),
http://127.0.0.1:8000/login/ 成功
http://127.0.0.1:8000/login django,重定向301
http://127.0.0.1:8000/login/ 成功
path('login', views.login),
http://127.0.0.1:8000/login 成功
http://127.0.0.1:8000/login
http://127.0.0.1:8000/login/ 失败
APPEND_SLASH = False
path('login/', views.login),
http://127.0.0.1:8000/login/ 成功
http://127.0.0.1:8000/login 失败
path('login', views.login),
http://127.0.0.1:8000/login/ 失败
http://127.0.0.1:8000/login 成功
当前匹配对象
有什么用呀?
某用户,具有一些权限。 permissions = ["xx","login",'account']
某用户,具有一些权限。 permissions = ["login",'account']
本文作者:Sherwin
本文链接:https://www.cnblogs.com/sherwin1995/p/17401985.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步