AI智能
改变未来

Django学习记录(2)Django中的路由管理


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.pypath(\"login\", views.login,name=\"login\")# 在views.py文件中写login()函数from django.http import HttpResponsedef 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 convertersfrom django.urls.converters import register_converter# 将自定义的转换器进行注册# 第一个参数代表自定义的类型转换器,第二个参数代表名字register_converter(converters.Year_converter, \"year\")# 在urlpatterns中使用该类型转换器urlpatterns = [path(\"<year:year>\", views.year)]
  1. 在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属性查找路由的过程

  1. 在模板中进行路由的反向解析
{% url \'namespace:router_name\' param %}
  1. 在视图函数中进行路由的反向解析
from django.shortcuts import reverseredirect(to=\"/\")redirect(to=reverse(\'router_name\'))# 带参路由反向解析 例:redirect(to=\'/next/11\')redirect(to=reverse(\'next\', args=(11, 12)))
赞(0) 打赏
未经允许不得转载:爱站程序员基地 » Django学习记录(2)Django中的路由管理