python 之 Django框架(路由系统、include、命名URL和

系统 1441 0

12.36 Django的路由系统

基本格式:

            
              from
            
             django.conf.urls 
            
              import
            
            
               url
urlpatterns 
            
            =
            
               [
     url(正则表达式, views视图函数,参数,别名),
]
​
正则表达式:   一个正则表达式字符串
views视图函数:一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
参数:        可选的要传递给视图函数的默认参数(字典形式)
别名:        一个可选的name参数
            
          
12.361 路由正则表达式
            
              from
            
             django.conf.urls 
            
              import
            
            
               url

            
            
              from
            
             django.contrib 
            
              import
            
            
               admin

            
            
              from
            
             app01 
            
              import
            
            
               views
​
urlpatterns 
            
            =
            
               [
    url(r
            
            
              '
            
            
              ^admin/
            
            
              '
            
            
              , admin.site.urls),
    url(r
            
            
              '
            
            
              ^book_list/([0-9]{4})/(\d{2})
            
            
              '
            
            , views.book_list),
            
              #
            
            
              通过括号捕获位置参数:(4位数字)、(2位数字)
            
            
              #
            
            
               publisher_list(request, x, y)
            
            
                  
    url(r
            
            
              '
            
            
              ^publisher_list/(?P
              
                [0-9]{4})/(?P
                
                  \d{2})
                
              
            
            
              '
            
            
              , views.publisher_list),
    
            
            
              #
            
            
               publisher_list(request, n, m)     #通过括号捕获关键字参数
            
            
              #
            
            
              传递额外的参数给视图函数(了解)
            
            
    url(r
            
              '
            
            
              ^demo1/([0-9]{4})/(\d{2})/$
            
            
              '
            
            , views.demo1, {
            
              "
            
            
              name
            
            
              "
            
            : 
            
              "
            
            
              egon
            
            
              "
            
            
              }),
    
            
            
              #
            
            
              可选的要传递给视图函数的字典形式参数,如果字典的key和分组命名匹配冲突,则以字典形式的额外参数为准
            
            
            
              #
            
            
              view函数设置默认值参数  
            
            
    url(r
            
              '
            
            
              ^blog/$
            
            
              '
            
            , views.page),                
            
              #
            
            
              使用默认值num=1 
            
            
    url(r
            
              '
            
            
              ^blog/(?P
              
                [0-9]+)/$
              
            
            
              '
            
            , views.page), 
            
              #
            
            
              使用自己匹配到的值 
            
            
              ]

            
            
              #
            
            
               views.py中,可以为num指定默认值
            
            
              def
            
             page(request, num=
            
              "
            
            
              1
            
            
              "
            
            
              ):
    
            
            
              pass
            
          

1、urlpatterns中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续。 2、若要从URL中捕获一个值,只需要在它周围放置一对圆括号( 分组匹配 )。 3、不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。 4、每个正则表达式前面的'r' 是可选的但是建议加上

注意:

            
              #
            
            
              是否开启URL访问地址后面不为'/'跳转至带有'/'的路径的配置项
            
            
APPEND_SLASH=
            
              True

            
            
              #
            
            
              捕获的参数永远都是字符串
            
            
              
#
            
            
              分组匹配,分组命名匹配, 不能混着用
            
          
12.362 include其他的URLconfs
            
              from
            
             django.conf.urls 
            
              import
            
            
               include, url
urlpatterns 
            
            =
            
               [
   url(r
            
            
              '
            
            
              ^admin/
            
            
              '
            
            
              , admin.site.urls),
   url(r
            
            
              '
            
            
              ^app01/
            
            
              '
            
            , include(
            
              '
            
            
              app01.urls
            
            
              '
            
            )),  
            
              #
            
            
               可以包含其他的URLconfs文件
            
            
]
          
12.363 命名URL和URL反向解析
            url(r
            
              '
            
            
              ^home
            
            
              '
            
            , views.home, name=
            
              '
            
            
              home
            
            
              '
            
            ),          
            
              #
            
            
                给url匹配模式起别名为 home
            
            
url(r
            
              '
            
            
              ^index/(\d*)
            
            
              '
            
            , views.index, name=
            
              '
            
            
              index
            
            
              '
            
            ),  
            
              #
            
            
                给url匹配模式起名为index
            
          

在模板语言中根据别名找到url:

            
              #
            
            
              无参:
            
            
{% url 
            
              '
            
            
              home
            
            
              '
            
             %
            
              }

            
            
              #
            
            
              位置参数:
            
            
{% url 
            
              "
            
            
              home
            
            
              "
            
            
              "
            
            
              2019
            
            
              "
            
            
              "
            
            
              9
            
            
              "
            
             %
            
              }

            
            
              #
            
            
              关键字参数:
            
            
{% url 
            
              "
            
            
              home
            
            
              "
            
            
              "
            
            
              year
            
            
              "
            
            =2019 
            
              "
            
            
              month
            
            
              "
            
            =9 %}
          

在views.py中根据别名找到 url:

            
              from
            
             django.urls 
            
              import
            
            
               reverse

            
            
              from
            
             django.shortcuts 
            
              import
            
            
               redirect
​

            
            
              def
            
            
               redirect_to_year(request):
    year 
            
            = 2006
    
            
              #
            
            
              无参URL:reverse('别名')
            
            
              #
            
            
              位置参数:reverse("别名", args=("2018", ))
            
            
              #
            
            
              关键字参数:reverse("别名", kwargs={"k1":参数1, ...})
            
            
              return
            
             redirect(reverse(
            
              '
            
            
              news-year-archive
            
            
              '
            
            , args=
            
              (year,)))
    
            
            
              return
            
             redirect(reverse(
            
              '
            
            
              news-year-archive
            
            
              '
            
            , kargs={
            
              '
            
            
              year
            
            
              '
            
            :2006}))
          
12.364 命名空间模式

project中的urls.py:

            
              from
            
             django.conf.urls 
            
              import
            
            
               url, include
 
urlpatterns 
            
            =
            
               [
    url(r
            
            
              '
            
            
              ^app01/
            
            
              '
            
            , include(
            
              '
            
            
              app01.urls
            
            
              '
            
            , namespace=
            
              '
            
            
              app01
            
            
              '
            
            
              )),
    url(r
            
            
              '
            
            
              ^app02/
            
            
              '
            
            , include(
            
              '
            
            
              app02.urls
            
            
              '
            
            , namespace=
            
              '
            
            
              app02
            
            
              '
            
            
              )),
]
            
          

app01中的urls.py:

            
              from
            
             django.conf.urls 
            
              import
            
            
               url

            
            
              from
            
             app01 
            
              import
            
            
               views
 
app_name 
            
            = 
            
              '
            
            
              app01
            
            
              '
            
            
              
urlpatterns 
            
            =
            
               [
    url(r
            
            
              '
            
            
              ^(?P
              
                \d+)/$
              
            
            
              '
            
            , views.detail, name=
            
              '
            
            
              detail
            
            
              '
            
            
              )
]
            
          

app02中的urls.py:

            
              from
            
             django.conf.urls 
            
              import
            
            
               url

            
            
              from
            
             app02 
            
              import
            
            
               views
 
app_name 
            
            = 
            
              '
            
            
              app02
            
            
              '
            
            
              
urlpatterns 
            
            =
            
               [
    url(r
            
            
              '
            
            
              ^(?P
              
                \d+)/$
              
            
            
              '
            
            , views.detail, name=
            
              '
            
            
              detail
            
            
              '
            
            
              )
]
            
          

现在,两个app中 url名称重复了,反转URL的时候就可以通过命名空间的名称得到当前的URL

在模板语言中根据别名找到url:

            {% url 
            
              "
            
            
              命名空间:别名
            
            
              "
            
             参数1, 参数2... %
            
              }

            
            
              #
            
            
              无参:
            
            
{% url 
            
              '
            
            
              app01:detail
            
            
              '
            
             %
            
              }

            
            
              #
            
            
              位置参数:
            
            
{% url 
            
              "
            
            
              app01:detail
            
            
              "
            
            
              "
            
            
              2019
            
            
              "
            
            
              "
            
            
              9
            
            
              "
            
             %
            
              }

            
            
              #
            
            
              关键字参数:
            
            
{% url 
            
              '
            
            
              app01:detail
            
            
              '
            
             pk=12  %
            
              }
{
            
            % url 
            
              "
            
            
              app01:detail
            
            
              "
            
            
              "
            
            
              year
            
            
              "
            
            =2019 
            
              "
            
            
              month
            
            
              "
            
            =9 %}
          

在views.py中根据别名找到 url:

            
              from
            
             django.urls 
            
              import
            
            
               reverse

            
            
              from
            
             django.shortcuts 
            
              import
            
            
               redirect
​

            
            
              def
            
            
               redirect_to_year(request):
    year 
            
            = 2006
    
            
              #
            
            
              无参URL:reverse('命名空间:别名')
            
            
              #
            
            
              位置参数:reverse("命名空间:别名", args=(参数1, 参数2, ...))
            
            
              #
            
            
              关键字参数:reverse("命名空间:别名", kwargs={"k1":参数1, ...})
            
            
              return
            
             redirect(reverse(
            
              '
            
            
              app02:detail
            
            
              '
            
            , args=
            
              (year,)))
    
            
            
              return
            
             redirect(reverse(
            
              '
            
            
              app02:detail
            
            
              '
            
            , kwargs={
            
              '
            
            
              pk
            
            
              '
            
            :11}))
          

这样即使app中URL的命名相同,也可以反转得到正确的URL


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论