django 中路由的使用 path 和 re_path的区别 url

本文介绍了 Django 中 path, re_path 和 url 的使用区别,详细解释了如何使用正则表达式匹配 URL 参数,并提供了具体的示例代码。

目录

目录

一、区别

二、url

二、path

1、简单的正则表达式

三、re_path

re正则表达式

要点:

 附:正则表达式用法小结

四、重定向


一、区别

path:用于普通路径,不需要自己手动添加正则首位限制符号,底层已经添加。

re_path:用于正则路径,需要自己手动添加正则首位限制符号。

url() 方法:普通路径和正则路径均可使用,需要自己手动添加正则首位限制符号。

二、url

from django.conf.urls import url # 用 url 需要引入

urlpatterns = [
    url(r'^admin/$', admin.site.urls),
    url(r'^index/$', views.index), # 普通路径
    url(r'^articles/([0-9]{4})/$', views.articles), # 正则路径
]

二、path

# coding=utf-8
from django.urls import path,re_path
from .views import *

urlpatterns = [
    path('login1/', login,name="login"),
    path('login2/', LoginView.as_view()),# 通过类方法调用,as_view 是from django.views import View中的方法

]

1、简单的正则表达式

尖括号为标志,表达式写成<变量类型:变量名>的形式,这种正则不需要import额外的方法。

from django.urls import path
from . import views

urlpatterns = [
    # ex: /polls/
    path('', views.index, name='index'),
    # ex: /polls/5/
    path('<int:id>/', views.detail, name='detail'),
    # ex: /polls/5/results/
    path('<int:id>/results/', views.results, name='results'),
    # ex: /polls/5/vote/
    path('<int:id>/vote/', views.vote, name='vote'),
]

三、re_path

Django是不喜欢用GET方法的url参数的,通常Django使用正则表达式来解析url,提取出其中的变量并传递给方法。

re正则表达式

使用re_path()代替path(),并在字符串的引号前加r
Python正则表达式前的 r 表示原生字符串(rawstring),该字符串声明了引号中的内容表示该内容的原始含义,避免了多次转义造成的反斜杠困扰。大概意思就是加了r的不用再考虑字符串中标点的转义,程序会自动帮忙转义。

1、使用GET请求获得参数时,斜杠(/)、句点(.)一般不可取到字符串参数内。一串“/”隔开的url取参数需要每个单独取。如:

2、django2.0中,使用正则表达式进行路由的话需要使用re_path()

from django.urls import path, re_path
from . import views
urlpatterns = [
    re_path('^hello/$', views.hello),
    re_path('^hello/(?P<yy>[0-9]+)/', views.hello),
]

要点:

1、匹配头用尖号^,前部固定,后部自由:

 2、匹配尾用$,后部固定,前部自由:

3、匹配变量参数:
字符串:(?P<prm>\w+),+表示多个字符
数字:(?P<int>\d+),+表示多个数字
类型、个数匹配:(?P<p>[0-9]{4}) //4个0-9的数字
尖括号内是变量名,会作为views中的方法的参数传给views

 附:正则表达式用法小结

#正则表达式:
# 元字符: \w \d \s \n \t  \W \S \D \b  ^ 尖角号 $  . []  [^] ()  |
#   [0-9]  \d
#   [1-9]
#   [\da-zA-Z]
#. :匹配除换行符"\n"以外的任意字符
#\ :转义字符,使后一个字符改变原来的意思.如果字符串中有字符*需要匹配,可以使用\*或者字符集{*}
#[...]:字符集,对应的位置可以是字符集中任意字符.字符集中的字符可以逐个列出,也可以给出范围,如[abc]
#或者是[a-c],第一个字符如果是^,则表示取反,如[^abc]表示不是abc的其他字符.所有的特殊字符在字符集中
# 都失去其原有的特殊含义.在字符集中如果要使用].-或^,可以在前面加上反斜杠,或者把],-放在第一个字符,把^
#放在非第一个字符

#\d   数字:[0-9]
#\D   非数字:[^\d]
#\s   空白字符:[<空格> \t\r\n\f\v]
#\S   非空白字符:[^\s]
#\w   单词字符:[0-9a-zA-Z_]包括了数字字母下划线
#\W   非单词字符:[^\w]


#量词 :  {n}  {n,}  {n,m}  * ? +
#* :匹配前一个字符0或无限次  abc*
#+:匹配前一个字符1次货无限次. abc+
#?:匹配前一个字符0次或1次.    abc?
#{n}:匹配前一个字符n次        ab{2}c  匹配字符:abbc
#{n,}:至少匹配n次,至无限次
#{n,m}:匹配前一个字符n到m次   ab{1,2}c 匹配字符abc,abbc

