路由相关

路由分发

image-20230709093829993

研究django admin源码时:

image-20230709094405280

namespace是什么?

  • 无namespace

    from django.urls import reverse
    
    url = reverse("v2")
    print(url)
    
  • 有namespace

    from django.urls import reverse
    
    url = reverse("namespace名称:v2")
    print(url)
    
    url = reverse("namespace名称:namespace名称:v2")
    print(url)
    

问题:什么叫反向生成?

path('login/login/login/login/', views.login, name='login'),

路由本质

关于导入和反射

  • 反射,以字符串的形式去操作对象中的成员。
  • 导入模块

image-20230709100509130

image-20230709100752081

image-20230709100904502

include源码

urlpatterns = [
    path('login/', views.login),
    path('api/', include("apps.base.urls")),
    path('api/', (
        import_module("apps.base.urls"),              # 模块对象 from app.base import urls
        None, 
        None)
    )
]
urlpatterns = [
    path('login/', views.login),
    
    path('api/', include("apps.base.urls")),
    path('api/', (
        import_module("apps.base.urls"),              # 模块对象 from app.base import urls
        None, 
        None)
    ),
    
    path('web/', (
        [
        	path('v1/', www_views.login, name='v1'),
        	path('v2/', www_views.login, name='v2'),
		], 
        None, 
        None)
	),
]

在path执行时,传入的参数种类:

  • 网址 + 函数

  • 网址 + (模块对象,None,None)

    urlpatterns = [
    	...
    ]
    
  • 网址 + (列表,None,None)

path源码

  • 网址 + 函数

    path('login/', views.login),
    
    URLPattern(
        RoutePattern("login/", name=None, is_endpoint=True), 
        views.login, 
        None, 
        None
    )
    
  • 网址 + (模块对象,None,None)

    path('api/', include("apps.base.urls")),
    path('api/', (
        import_module("apps.base.urls"),              # 模块对象 from app.base import urls
        None, 
        None)
    ),
    
    URLResolver(
        RoutePattern('api/',name=None,is_endpoint=False),
        import_module("apps.base.urls"),              # 模块对象 from app.base import urls
        None,
        app_name=None,
        namespace=None
    )
    
  • 网址 + (列表,None,None)

    path('web/', (
        [
            path('v1/', www_views.login, name='v1'),
            path('v2/', www_views.login, name='v2'),
        ], 
        None, 
        None)
    )
    
    URLResolver(
        RoutePattern('api/',name=None,is_endpoint=False),
    	[
            path('v1/', www_views.login, name='v1'),
            path('v2/', www_views.login, name='v2'),
        ], 
        None,
        app_name=None,
        namespace=None
    )
    

所有URL用类和对象嵌套的形式实现:

from django.urls import path, re_path, include
from apps.www import views

from django.urls import URLPattern, ResolverMatch
from django.urls.resolvers import RoutePattern
from importlib import import_module
from apps.www import views as www_views
from django.urls.resolvers import URLResolver

urlpatterns = [
    URLPattern(
        RoutePattern("login/", name=None, is_endpoint=True),
        views.login,
        None,
        None
    ),
    URLResolver(
        RoutePattern('api/', name=None, is_endpoint=False),
        import_module("apps.base.urls"),  # 模块对象 from app.base import urls
        None,
        app_name=None,
        namespace=None
    ),
    URLResolver(
        RoutePattern('web/', name=None, is_endpoint=False),
        [
            path('v1/', www_views.login, name='v1'),
            path('v2/', www_views.login, name='v2'),
        ],
        None,
        app_name=None,
        namespace=None
    )
]

路由匹配源码

1.请求来了

image-20230709105857591

2.路由匹配

image-20230709110040137

image-20230709110114113

image-20230709110212557

3.匹配过程

image-20230709112759005

答疑:多个app的时候,路由分发到不同的app里,如果1个app,有100个路由,能不能按大类功能进行分组。

path('api/user/login/', views.login, name='login'),
path('api/user/logout/', views.login, name='login'),
path('api/user/order/', views.login, name='login'),
path('api/user/info/', views.login, name='login'),
path('api/user/ad/', views.login, name='login'),

关于网址之后的 /

  • APPEND_SLASH = True

    path('login/', views.login, name='login')
    	http://127.0.0.1:8000/login/  成功
    	
    	http://127.0.0.1:8000/login   重定向,GET
    	http://127.0.0.1:8000/login/   
    

    当我们直接访问网址或GET请求访问网址,都会成功,如果是POST请求有问题。

  • APPEND_SLASH = False

    path('login/', views.login, name='login')
    	http://127.0.0.1:8000/login/   成功
    	http://127.0.0.1:8000/login    失败
    	
    path('login', views.login, name='login')
    	http://127.0.0.1:8000/login/   失败
    	http://127.0.0.1:8000/login    成功
    

    严格模式,自己定义是什么就以什么方式访问。

其他

image-20230709120354955

posted @ 2024-09-10 13:21  Sherwin_szw  阅读(4)  评论(0编辑  收藏  举报