Django的路由管理,由应用文件下的urls.py文件进行管理 所有的路由都放置在urlpatterns中 每一个路由在定义的时候,需要通过路由函数来定义 路由函数,常见的有path,url path(router,view,kwargs,name) 普通路由的定义 url(router,view,kwargs,name) 支持正则表达式 两者在定义router上有所区别
router:即为路由地址,请求地址,不允许以"/"开头,这是一个字符串view:是一个视图函数,由该函数完成路由对应的业务处理kwargs:是一个字典,给view设置额外的参数name:路由的名字 与路由的反向解析有关- 普通路由 用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 HttpresponseDjango内置了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)))