#*?,  +?,  ??  {m,n}?,使* + ? {m,n}变成非贪婪模式

#边界匹配:
#^ :匹配字符串开头,
# 在多行模式中匹配每一行的开头.  ^abc   匹配字符abc
#$ :匹配字符串末尾,
# 在多行模式中匹配每一行的末尾.   abc$  匹配字符abc
#\A  仅匹配字符串开头           \Aabc  匹配字符abc
#\Z  仅匹配字符串末尾           abc\Z  匹配字符abc
#\b  匹配\w和\W之间            a\b!bc  a!bc

# |:|代表左右表达式任意匹配一个.它总是先尝试匹配左边的表达式
#一旦左边的表达式成功匹配则跳过右边的表达式
#如果|没有被包括在()中,则它的范围是整个正则表达式   abc|def

#(...) :被括起来的表达式将作为分组,从表达式左边开始每遇到
#一个分组的左括号"(",编号+1.另外,分组表达式作为一个整体,可以接数量词.
#表达式中的|仅在该组有效.
#(?P<name>...):分组,除了原有的编号外再指定一个额外的别名.
#\<number>:引用编号为<number>的分组匹配到的字符串. (\d)abc\1
#(?P = name):引用别名为<name>的分组匹配到的字符串

#转义符:
        # python str : '\'
        # 正则表达式中的'\'到了python中都会变成'\\'
        # r'\w' 在python当中\不转义了,在Python中就是一个普通的'\',但是在正则表达式中它还是表示一个转义符
    # 贪婪匹配/惰性匹配 :
        # .*x 贪婪 匹配任意内容最多次,直到最后一个X停止 回溯算法
        # .*?X 惰性 匹配任意内容最少次,遇到第一个X就停止

# re模块
    # findall 匹配所有 列表
    # search 匹配第一个 变量.group(),没匹配到返回None
    # match 从头开始匹配第一个
    # split sub subn
    # finditer compile
        # finditer 返回一个迭代器,所有匹配到的内容需要迭代取到,迭代取到的每一个结果都需要group取具体值
            # -- 节省内存空间
        # compile 编译,先把一个正则表达式编译,编译之后,在之后多次使用的过程不用重新编译
            # -- 节省时间 提高效率

# 分组:()
    # 1.给不止一个字符的整体做量词约束的时候 www(\.[\w]+)+    www.baidu.com
    # 2.优先显示,当要匹配的内容和不想匹配的内容混在一起的时候,
        # 就匹配出所有内容,但是对实际需要的内容进行分组
    # 3.分组和re模块中的方法 :
        # findall : 分组优先显示 取消(?:正则)
        # search :
            # 可以通过.group(index)来取分组中的内容
            # 可以通过.group(name)来取分组中的内容
                # 正则 (?P<name>正则)
                # 使用这个分组 ?P=name
        # split : 会保留分组内的内容到切割的结果中

四、重定向

在Django中,当你需要从一个视图重定向到另一个视图时,可以使用redirect函数或者HttpResponseRedirect类。为了确保你重定向到正确的URL,尤其是在URL的模式发生变化时,通常建议使用reverse函数来动态生成URL。

例图 路由

path('<int:id>/', views.detail, name='detail'),
from django.shortcuts import redirect
from django.urls import reverse

def redirect_detail(request):
     # 使用reverse来获取目标视图的URL,并传入所需的参数
     url = reverse('detail', kwargs={'id': 1})
     # 使用redirect进行重定向
     return redirect(url)

在请求redirect_detail方法的时候就可以重定向到detail方法。

