Django中url、path及re_path区别

新手不知道怎么设置路由,纠结于使用url还是path,今天就让我们一块研究下吧。

1. 常用方法介绍

Django框架提供了多种生成urlpattern对象的方法。下面介绍几种比较常见的。

1. include ()方法

该方法的作用在于避免了把所有视图函数都放到项目文件夹的根文件urls.py中。

「例如:」

图片

2. url()方法

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

该方法会返回一个urlpatterns 对象,通过源码,我们发现其本质还是调用的re_path方法,Django已经不推荐这种用法了。

以后在工作中,见到了这种路由方式,也不用感到奇怪,知道可以这样用就行了。

图片

3. path()方法

创建工程的时候,默认的就是使用的这个,说明官方也是推荐的这个哦。

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

该方法会返回一个urlpatterns 对象,具有多个参数。参数的含义如下:

route:表示一个匹配url。该参数为必填参数。

view:表示一个路由所调用的对象,可以用特定的函数形式。

kwargs:可以将任意个变量以字典的形式传递给目标视图函数。

name:用于定义路由别名。

4. re_path()方法

如果有路由的正则匹配的需求,可以使用re_path

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

route:只有匹配了正则表达式,相关的正则表达式捕获组信息才会被传递给路由所调用的对象。该参数为必填参数。

view:用来表示一个路由所调用的对象,可以用特定的函数形式或者视图类的as_view()方法调用结果来体现。

kwargs:可以将任意个变量以字典的形式传递给目标视图函数。

name:用于定义路由别名。

其它的还有:register_converter(),该方法是注册一个自定义的转换器;static()方法加载相关静态资源信息。

「下面开始我们的实验环节:」

2.创建示例工程

创建工程和应用

前提条件: 安装好python和django环境。

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

django-admin startapp  Article
图片

下面的方法「也可以」创建工程和应用:

python -m django  startproject blog

python -m django  startapp article
图片

工程代码如下

图片

启动Django服务

python manage.py runserver 127.0.0.1:9000

在浏览器中输入127.0.0.1:9000,看到下图,说明服务正常启动了。

图片

3. 路由使用示例讲解

「前置条件 准备:」修改Article 目录下面的urlview文件。

# 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()方法的使用情况:」

「示例1:」

输入以下四个地址 :http://127.0.0.1:9000/path/  ,http://127.0.0.1:9000/repath1/  ,http://127.0.0.1:9000/url1/ ,均会出现下图所示结果:

图片
图片
图片

「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/,均会出现下图所示的结果。

图片
图片
图片
图片

「示例3:」

输入以下三个地址:http://127.0.0.1:9000/repathM/或http://127.0.0.1:9000/urlM/,http://127.0.0.1:9000/pathM/ ,均会出现下图所示结果:

图片
图片
图片

4.简单的总结一下

如果遇上「路径」「转换器」语法(类似<str:data>这种)都不足以定义的URL模式,那么就需要使用正则表达式,这时候就需要使用re_path(),而非path()。至于url()的方式,官方已经不推荐了。

THE END