Django之路由

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 Django之路由,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

路由

概述

在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

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!