• Django路由系统-分组命名匹配


    Django路由系统

    分组命名匹配

    ​ 在上述基本配置示例中,使用了简单的正则表达式分组匹配来捕获URL中的值并以位置参数的形式传递给视图,例如url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive)。而更高级的用法是,使用分组命名正则表达式组来捕获URL中的值并以关键字参数的形式传递给视图。

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

    【示例】

    from django.conf.urls import url
    
    from . import views
    
    urlpatterns = [
        url(r'^articles/2003/$', views.special_case_2003),
        url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
        url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
        url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
    ]
    

    这个实现与前面的示例只有一个小的差别:捕获的值作为关键字参数而不是位置参数传递给视图函数。

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^jjzz/(?P<year>[0-9]{4})/$', views.Index.as_view()),
    ]
    
    # 当通过/jjzz/2019/进行访问时,就相当于以 views.Index.as_view(request,year='2019')
    # 在views函数中要加上关键字参数或者使用**kwagrs接收参数,如下:
    	class Index(View):
        jjzz = 'jjzz on the world'
        def get(self, request,**kwargs):
            print(kwargs)
            print(kwargs["year"])
            return JsonResponse({'jjzz': self.jjzz})
            
            或者def get(self, request,year):
    

    分组命名匹配的特点

    ​ 使用分组命名匹配的方式可以让URLconf 更加明晰且不容易产生参数顺序问题的错误;但是一定程度上认为,分组命名组语法太丑陋、繁琐。

    URLconf匹配的位置

    ​ URLconf 在请求的URL 上查找,将它当做一个普通的Python 字符串。不包括GET和POST参数以及域名。

    ​ 例如,http://www.example.com/myapp/ 请求中,URLconf 将查找 /myapp/ 。

    ​ 在http://www.example.com/myapp/?page=3 请求中,URLconf 仍将查找 /myapp/ 。

    ​ URLconf 不检查请求的方法。也就是说,所有的请求方法 —— 同一个URL的POSTGETHEAD等等 —— 都将路由到相同的函数。

    捕获的参数永远都是字符串

    ​ 无论正则表达式使用的是什么匹配方式,每个在URLconf中捕获的参数都作为一个普通的Python字符串传递给视图。例如,下面这行URLconf 中:

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

    传递到视图函数views.year_archive() 中的year参数永远是一个字符串类型。

    视图函数中指定默认值

    在urls配置中
    urlpatterns = [
        url(r'^jjzz/', views.Index.as_view()),
        url(r'^jjzz/(?P<year>[0-9]{4})/$', views.Index.as_view()),
    ]
    
    在views配置中
    	class Index(View):
        jjzz = 'jjzz on the world'
        def get(self, request, year='2019'):
            return JsonResponse({'jjzz': self.jjzz})
    

    ​ 在上述的配置前提下,两个URL模式指向相同的view views.Index.as_view() 但是第一个模式并没有从URL中捕获任何东西。如果第一个模式匹配上了,gte()函数将使用其默认参数year='2019',如果第二个模式匹配,page()将使用正则表达式捕获到的year的值。

    include其他的URLconfs

    当urls配置在APP中时,这时需要使用include函数将其从APP中引用到主urls中。

    # 在项目urls中的配置
    from django.conf.urls import url
    from django.conf.urls import include
    from django.contrib import admin
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^app01/', include("app01.urls")),
    ]
    
    # 在app01中的配置
    from django.conf.urls import url
    from . import views
    
    urlpatterns = [
        url(r'^jjzz/(?P<year>[0-9]{4})/$', views.Index.as_view()),
        url(r'^fileupload/$', views.Upload.as_view()),
    ]
    
    # 访问时的路由地址
    http://127.0.0.1:8000/app01/jjzz/2019/
    
    # 相当 主目录 指到 子目录 再指到 函数,类似于路径的拼接
    

    给视图函数传递额外的参数

    ​ 上篇博客介绍过URL的基本格式,其中第三个位置可以以字典的形式向视图传递参数,官方定义django.conf.urls.url() 可以接收一个可选的第三个参数,它是一个字典,表示想要传递给视图函数的额外关键字参数。

    ​ 【示例】

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^jjzz/(?P<year>[0-9]{4})/$', views.Index.as_view(),{"type":"XXXXXX"}),
        url(r'^fileupload/$', views.Upload.as_view()),
    ]
    
    # 在视图的对应函数中,需要定义额外参数来接收
    class Index(View):
        jjzz = 'jjzz on the world'
        def get(self, request,**kwargs):
            print(kwargs)
            print(kwargs["year"])
            print(kwargs["type"])
            return JsonResponse({'jjzz': self.jjzz})
    
  • 相关阅读:
    国外的零日漏洞记录片(中文字幕)
    浅谈网络爬虫中广度优先算法和代码实现
    浅谈网络爬虫中深度优先算法和简单代码实现
    Python正则表达式的简单应用和示例演示
    Python正则表达式初识(十)附正则表达式总结
    Python正则表达式初识(九)
    Python正则表达式初识(八)
    Python正则表达式初识(七)
    Python正则表达式初识(六)
    Python正则表达式初识(五)
  • 原文地址:https://www.cnblogs.com/jjzz1234/p/11619870.html
Copyright © 2020-2023  润新知