路由系统
路由系统
本质上: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']

 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号