【愚公系列】2022年01月 Python教学课程 45-Django框架之路由命名和反解析

举报
愚公搬代码 发表于 2022/01/02 16:38:43 2022/01/02
【摘要】 前言路由简单的来说就是根据用户请求的 URL 链接来判断对应的处理程序,并返回处理结果,也就是 URL 与 Django 的视图建立映射关系。Django 2系列path:用于普通路径,不需要自己手动添加正则首位限制符号,底层已经添加。re_path:用于正则路径,需要自己手动添加正则首位限制符号。from django.urls import re_path # 用re_path 需要引...

前言

路由简单的来说就是根据用户请求的 URL 链接来判断对应的处理程序,并返回处理结果,也就是 URL 与 Django 的视图建立映射关系。

Django 2系列

  • path:用于普通路径,不需要自己手动添加正则首位限制符号,底层已经添加。
  • re_path:用于正则路径,需要自己手动添加正则首位限制符号。
from django.urls import re_path # 用re_path 需要引入
urlpatterns = [
    path('admin/', admin.site.urls),
    path('index/', views.index), # 普通路径
    re_path(r'^articles/([0-9]{4})/$', views.articles), # 正则路径
]

提示:以下是本篇文章正文内容,下面案例可供参考

一、路由的使用

1.路由命名

在定义路由的时候,可以为路由命名,方便查找特定视图的具体路径信息。

1.在使用include函数定义路由时,可以使用namespace参数定义路由的命名空间,如

re_path(r'^',include('book.urls',namespace='book'))

命名空间表示,凡是book.urls中定义的路由,均属于namespace指明的book名下。

命名空间的作用:避免不同应用中的路由使用了相同的名字发生冲突,使用命名空间区别开。

2.在定义普通路由时,可以使用name参数指明路由的名字,如

urlpatterns = [
    re_path(r'^$',index),
    # 匹配书籍列表信息的URL,调用对应的bookList视图
    re_path(r'^booklist/$',bookList,name='index'),
    re_path(r'^testproject/$',views.testproject,name='test'),
]

有参数无名路由

re_path(r"^login/([0-9]{2})/$", views.login, name="login")
return redirect(reverse("login",args=(10,)))

有参数有名路由

re_path(r"^login/(?P<year>[0-9]{4})/$", views.login, name="login")
return redirect(reverse("login",kwargs={"year":3333}))

3.在模板 templates 中的 HTML 文件中,利用 {% url “路由别名” %} 反向解析

无名反向解析

<form action="{% url 'login' %}" method="post"> 

有名反向解析

```javascript
<form action="{% url 'login' year=3333 %}" method="post">

2.路由分组

单个参数

urlpatterns = [
    path('admin/', admin.site.urls),
    re_path("^index/([0-9]{4})/$", views.index),
]
from django.shortcuts import HttpResponse

def index(request,year):
    print(year) # 一个形参代表路径中一个分组的内容,按顺序匹配
    return HttpResponse()

多个参数

from django.shortcuts import HttpResponse

def index(request,year):
    print(year) # 一个形参代表路径中一个分组的内容,按顺序匹配
    return HttpResponse()
from django.shortcuts import HttpResponse
def index(request, year, month):
    print(year,month) # 一个形参代表路径中一个分组的内容,按关键字对应匹配
    return HttpResponse()

3.路由分发

路由分发(include)

存在问题:Django 项目里多个app目录共用一个 urls 容易造成混淆,后期维护也不方便。

解决:使用路由分发(include),让每个app目录都单独拥有自己的 urls。

app 总目录下

from django.contrib import admin
from django.urls import path,include # 从 django.urls 引入 include
urlpatterns = [
    path('admin/', admin.site.urls),
    path("index/", include("index.urls")),
    path("login/", include("login.urls")),
]

index 目录:

from django.urls import path,re_path 
from index  import views # 从自己的 app 目录引入 views 
urlpatterns = [ 
    re_path(r'^login/(?P<m>[0-9]{2})/$', views.index, ),
] 

login 目录:

from django.urls import path,re_path
from login import views # 从自己的 app 目录引入views 
urlpatterns = [ 
    re_path("^xxx/(?P[0-9]{4})/$", views.xxx), 
]

二、反解析

随着功能的增加,路由层的 url 发生变化,就需要去更改对应的视图层和模板层的 url,非常麻烦,不便维护。

这时我们可以利用反向解析,当路由层 url 发生改变,在视图层和模板层动态反向解析出更改后的 url,免去修改的操作。

反向解析一般用在模板中的超链接及视图中的重定向。

使用reverse函数,可以根据路由名称,返回具体的路径,如:

from django.core.urlresolvers import reverse
#或者
from django.urls import reverse

def testproject(request):

    return HttpResponse("OK")

# 定义视图:提供书籍列表信息
def bookList(request):

    url = reverse('book:test')
    print(url)
    return HttpResponse('index')
  • 对于未指明namespace的,reverse(路由name)
  • 对于指明namespace的,reverse(命名空间namespace:路由name)
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。