Django之路由
路由
概述
在Django中,路由用于将URL映射到视图函数或类。Django路由系统根据请求的URL调用相应的视图,并返回HTTP响应。
Django 路由在 urls.py 配置,urls.py 中的每一条配置对应相应的处理方法。
路由配置版本差异
Django1.1.x 版本
url() 方法:普通路径和正则路径均可使用,需要自己手动添加正则首位限制符号。
from django.conf.urls import url
urlpatterns = [
url(r'^admin/$', admin.site.urls),
url(r'^index/$', views.index), # 普通路径
url(r'^articles/([0-9]{4})/$', views.articles), # 正则路径
]
Django 2.2.x 之后的版本
path:用于普通路径,不需要自己手动添加正则首位限制符号,底层已经添加。
re_path:用于正则路径,需要自己手动添加正则首位限制符号。
from django.urls import re_path
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', views.index), # 普通路径
re_path(r'^articles/([0-9]{4})/$', views.articles), # 正则路径
]
URL配置
在Django中,URL配置是将HTTP请求映射到视图函数或类的过程。它定义了应用程序中的URL路径和相应的处理视图,并确保每个请求都被正确地路由到相应的处理视图上。
URL配置通常存储在项目、应用目录下名为urls.py的Python模块中。
浏览者通过在浏览器的地址栏中输入网址请求网站,由哪一个视图进行处理请求,是由url匹配找到的
配置步骤
1.在settings.py配置文件中指定url配置,创建项目的时候默认配置
ROOT_URLCONF = '项目.urls'
2.在Django项目的主URL配置文件中包含定义的URL模式。
from django.urls import include, path
urlpatterns = [
path('myapp/', include('myapp.urls')),
]
3.在应用目录下的URL配置文件中定义一个URL模式,即匹配特定URL的正则表达式。
from django.urls import path
from . import views
urlpatterns = [
]
4.将URL模式与视图函数或类关联起来,以便Django路由系统可以找到正确的处理程序。
from django.urls import path
from . import views
urlpatterns = [
path('index/', views.index, name='index'),
]
注意事项
1.正则部分推荐使用r,表示字符串不转义,这样在正则表达式中使用 / 只写一个就可以
2.不能在开始加反斜杠,推荐在结束加反斜杠。正例:path/、path
,反例:/path、/path/
3.请求url被看做是一个普通的python字符串,进行匹配时不包括域名、get或post参数。
假设请求地址:
http://127.0.0.1:8000/user/?username=jack&password=123456
,那么去掉域名和参数部分后,只剩下user/部分与正则匹配
4.虽然路由结尾带/能带来上述好处,但是却违背了HTTP中URL表示资源位置路径的设计理念。是否结尾带/以所属公司定义风格为准。
路由命名
在Django中,可以给URL和视图函数或类命名,以便于在其他地方引用。这样做的好处是可以避免硬编码URL地址,提高代码的可维护性。
路由别名
在定义路由时,可以使用name参数指明路由的名字,方便查找特定视图的具体路径信息。
from django.urls import path
from user import views
urlpatterns = [
path('index/', views.index, name='index'),
path('test/', views.test),
]
项目urls.py配置文件
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
# 配置只要是/user路径则匹配成功
path('user/', include('user.urls')),
]
命名空间
当定义多个应用程序时,为了避免不同应用程序中的URL名称冲突,可以使用命名空间来指定各自的前缀。
作用:避免不同应用中的路由使用了相同的路由名称发生冲突,使用命名空间区别开
1.应用程序级别命名空间
使用
app_name
变量指定命名空间为’myapp’。在其他地方引用这个应用程序中的URL时,就需要使用’user:URL名称’的形式进行引用
from django.urls import path
from user import views
app_name = 'myapp'
urlpatterns = [
path('index/', views.index, name='index'),
path('test/', views.test),
]
在模板文件中,引用命名空间为’myapp’的URL
<a href="{% url 'myapp:index' %}">index</a>
2.全局命名空间
在全局URL中,使用include()函数将myapp应用程序中的URL包含到全局范围内, 同时使用namespace参数定义路由的命名空间
from django.contrib import admin
from django.urls import include, path, re_path
urlpatterns = [
path('admin/', admin.site.urls),
# 传入一个tuple类型的参数:param1:应用程序中的urls.py文件 param2:应用名称
re_path(r'^user/*/', include(('user.urls', 'user_app')))
# re_path(r'^user/*/', include(('user.urls', 'user_app'), namespace='user'))
]
reverse反解析
在Django中,反向解析(reverse resolution)是指根据URL名称和参数生成对应的URL地址。反向解析可以避免硬编码URL地址,提高代码的可维护性。
reverse()函数接受一个URL名称和一些位置参数或关键字参数,然后返回与该名称匹配的URL地址。
简单的说: 使用reverse函数,可以根据在路由中配置的路由别名找到对应具体的路径url
注意: 使用reverse()函数时,必须保证URL名称的唯一性,并尽可能使用有意义的名称,以便于代码阅读和维护
。
reverse(路由名)
当未指明namespace时,reverse(路由名)
from django.http import HttpResponseRedirect
from django.urls import reverse
def index(request):
return HttpResponse('index')
def test(request):
url = reverse('index')
print(url)
return HttpResponseRedirect(url)
在模板中使用{% url %}模板标签进行反向解析
<a href="{% url 'index' %}">Go to index</a>
reverse(命名空间:路由名)
当指明app名称或者namespace
reverse(命名空间:路由名)
reverse("app名称:路由别名")
from django.http import HttpResponse, HttpResponseRedirect
from django.urls import reverse
def index(request):
return HttpResponse('index')
def test(request):
url = reverse("user_app:index")
url2 = reverse("user:index")
print(url)
print(url2)
# return redirect(url)
return redirect(url2)
URL路径参数/正则路径分组
如果从URL中获取值,需要在正则表达式中使用分组,获取值分为两种方式
1.位置参数:参数的位置不能错
2.关键字参数:参数的位置可以变,跟关键字保持一致即可
注意:两种参数的方式不要混合使用,在一个正则表达式中只能使用一种参数方式
位置参数
应用中urls.py
from django.urls import path, re_path
from user import views
urlpatterns = [
re_path(r'^index/(\d+)/(\d+)/$', views.index, name="index"),
path('test/', views.test),
]
视图中函数: 参数的位置不能错
from django.http import HttpResponse
from django.shortcuts import redirect
from django.urls import reverse
def index(request, val1, val2):
context = {'v1': val1, 'v2': val2}
print(context)
return HttpResponse("ok")
def test(request):
url = reverse("index", args=(10, 20))
print(url)
return redirect(url)
请求:http://127.0.0.1:8000/user/index/1/2/
{'v1': '1', 'v2': '2'}
请求:http://127.0.0.1:8000/user/test/
进行反解析
关键字参数(推荐)
在应用中urls.py进行如下配置,其中?P<value1>
部分表示为这个参数定义的名称为value1,也可以是其他名称。
from django.urls import path, re_path
from user import views
urlpatterns = [
re_path(r'^index/(?P<value1>\d+)/(?P<value2>\d+)/$', views.index, name='index'),
path('test/', views.test),
]
视图中函数: 参数的位置可以变,跟关键字保持一致即可
def index(request, value2, value1):
context = {'value1': value1, 'value2': value2}
print(context)
return HttpResponse("ok")
访问:http://127.0.0.1:8000/user/index/1/2/
{'value1': '1', 'value2': '2'}
访问:http://127.0.0.1:8000/user/test
进行反解析
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/136840.html