• django2.0 path使用方法


    Django2.0于2017年12月2日已经正式发布。Django2.0支持Python3.4,3.5以及3.6,移除了对Python2.7的支持。官方强烈建议Python 3.x使用最新的版本。

    在Django2.0其中一个新特性为:简化Url路由的语法

    在代码上主要体现在新增了django.urls.path函数,它带来了更简洁、更可读的路由语法,如:

    原来的url

    url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
    

    Django2.0新语法

    path('articles/<int:year>/', views.year_archive),
    

    新语法支持url参数的类型转化。例子里的year_archive函数接收到的year参数作为参数,并且会自动转换year为整型而不是字符串。

    在Django1.x里,我们需要对year做类型转换:

    def year_archive(request, year):
        year = int(year)
    

    URL参数捕获

    在新的语法里,url字符串有以下规则:

    1. 在url里使用尖括号“<>”来捕获值
    2. 尖括号捕获值的格式<converter:name>。其中converter为路径转换器,name为参数名,如<int:year>。对于捕获的值没有路径转换器,那么它会匹配除了斜杠"/"外的所有字符作为捕获的值。
    3. url不需要以斜杠开头。

    代码示例

    from django.urls import path
    
    from . import views
    
    urlpatterns = [
        path('articles/2003/', views.special_case_2003),
        path('articles/<int:year>/', views.year_archive),
        path('articles/<int:year>/<int:month>/', views.month_archive),
        path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
    ]
    

    匹配示例

    • /articles/2005/03/:匹配到第3个规则,调用views.month_archive(request, year=2005, month=3)
    • /articles/2003/:匹配到第1个规则,调用views.special_case_2003(request)
    • /articles/2003:没有匹配到规则,原因是所有的规则都是以斜杠结尾
    • /articles/2003/03/building-a-django-site/:匹配到第4个规则,调用views.article_detail(request, year=2003, month=3, slug=”building-a-django-site”)

    Path Converter

    url里捕获的值使用Path Converter来对值做转换,如类型转换。Django2.0自带了默人的Path Converter,同时也支持自定义Path Conveter。

    默认Path converter

    Django2.0自带的PathConveter包括:

    • str:匹配除了路径分隔符(/)之外的非空字符串,如果没有转换器,默认使用str作为转换器。
    • int:匹配0及正整数。
    • slug:匹配字母、数字以及横杠、下划线组成的字符串。
    • uuid:匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00
    • path:匹配任何非空字符串,包含了路径分隔符(/)

    例子: path('image_codes/<uuid>', views.xxxx)  image_codes是前缀,<uuid>是django自带的配合器写法,得到的是一个UUID对象, 在视图方法中通过参数来接受这个 uuid    例如: def get(self,request,uuid) 可以打印这个UUID 得到是一个前端传过来的uuid.

    注册自定义Path Converter

    当默认的Path Converter不能满足需求时,Django2.0支持用户注册自定义的Path Converter。

    Path Converter是一个类,定义Converter类需要包含下面的属性或方法:

    • regex属性,字符串类型
    • to_python(self, value) 方法,它处理将匹配的字符串转换为应该传递给view函数的类型。 如果它不能转换给定的值,它应该抛出ValueError。
    • to_url(self, value) 方法,和 to_python 相反,它会将Python类型转换为在URL中使用的字符串。

    示例

    定义Path Converter

    class FourDigitYearConverter:
        regex = '[0-9]{4}'
    
        def to_python(self, value):
            return int(value)
    
        def to_url(self, value):
            return '%04d' % value
    

    使用register_converter()注册Converter到url配置里:

    from django.urls import register_converter, path
    
    from . import converters, views
    
    register_converter(converters.FourDigitYearConverter, 'yyyy')
    
    urlpatterns = [
        path('articles/2003/', views.special_case_2003),
        path('articles/<yyyy:year>/', views.year_archive),
        ...
    ]
    

    正则表达式匹配

    Django2.0也支持我们使用正则表达式来捕获值。注意,用正则表达式捕获值,需要使用re_path(),而不是前面介绍的path()。

    正则表达式建议使用命名正则表达式组,语法如下:

    (?P<name>pattern)
    

    其中,尖括号里的name为分组名,pattern为正则表达式。

    前面的示例可以使用正则表达式修改为:

    from django.urls import path, re_path
    
    from . import views
    
    urlpatterns = [
        path('articles/2003/', views.special_case_2003),
        re_path('articles/(?P<year>[0-9]{4})/', views.year_archive),
        re_path('articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/', views.month_archive),
        re_path('articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[w-_]+)/', views.article_detail),
    ]
    

    与前面的示例不同点:

    • 这里的代码匹配更加严格,比如year为10000就无法匹配,因为它超出了正则规定的4位数
    • 传给view函数的参数为字符串类型,这点和 Django使用url 是一样的。

    设置默认值

    在path里支持对view设置默认值。

    
    from django.urls import path
    
    from . import views
    
    urlpatterns = [
        path('blog/', views.page),
        path('blog/page<int:num>/', views.page),
    ]
    
    # View (in blog/views.py)
    def page(request, num=1):
        # Output the appropriate page of blog entries, according to num.
        ...
    

    page函数num的默认值设置为1.

  • 相关阅读:
    转发:招聘一个靠谱的 iOS
    转发:经典面试题
    APP上架证书无效:解决
    转发:Xcode插件
    Alcatraz:插件管理
    类似禅道的多条件搜索功能,比如或者并且和模糊查询和指定查询,见下图吧
    关于angularjs中,数据模型被改变,页面不刷新的解决办法
    angluar1+ionic详情页返回在原来的位置(缓存数据和页面高度)
    unable to resolve module react-native-gesture-handler from
    解决React Native:Error: Cannot find module 'asap/raw'
  • 原文地址:https://www.cnblogs.com/wangdongpython/p/10865442.html
Copyright © 2020-2023  润新知