Django中url、path及re_path区别

2023-06-2611:21:40后端程序开发Comments1,589 views字数 3490阅读模式

新手不知道怎么设置路由,纠结于使用url还是path,今天就让我们一块研究下吧。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48356.html

1. 常用方法介绍

Django框架提供了多种生成urlpattern对象的方法。下面介绍几种比较常见的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48356.html

1. include ()方法

该方法的作用在于避免了把所有视图函数都放到项目文件夹的根文件urls.py中。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48356.html

「例如:」文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48356.html

Django中url、path及re_path区别

2. url()方法

url(regex, view, kwargs=None, name=None)

该方法会返回一个urlpatterns 对象,通过源码,我们发现其本质还是调用的re_path方法,Django已经不推荐这种用法了。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48356.html

以后在工作中,见到了这种路由方式,也不用感到奇怪,知道可以这样用就行了。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48356.html

Django中url、path及re_path区别

3. path()方法

创建工程的时候,默认的就是使用的这个,说明官方也是推荐的这个哦。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48356.html

Django中url、path及re_path区别
path(route, view, kwargs=None, name=None)

该方法会返回一个urlpatterns 对象,具有多个参数。参数的含义如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48356.html

route:表示一个匹配url。该参数为必填参数。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48356.html

view:表示一个路由所调用的对象,可以用特定的函数形式。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48356.html

kwargs:可以将任意个变量以字典的形式传递给目标视图函数。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48356.html

name:用于定义路由别名。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48356.html

4. re_path()方法

如果有路由的正则匹配的需求,可以使用re_path文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48356.html

path(route, view, kwargs=None, name=None)

route:只有匹配了正则表达式,相关的正则表达式捕获组信息才会被传递给路由所调用的对象。该参数为必填参数。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48356.html

view:用来表示一个路由所调用的对象,可以用特定的函数形式或者视图类的as_view()方法调用结果来体现。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48356.html

kwargs:可以将任意个变量以字典的形式传递给目标视图函数。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48356.html

name:用于定义路由别名。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48356.html

其它的还有:register_converter(),该方法是注册一个自定义的转换器;static()方法加载相关静态资源信息。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48356.html

「下面开始我们的实验环节:」文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48356.html

2.创建示例工程

创建工程和应用

前提条件: 安装好python和django环境。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48356.html

# 创建工程和应用
django-admin startproject BookInfo

django-admin startapp  Article
Django中url、path及re_path区别

下面的方法「也可以」创建工程和应用:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48356.html

python -m django  startproject blog

python -m django  startapp article
Django中url、path及re_path区别

工程代码如下

Django中url、path及re_path区别

启动Django服务

python manage.py runserver 127.0.0.1:9000

在浏览器中输入127.0.0.1:9000,看到下图,说明服务正常启动了。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48356.html

Django中url、path及re_path区别

3. 路由使用示例讲解

「前置条件 准备:」修改Article 目录下面的urlview文件。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48356.html

# BookInfo\Article\urls.py
from django.conf.urls import url
from django.urls import path, re_path
from .views import *

urlpatterns = [
    path('path_test', path_test),
    url('url_test', url_test),  # 官方已经不推荐了
    re_path('repath_test', repath_test),

    # 示例1
    path(r'path', demo2),
    path(r'^path\d+/$', demo2),  # http://127.0.0.1:9000/path1/  无法匹配该地址,说明不支持正则
    re_path(r'^repath\d+/$', demo2),
    url(r'^url\d+/$', demo2),

    # 示例2
    path('pathA<str:data>/', demo3),
    re_path(r'^repathA(\d+)/$', demo3),
    re_path(r'^repathAA(?P<data>\d+)/$', demo3),
    url(r'^urlA(\d+)/$', demo3),
    url(r'^urlAA(?P<data>\d+)/$', demo3),

    # 示例3
    path('pathM/', demo4, kwargs={"x": 23, "y": 10}),
    re_path(r'^repathM/$', demo4, kwargs={"x": 23, "y": 10}),
    url(r'^urlM/$', demo4, kwargs={"x": 23, "y": 10}),
]
# BookInfo\Article\views.py

from django.http import HttpResponse
# Create your views here.
def path_test(request):
    return HttpResponse("<h1 style='text-align:center'>path</h1>")

def url_test(request):
    return HttpResponse("<h1 style='text-align:center'>url</h1>")

def repath_test(request):
    return HttpResponse("<h1 style='text-align:center'>repath_test</h1>")

def demo1(request):
    return HttpResponse("<h1 style='text-align:center;background-color:grey'>demo1</h1>")

def demo2(request):
    return HttpResponse(
        "<h1 style='text-align:center;background-color:pink;height:100px;line-height: 100px;'>demo2</h1>")

def demo3(request, data):
    return HttpResponse(
        f"<h1 style='text-align:center;background-color:pink;height:100px;line-height: 100px;'>提取到的值是:{data}</h1>")

def demo4(request, x, y):
    return HttpResponse(
        f"<h1 style='text-align:center;background-color:pink;height:100px;line-height: 100px;'>x的值:{x}---y的值:{y}</h1>")

「下面演示path()url()re_path()方法的使用情况:」文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48356.html

「示例1:」

输入以下四个地址 :http://127.0.0.1:9000/path/  ,http://127.0.0.1:9000/repath1/  ,http://127.0.0.1:9000/url1/ ,均会出现下图所示结果:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48356.html

Django中url、path及re_path区别
Django中url、path及re_path区别
Django中url、path及re_path区别

「path()方法不支持正则的方式」,如下图所示:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48356.html

Django中url、path及re_path区别

「示例2:」

输入以下四个地址:http://127.0.0.1:9000/repathA100/、http://127.0.0.1:9000/urlA100/、http://127.0.0.1:9000/repathAA100/、http://127.0.0.1:9000/urlAA100/,均会出现下图所示的结果。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48356.html

Django中url、path及re_path区别
Django中url、path及re_path区别
Django中url、path及re_path区别
Django中url、path及re_path区别

「示例3:」

输入以下三个地址:http://127.0.0.1:9000/repathM/或http://127.0.0.1:9000/urlM/,http://127.0.0.1:9000/pathM/ ,均会出现下图所示结果:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48356.html

Django中url、path及re_path区别
Django中url、path及re_path区别
Django中url、path及re_path区别

4.简单的总结一下

如果遇上「路径」「转换器」语法(类似<str:data>这种)都不足以定义的URL模式,那么就需要使用正则表达式,这时候就需要使用re_path(),而非path()。至于url()的方式,官方已经不推荐了。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/48356.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/bc/48356.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定