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

2022-12-01 10:04:03 浏览数 (1)

文章目录

  • 前言
  • 一、路由的使用
    • 1.路由命名
    • 2.路由分组
    • 3.路由分发
  • 二、反解析

前言

路由简单的来说就是根据用户请求的 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)

0 人点赞