• Django2.x中url路由的path()与re_path()参数解释


    在新版本Django2.x中,url的路由表示用pathre_path代替,模块的导入由django1.x版本的from django.conf.urls import url,include变成现在的Django2.x中的from django.urls import path, re_path, include

    看下面两幅图:

    • Django1.10

    而且url()函数传递了四个参数,两个必需:regexview,以及两个可选:kwargs,和name。也就是正则表达式和视图是两个必填参数。


    • Django2.1

     

    函数 path() 具有四个参数,两个必须参数:route 和 view,两个可选参数:kwargs 和 name。即路由和视图是必填参数。

    那么与旧版本的参数主要区别就在于url()是要写正则表达式(regex)的路由,而path()是写的非正则路由(route),接下来主要看一下path()函数的四个参数含义。

    1、path()参数:route
        route 是一个匹配URL的准则(类似正则表达式)。当Django响应一个请求时,它会从urlpatterns的第一项开始,按顺序依次匹配列表中的项,直到找到匹配的项。
        这些准则不会匹配GET和POST参数或域名。例如,URLconf在处理请求https://www.example.com/myapp/时,它会尝试匹配myapp/。处理请求https://www.example.com/myapp/?page=3 时,也只会尝试匹配 myapp/2、path()参数:view
        当 Django 找到了一个匹配的准则,就会调用这个特定的视图函数,并传入一个HttpRequest对象作为第一个参数,被“捕获”的参数以关键字参数的形式传入。
    3、path()参数:kwargs
        任意个关键字参数可以作为一个字典传递给目标视图函数。
    4、path()参数:name
        为你的URL取名能使你在 Django 的任意地方唯一地引用它,尤其是在模板中。这个有用的特性允许你只改一个文件就能全局地修改某个URL模式。

    参考文档:https://docs.djangoproject.com/zh-hans/2.1/intro/tutorial01/ 


    在Django2.1中,开始舍弃django1.x中的url写法。在django2.x中,描写url配置的有两个函数pathre_path

    path()

    上面介绍的path中,第一个参数route使用的是非正则表达式可以表示的普通路由路径。

    注意:

    • 要从URL捕获值,请使用尖括号。
    • 捕获的值可以选择包括转换器类型。例如,用于 <int:name>捕获整数参数。如果未包含转换器/,则匹配字符之外的任何字符串
    • 没有必要添加前导斜杠,因为每个URL都有。例如,它articles不是/articles

    默认情况下,以下路径转换器可用:

    • str- 匹配除路径分隔符之外的任何非空字符串'/'如果转换器未包含在表达式中,则这是默认值。
    • int - 匹配零或任何正整数。返回一个int
    • slug - 匹配由ASCII字母或数字组成的任何slug字符串,以及连字符和下划线字符。例如, building-your-1st-django-site
    • uuid - 匹配格式化的UUID。要防止多个URL映射到同一页面,必须包含短划线并且字母必须为小写。例如,075194d3-6885-417e-a8a8-6c931e272f00返回一个 UUID实例。
    • path- 匹配任何非空字符串,包括路径分隔符 '/'这使您可以匹配完整的URL路径,而不仅仅是URL路径的一部分str

    比如要匹配一个视图中的函数路由,该函数有两个形参:

    def peopleList(request,book_id)

    第一个request是默认的,那么路径自动匹配该函数的第二个形参,匹配格式:<int:book_id>,并返回一个正整数或零值。

    re_path()

    而如果遇上路径和转换器语法都不足以定义的URL模式,那么就需要使用正则表达式,这时候就需要使用re_path(),而非path()。

    1 from django.urls import re_path

    在Python正则表达式中,命名正则表达式组的语法是(?P<name>pattern)name的名称,并且 pattern是要匹配的模式。

    还是以上图圈中的部分为例,也是可以用正则表达式来写的。如下:

    1 re_path(r'^(d+)/$',views.peopleList,name='peopleList'),

    这样也是可以匹配到views视图中的peopleList函数的形参的。

    所以这两种使用方式在使用上根据实际情况自行使用。


    额外补充:

    在二级路由(也即app的urls文件中),在urlpatterns后,应该加上app_name='app_name(你的app名称)',否则会报错。

    学三境: 一境:昨夜西风凋碧树,独上高楼,望尽天涯路; 二境:衣带渐宽终不悔,为伊消得人憔悴; 三境:众里寻‘它’千百度,蓦然回首,那斯却在,灯火阑珊处。
  • 相关阅读:
    69期-Java SE-046_JSP-3
    69期-Java SE-045_JSP-2
    69期-Java SE-044_JSP-1
    69期-Java SE-043_Servlet-1
    69期-Java SE-042_Tomcat-1
    Sublime Text3快捷键
    http协议与https协议的前世今生
    解决并发问题,数据库常用的两把锁——悲观锁,乐观锁
    springboot解决文件上传大小限制
    docker基本操作
  • 原文地址:https://www.cnblogs.com/cpl9412290130/p/9611293.html
Copyright © 2020-2023  润新知