一、 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' %}

Django的路由系统:URL的更多相关文章

  1. python第一百零五天 ---Django 基础 路由系统 URL 模板语言 ORM 操作

    一 路由系统 URL 1 url(r'^index/',views.index) url(r'^home/', views.Home.as_view()) 2 url(r'^detail-(\d+). ...

  2. Django 框架篇(四) : 视图(view)详解 以及 路由系统(url)

    |--Django的View(视图) |-- CBV和FBV: |-- 给视图增加装饰器: |-- request对象: |-- response对象: |-- Django的路由系统(url): | ...

  3. Django之 路由系统

    Django的路由系统 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个URL调用这 ...

  4. Django 的 路由系统

    Django 的路由系统 URL 配置(URLconf)就像Django 锁支撑网站的目录. 它的本质就是URL 与要为该URL 调用的视图函数之间的映射表. 你就是以这种方式告诉Django, 对于 ...

  5. Django 路由系统URL 视图views

    一.Django URL (路由系统) URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表:你就是以这种方式告诉Djan ...

  6. python 之 Django框架(路由系统、include、命名URL和URL反向解析、命名空间模式)

    12.36 Django的路由系统 基本格式: from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图函数,参数,别名) ...

  7. Python学习(三十一)—— Django之路由系统

    转载自:http://www.cnblogs.com/liwenzhou/p/8271147.html Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLc ...

  8. Django之路由系统 Dj

    Django之路由系统   Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调 ...

  9. Django框架----路由系统(详细)

    Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. ...

  10. Django 基础 路由系统

    Django框架简介 MVC框架和MTV框架(了解即可) MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图 ...

随机推荐

  1. zabbix4.0搭建1

    server端:负责接受到客户端发送过来的数据,并且保存到自己的数据库当中 端口:10051 agent端:负责每隔一定时间进行客户端的数据采集,并且发送给server端 端口:10050 proxy ...

  2. 【LeetCode】650. 只有两个键的键盘

    只有两个键的键盘 最初在一个记事本上只有一个字符 'A'.你每次可以对这个记事本进行两种操作: 1.Copy All (复制全部) : 你可以复制这个记事本中的所有字符(部分的复制是不允许的). 2. ...

  3. mssql的text字段中文乱码

    问题: 1.在页面存入中文后乱码,从前端从后台发现数据未发生异常,发现是存入数据库后乱码: 经查询该字段为text字段,存入中文会乱码 如图 解决办法: 1.将text转为varchar或nvarch ...

  4. ACM-ICPC 2018 沈阳赛区网络预赛 J. Ka Chang(树上分块+dfs序+线段树)

    题意 链接:https://nanti.jisuanke.com/t/A1998 给出一个有根树(根是1),有n个结点.初始的时候每个结点的值都是0.下面有q个操作,操作有两种,操作1.将深度为L(根 ...

  5. 接口测试中GET和POST两种基本HTTP请求方法的区别

    面试时,可以回答(一般答前4条就行): GET参数通过url传递,POST放在request body中 GET请求在url中传递的参数是有长度限制的,而POST没有 GET比POST更不安全,因为参 ...

  6. selenium中driver.close()和driver.quit()的不同点

    driver.quit()与driver.close()的不同:driver.quit(): Quit this driver, closing every associated windows;dr ...

  7. [C1] Andrew Ng - AI For Everyone

    About this Course AI is not only for engineers. If you want your organization to become better at us ...

  8. Java并发编程核心知识体系精讲

    第1章 开宗明义[不看错过一个亿]本章一连串设问:为什么学并发编程?学并发编程痛点?谁适合学习本课?本课程包含内容和亮点?首先4大个理由告诉你为什么要学,其实源于JD岗位要求就不得不服了.其次5个痛点 ...

  9. Codeforces Round #554 (Div. 2) D 贪心 + 记忆化搜索

    https://codeforces.com/contest/1152/problem/D 题意 给你一个n代表合法括号序列的长度一半,一颗有所有合法括号序列构成的字典树上,选择最大的边集,边集的边没 ...

  10. 执行shell脚本遇到错误syntax error: unexpected "then" (expecting "}")

    今天执行脚本的时候遇到错误,如下图: root@ApFree:/usr/sbin# ./conntrack_num_graph.sh ./conntrack_num_graph.sh: line : ...