Django路由管理
Django的路由管理,由应用文件下的urls.py文件进行管理
所有的路由都放置在urlpatterns中
每一个路由在定义的时候,需要通过路由函数来定义
路由函数,常见的有path,url
path(router,view,kwargs,name) 普通路由的定义
url(router,view,kwargs,name) 支持正则表达式
两者在定义router上有所区别
- router:即为路由地址,请求地址,不允许以"/"开头,这是一个字符串
- view:是一个视图函数,由该函数完成路由对应的业务处理
- kwargs:是一个字典,给view设置额外的参数
- name:路由的名字 与路由的反向解析有关
Django中路由的分类
- 普通路由
用path函数定义,router是一个普通的字符串。
# 在urls.py中定义到一个跳转到登录页面的路由
from . import views.py
path("login", views.login,name="login")
# 在views.py文件中写login()函数
from django.http import HttpResponse
def login(request):
return HttpResponse(content="hello world")
# 完成最基本的路由周期
- 参数路由(动态路由)
用path函数定义,router在定义路由的时候使用<[type:]key>设置
# 带参路由
path("detail/<int:pk>", views.detail, name="detail")
# 如果不加type限制 pk默认的格式是字符串
# 带参视图函数
def detail(request, pk):
return Httpresponse
Django内置了5个类型转换器 converters.py
str 默认的,不能匹配 /
int 代表整数
slug 匹配数字字母下划线和中划线
uuid 匹配符合uuid格式的字符串
path 匹配所有,包括 /
此外,还可以自定义类型转换器
例如定义一个只匹配年份的路由:
1.在应用包下创建一个converters.py文件
from django.urls.converters import IntConverter
# 继承IntConverter父类
class Year_converter(IntConverter):
regex = r"(19|20)\d{2}"
2.之后在__init__.py文件中导入converters.py和django的converters的类型注册函数
from . import converters
from django.urls.converters import register_converter
# 将自定义的转换器进行注册
# 第一个参数代表自定义的类型转换器,第二个参数代表名字
register_converter(converters.Year_converter, "year")
# 在urlpatterns中使用该类型转换器
urlpatterns = [path("<year:year>", views.year)]
- 在views.py中定义year函数
def year(request, year):
return HttpResponse(content="传入的年份是{}".format(year))
- 正则路由
用url函数定义,router是一个支持正则表达式的字符串
在urls.py中导入包 from django.urls import url
用法跟path类似 常用于模糊匹配
正则路由带参数:
url(r"^detail/(?P<pk>\d+)$", views.detail, name="detail")
- 分布式路由
用于分布将当前路由转到各个模块的urlpatterns进行分布式处理
from django.conf.urls import include
path("cart", include(cart.urls))
- 路由的反向解析
根据路由的name属性查找路由的过程
- 在模板中进行路由的反向解析
{% url 'namespace:router_name' param %}
- 在视图函数中进行路由的反向解析
from django.shortcuts import reverse
redirect(to="/")
redirect(to=reverse('router_name'))
# 带参路由反向解析 例:
redirect(to='/next/11')
redirect(to=reverse('next', args=(11, 12)))