<think>好的,我现在需要帮助用户了解Djangourlpathre_path的用法以及它们的区别。首先,我应该回忆一下DjangoURL配置相关知识,并查阅相关文档确保准确性。用户提到了这三个函数,可能对它们的用法区别不太清楚,需要逐一解释。 首先,DjangoURL配置主要在urls.py文件中,通过定义URL模式来将请求路由到相应的视图函数。在Django 2.0之前,通常使用url()函数,它支持正则表达式。而Django 2.0引入了path()re_path(),其中path()使用更简洁的路径转换器,而re_path()则替代了原来的url()函数,继续支持正则表达式。 接下来,我需要分别解释每个函数的用法: 1. path():用于简单的路径匹配,使用转换器语法(如<int:year>)来捕获URL中的参数,更加直观安全,避免正则表达式的复杂性。例如,path('articles/<int:year>/', views.article_year)会匹配类似/articles/2020/的URL,并将2020作为整数参数传递给视图。 2. re_path():当需要更复杂的匹配模式时使用,比如正则表达式。例如,re_path(r'^articles/(?P<year>[0-9]{4})/$', views.article_year)可以达到与path()相同的效果,但需要编写正则表达式,适合更灵活的需求。 3. url():在Django 3.1之后,虽然仍然可用,但官方推荐使用path()re_path()。它re_path()功能相同,但可能在未来版本中被弃用,因此建议新项目使用pathre_path。 然后,需要比较它们的区别,包括语法、参数类型适用场景。例如,path更简洁,适合简单路径;re_path适合复杂匹配;url是旧方法,逐渐被替代。 用户提供的引用中,引用[1]提到了使用{% url %}模板标签生成URL,这与URL配置相关,但用户的问题更多是关于urls.py中的函数。不过可以提一下在模板中如何使用这些URL模式,增强回答的实用性。 另外,要确保回答结构清晰,分点说明每个函数的用法,再列出区别。可能需要给出代码示例,帮助用户理解不同函数的实际应用。例如,展示pathre_path的用法示例,并说明参数如何传递到视图函数。 最后,根据用户提供的引用[4],项目结构中有urls.py文件,这可能涉及到如何组织URL配置,但用户的问题更关注具体的函数用法,所以这部分引用可能不需要直接引用到回答中。但引用[2]提到了redirect到用户输入的URL,这可能涉及到URL的命名反向解析,可以在相关问题中提到。 生成相关问题部分,需要考虑用户可能的后续问题,比如如何选择使用path还是re_path,如何处理复杂的URL模式,如何进行URL反向解析等。 现在需要组织语言,确保用中文回答,正确使用LaTeX格式的行内公式(虽然这个问题可能不涉及数学公式,但如果有变量或代码内的表达式,可能需要用$...$,但这里可能不需要)。例如,代码块中的<int:year>可能需要用行内代码标记,而不是LaTeX。 检查是否遵循了系统级指令,特别是行内数学表达式独立公式的格式,但在这个问题中可能用不上数学公式,所以可能不需要使用。但需要确保代码块正确使用三个反引号包裹,并标注语言类型如python。 最后,确保回答中引用的引用文献正确,比如引用[1]关于{% url %}的用法,可以在讲解URL反向解析时提及,但用户的问题主要是关于urls.py中的配置函数,所以可能引用[1]引用[2]相关的地方需要适当提及。</think>### Djangourlpathre_path的用法及区别Django中,`url`、`path``re_path`均用于URL路由配置,但适用场景语法存在差异。以下是具体说明: --- #### 1. **`path()`** - **用途**:用于简单路径匹配,支持路径转换器(如`int`、`str`等),语法更直观。 - **语法示例**: ```python from django.urls import path path('articles/<int:year>/', views.article_year) ``` - 匹配URL如`/articles/2020/`,`year`参数以整数形式传递到视图函数。 - **特点**: - 自动处理类型转换(如将字符串转换为整数)。 - 避免正则表达式复杂性,适合大多数常见需求[^1]。 --- #### 2. **`re_path()`** - **用途**:支持正则表达式匹配,适用于复杂URL模式。 - **语法示例**: ```python from django.urls import re_path re_path(r'^articles/(?P<year>[0-9]{4})/$', views.article_year) ``` - 功能与上述`path`示例相同,但需手动编写正则表达式。 - **特点**: - 灵活性高,可定义更精确的匹配规则(如限制年份为4位数字)。 - 需熟悉正则表达式语法。 --- #### 3. **`url()`** - **用途**:Django 2.0之前的旧方法,功能与`re_path`相同,但官方推荐逐步迁移至`path``re_path`。 - **语法示例**: ```python from django.conf.urls import url url(r'^articles/(?P<year>[0-9]{4})/$', views.article_year) ``` - **注意**:Django 3.1后仍兼容,但新项目建议使用`path``re_path`[^2]。 --- ### 核心区别 | 方法 | 语法类型 | 参数类型处理 | 适用场景 | |------------|----------------|--------------|------------------------| | `path()` | 路径转换器 | 自动类型转换 | 简单、标准化的URL模式 | | `re_path()`| 正则表达式 | 需手动处理 | 复杂或需精确匹配的URL | | `url()` | 正则表达式 | 需手动处理 | 旧项目兼容 | --- ### 使用建议 1. **优先使用`path()`**:对于简单参数(如ID、日期),利用内置转换器减少代码量。 2. **复杂匹配用`re_path()`**:如需要验证特定格式(如手机号、邮箱)。 3. **模板中反向解析**:通过`{% url 'view_name' %}`生成URL,避免硬编码[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值