• Django的路由系统:URL


    一、 URLconf配置

    1. 基本格式

      from django.conf.urls import url
      urlpatterns = [
           url(正则表达式, views视图,参数,别名),
      ]
      
      • 参数说明
        • 正则表达式:一个正则表达式字符串
        • views视图:一个可调用对象,通常为一个视图函数
        • 参数:可选的要传递给视图函数的默认参数(字典形式)
        • 别名:一个可选的name参数
    2. django 2.0版本的路由系统

      • 2.0版本中re_path和1.11版本的url是一样的用法
      from django.urls import path,re_path
      urlpatterns = [
          path('articles/2003/', views.special_case_2003),
      ]
      

    二、 正则表达式

    1. 基本配置

      from django.conf.urls import url
      from . import views
      urlpatterns = [
          url(r'^articles/2003/$', views.special_case_2003),
      ]
      
    2. 注意事项

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

      • 是否开启URL访问地址后面不为/跳转至带有/的路径的配置项:APPEND_SLASH=True
      • Django settings.py配置文件中默认没有 APPEND_SLASH 这个参数,但 Django 默认这个参数为 APPEND_SLASH = True,其作用就是自动在网址结尾加'/'

    三、 分组命名匹配

    1. 分组:使用简单的正则表达式分组匹配(通过圆括号)来捕获URL中的值并以位置参数形式传递给视图函数

      from django.conf.urls import url
      from . import views
      urlpatterns = [
          url(r'^articles/([0-9]{4})/$', views.year_archive),
          url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
      ]
      
    2. 命名分组:使用分组命名匹配的正则表达式组来捕获URL中的值并以关键字参数形式传递给视图函数

      from django.conf.urls import url
      from . import views
      urlpatterns = [
          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的第三个参数时一个字典,表示想要传递给视图函数的额外关键字参数
        • 当传递额外参数的字典中的参数和URL中捕获值的命名关键字参数同名时,函数调用时,将使用的是字典中的参数,而不是URL中捕获的参数
        • 即优先级:额外参数 > URL捕获参数
    3. UPLconf匹配的位置:

      • URLconf 在请求的URL 上查找,将它当做一个普通的Python字符串,不包括GET和POST参数以及域名
        • http://www.example.com/myapp/请求中,URLconf 将查找 /myapp/
        • http://www.example.com/myapp/?page=3请求中,URLconf 仍将查找 /myapp/
      • URLconf 不检查请求的方法,即所有的请求方法(同一个URL的POST、GET、HEAD等),都将路由到相同的函数
    4. 捕获的参数都是字符串:每个在URLconf中捕获的参数都作为一个普通的Python字符串传递给视图函数,无论正则表达式使用的是什么匹配方式

    5. 有个别情况,需要视图函数指定默认值

      # urls.py中
      from django.conf.urls import url
      from . import views
      urlpatterns = [
          url(r'^blog/$', views.page),
          url(r'^blog/page(?P<num>[0-9]+)/$', views.page),
      ]
      # 两个URL模式指向相同的view,但是第一个模式并没有从URL中捕获任何东西
      
      # views.py中,可以为num指定默认值
      def page(request, num="1"):
          pass
      # 如果第一个模式匹配上了,page函数将使用其默认参数num=“1”,如果第二个模式匹配,page将使用正则表达式捕获到的num值
      
    6. include:路由分发

      • 根据功能或种类的不同,可以把不同的功能的路由写在该功能的app文件下,利用include联系起来,相当于把不同功能的url放在不同的空间里
      from django.conf.urls import include, url
      urlpatterns = [
         url(r'^admin/', admin.site.urls),
         url(r'^app01/', include('app01.urls')),  # 可以包含其他的URLconfs文件
      ]
      
      • 补充:app01.urls
      from django.conf.urls import url
      from . import views
      urlpatterns = [
          url(r'^blog/$', views.blog),
          url(r'^blog/(?P<year>[0-9]{4})/(?P<month>d{2})/$', views.blogs),
      ]
      
      • include有一个命名空间的参数:namespace
        • 便于区分不同路由空间中存在的同名函数,利于指定到确切的函数
      from django.conf.urls import include, url
      urlpatterns = [
          url(r'^app01/', include('app01.urls', namespace='app01')),
          url(r'^app02/', include('app02.urls', namespace='app02')),
      ]
      

    四、URL的命名和反向解析

    4.1 URL命名

    1. url的第四个参数是起一个别名,即一个可选的name参数

    2. 命名方式:name = '别名'

      from django.conf.urls import url
      urlpatterns = [
      	url(r'^home', views.home, name='home'),        # 给我的url匹配模式起名为 home
      	url(r'^index/(d*)', views.index, name='index'),       # 给我的url匹配模式起名为index
      ]
      

    4.2 反向解析

    1. 反向解析:通过别名获取完整URL路径

    2. 情况一:静态路由

      • 命名
      from django.conf.urls import url
      urlpatterns = [
      	url(r'^blog/$', views.blog, name='blog'),
      ]
      
      • 模板中使用
      {% url 'blog' %}		    {# 完整URL路径:/blog/ #}
      
      • py文件中使用
      from django.urls import reverse
      reverse('blog') 		     # 完整URL路径:/blog/
      
    3. 情况二:分组

      • 命名
      from django.conf.urls import url
      urlpatterns = [
      	url(r'^blog/([0-9]{4})/(d{2})/$', views.blogs, name='blogs'),
      ]
      
      • 模板中使用
      {% url 'blogs' 2222 12 %}	    {# 完整URL路径:/blog/2222/12/ #}
      
      • py文件中使用
      from django.urls import reverse
      reverse('blogs',args=('2019','06'))	      # 完整URL路径:/blog/2019/06/ 
      
    4. 情况三:命名分组

      • 命名
      from django.conf.urls import url
      urlpatterns = [
      	url(r'^blog/(?P<year>[0-9]{4})/(?P<month>d{2})$', views.blogs, name='blogs'),
      ]
      
      • 模板中使用
      {% url 'blogs' year=2222 month=12 %}	     {# 完整URL路径:/blog/2222/12/ #}
      
      • py文件中使用
      from django.urls import reverse
      reverse('blogs',kwargs={'year':'2019','month':'06'})      # 完整URL路径:/blog/2019/06/ 
      

    五、 命名空间模式下的反向解析

    1. 项目目录下的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')),
      ]
      
    2. app01中的urls.py

      from django.conf.urls import url
      from app01 import views
      urlpatterns = [
          url(r'^(?P<pk>d+)/$', views.detail, name='detail')
      ]
      
    3. app02中的urls.py

      from django.conf.urls import url
      from app02 import views
      urlpatterns = [
          url(r'^(?P<pk>d+)/$', views.detail, name='detail')
      ]
      
    4. 反向解析语法:'命名空间名称:URL名称'

      • 在模板中的使用方式
      {% url 'app01:detail' pk=12 %}
      {% url 'app02:detail' pk=12 %}
      
      • 在py文件中的使用方式
      from django.urls import reverse
      reverse('app01:detail', kwargs={'pk':11})
      reverse('app01:detail', kwargs={'pk':11})
      
    5. 注意:如果有多层路由分发,有了多个命名空间名称,都要把命名空间名称一层一层加在别名前面

      {# 简单示例:app01是第一层路由空间的namespace,xxx是第二层路由空间的namespace #}
      {% url 'app01:xxx:index' %}
      
  • 相关阅读:
    面试题总结
    软件测试面试心得
    git上传本地文件到gitee上
    一个测试员失业的自述
    整理了Linux常用命令变量
    java B2B2C多用户商城系统-搜索分词架构分享
    B2B2C商城系统-Table组件封装代码分享
    Javashop 电商系统sso登录实现
    b2b2c商城系统-会员预存款架构及源码分享
    java 商城系统源码分享-snowflake发号器
  • 原文地址:https://www.cnblogs.com/zengyi1995/p/11140527.html
Copyright © 2020-2023  润新知