前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【愚公系列】2022年01月 Python教学课程 45-Django框架之路由命名和反解析

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

作者头像
愚公搬代码
发布2022-12-01 10:04:03
6770
发布2022-12-01 10:04:03
举报
文章被收录于专栏:历史专栏

文章目录


前言

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

Django 2系列

  • path:用于普通路径,不需要自己手动添加正则首位限制符号,底层已经添加。
  • re_path:用于正则路径,需要自己手动添加正则首位限制符号。
代码语言:javascript
复制
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参数定义路由的命名空间,如

代码语言:javascript
复制
re_path(r'^',include('book.urls',namespace='book'))

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

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

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

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

有参数无名路由

代码语言:javascript
复制
re_path(r"^login/([0-9]{2})/$", views.login, name="login")
代码语言:javascript
复制
return redirect(reverse("login",args=(10,)))

有参数有名路由

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

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

无名反向解析

代码语言:javascript
复制
<form action="{% url 'login' %}" method="post"> 

有名反向解析

代码语言:javascript
复制
```javascript
<form action="{% url 'login' year=3333 %}" method="post">

2.路由分组

单个参数

代码语言:javascript
复制
urlpatterns = [
    path('admin/', admin.site.urls),
    re_path("^index/([0-9]{4})/$", views.index),
]
代码语言:javascript
复制
from django.shortcuts import HttpResponse

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

多个参数

代码语言:javascript
复制
from django.shortcuts import HttpResponse

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

3.路由分发

路由分发(include)

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

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

app 总目录下

代码语言:javascript
复制
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 目录:

代码语言:javascript
复制
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 目录:

代码语言:javascript
复制
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函数,可以根据路由名称,返回具体的路径,如:

代码语言:javascript
复制
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)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-04-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 前言
  • 一、路由的使用
    • 1.路由命名
      • 2.路由分组
        • 3.路由分发
        • 二、反解析
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档