django3 url路由

一、路由url函数

'''
1.路由自上而下进行匹配
2.ulr(正则路径, 视图函数内存地址, 默认参数, 路由别名)
'''

二、路由正则

'''
1.规定开始:^  |  规定结束:$
url(r'index', views.index) => /index/ | /aindex/ | /indexb/ | /aindexb/ 均能匹配
url(r'^index', views.index) => /index/ | /indexb/ 能匹配
url(r'^index/$', views.index) => /index/ 才能匹配

2.无名分组:^delete/(\d+)/(\d+)$
路由:url(r'^delete/(\d+)/(\d+)$', views.delete)
请求路径:/delete/1/2
视图函数:def delete(request, n1, n2) => n1可以拿到请求路径中的1,n2拿到2

3.有名分组:^delete/(?P<id>\d+)/(?P<num>\d+)$
请求路径:/delete/1/2
视图函数:def delete(request, id, num) => 只能用id,num变量接收1、2

注:路由正则不支持有名无名分组混用
'''

三、多app共存的路由分配

'''
1.创建多个应用:django-admin startapp app_name | python3 manage.py startapp app_name | Tools工具
2.在settings.py中配置INSTALLED_APPS,添加新建的应用:'app_name.apps.App_nameConfig'
3.处理路由冲突

import app01.views as app01_views
import app02.views as app02_views
urlpatterns = [
    url(r'^app01/test/$', app01_views.test),
    url(r'^app02/test/$', app02_views.test),
]
'''

四、模板冲突问题

'''
方法1:在对应应用下建立自己的templates,再在templates下建立与应用名同名的文件夹,模板文件放在应用名同名的文件夹下
方法2:在项目根目录下的templates中建立每一个应用同名的文件夹,每个应用的模板文件放在自己应用名文件夹下

使用:render(request, 'app_name/test.html')
'''

五、路由分发

'''
# 分担总路由的代码压力
1.在每一个应用中建立自身的urls.py文件,语法同主路由
2.在主路由进行分发
from django.conf.urls import include
urlpatterns = [
    url(r'^app01/', include('app01.urls')),
    url(r'^app02/', include('app02.urls')),
]
# 注:主路由分发一定不能使用$正则语法
'''

六、路由别名

'''
1.有些路由会被大量访问(直接访问、间接访问)
2.这些路由可能后期还会发生变化
3.可以给路由设置别名,通过别名访问:<a href="{% url '路由别名' '传入有名无名分组所需参数' %}"></a>
'''

七、反向解析

'''
from django.shortcuts import reverse
在视图函数中通过reverse方法反向解析出真实的路径

# 1.不带分组:url(r'可能会变的真实路由', 视图函数, name='路由别名')
url = reverse('路由别名')

# 2.无名分组:url(r'可能会变的真实路由(带无名分组)', 视图函数, name='路由别名')
url = reverse('路由别名', args=(给无名分组赋值))

# 3.有名分组:url(r'可能会变的真实路由(带有名分组)', 视图函数, name='路由别名')
url = reverse('路由别名', kwargs={给有名分组赋值,key就是有名分组名})
'''

八、名称空间

'''
主路由:
from django.conf.urls import include
urlpatterns = [
    url(r'^app01/', include('app01.urls', namespace='app01')),
    url(r'^app02/', include('app02.urls', namespace='app02')),
]

app01应用下路由
from django.conf.urls import url
from app01 import views
urlpatterns = [
    url(r'^test/', views.test, name='test')
]

app02应用下路由
from django.conf.urls import url
from app02 import views
urlpatterns = [
    url(r'^test/', views.test, name='test')
]

前端页面反向解析:{% url 'app01:test' %} | {% url 'app02:test' %}
视图函数reverse方法:url = reverse('app01:test') | url = reverse('app02:test')
'''

九、2.x新特性

'''
from django.urls import path, re_path  # 2.x版本
from django.conf.urls import url # 1.x版本,向下兼容,但不建议使用
urlpatterns = [
    path('admin/', admin.site.urls),
]

# 1. 2.x版本re_path的使用方式同1.x版本url
# 2. path写的是绝对字符串,请求地址必须与路由地址完全匹配
# 3. path拥有五个转换器:
	-- str:匹配除路径分隔符(/)外的字符串,默认
	-- int:匹配自然数
	-- slug:匹配字母、数字、横杠及下划线组成的字符串
	-- uuid:匹配uuid形式的字符串
	-- path:匹配任何非空字符串,包括路径分隔符(/) (不能用?)
'''

十、自定义转换器

'''
1. 在自定义文件中自定义类,采用固定格式作为conventer

eg:在app应用下的conventer文件中建立CVT138Phone类
class CVT138Phone:
    regex = '185\d{8}'
    def to_python(self, value):
        return int(value)
    def to_url(self, value):
        return '%11d' % value

2. 在路由中注册自定义转换器
from django.urls import register_converter
from app import view, conventer
register_converter(conventer.CVT138Phone, 'phone138')  # 自定义转换器名:phone138
urlpatterns = [
    path('test/<phone138:phone>/', views.test, name='test_phone'),
]
# 可以匹配138的电话,to_python决定了类型为int,to_url服务于反向解析(反向解析需要使用字符串)
# url = reverse('test_phone', kwargs={'phone': 8888})  # 反向解析传入不满11位,会被格式化位11位
'''

猜你喜欢

转载自blog.csdn.net/qq_38746842/article/details/88747170