Django URL

Django 1.11版本 URLconf官方文档

URL配置(URLconf)就像 Django 所支撑网站的目录。它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表;就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码。

一、URLconf

基本格式:

from django.conf.urls import url

urlpatterns = [
url(正则表达式, views视图函数,参数,别名),
]

参数说明:

  • 正则表达式:一个正则表达式字符串
  • views视图函数:一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
  • 参数:可选的要传递给视图函数的默认参数(字典形式)
  • 别名:一个可选的name参数

注意:

Django 2.0 版本中的路由系统已改动(官方文档

from django.urls import path

urlpatterns = [
path('articles/2003/', views.special_case_2003),
]

二、正则表达式说明

from django.conf.urls import url

from app_xx import views

urlpatterns = [
url(r'^articles/2003/$', views.special_case_2003),
url(r'^articles/([0-9]{4})/$', views.year_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]

注意:

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

示例说明:

/articles/2005/03/ 与列表中的第三个条目匹配。Django会调用 views.month_archive(request, '', '')
/articles/2005/3/ 不匹配任何URL模式,因为列表中的第三个条目需要两个月的数字
/articles/2003/ 将匹配列表中的第一个模式,而不是第二个模式。Django会调用 views.special_case_2003(request)
/articles/2003 不匹配任何这些模式,因为每个模式都要求URL以斜杠结尾
/articles/2003/03/03/ 将匹配最终模式。Django会调用 views.article_detail(request, '', '', '')

补充说明:

APPEND_SLASH=False

settings.py 配置文件中默认没有 APPEND_SLASH 这个参数,但 Django 默认这个参数为 APPEND_SLASH = True 其作用就是自动在网址结尾加 /

三、命名组

  上面的示例是使用简单的正则表达式分组匹配(通过括号)来捕获URL中的值,并将它们以位置参数形式传递给视图。在更高级的用法中,可以使用命名的正则表达式组来捕获URL位并将它们作为关键字参数传递给视图。

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

下面是以上 URLconf 使用命名组的重写:

from django.conf.urls import url

from app_xx 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),
]

都是实现相同的功能,但有一点差别:捕获的值作为关键字参数而不是位置参数传递给视图函数

/articles/2018/11/ 这样调用视图函数 views.month_archive(request, year="", month="")

实际上,使用分组命名匹配的方式可以使 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的 POST、GET、HEAD 等等,都将路由到相同的函数。

五、捕获的参数总是字符串

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

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

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

六、视图函数中指定默认值

# urls.py中
from django.conf.urls import url from app_xx import views urlpatterns = [
url(r'^blog/$', views.page),
url(r'^blog/page(?P<num>[0-9]+)/$', views.page),
] # views.py中,可以为num指定默认值
def page(request, num=""):
pass

在上面的示例中,两个URL模式都指向同一个视图 views.page,但第一个模式不会从URL捕获任何内容。如果第一个模式匹配,该 page() 函数将使用它的默认参数 num="1";如果第二个模式匹配,page() 函数将使用正则表达式捕获的 num 值。

七、include 其他的 URLconf

比如有多个app,每个app又有自己的urls,那么项目里的urls就相当于一级路由,各个app下的urls相当于二级路由。

那么各个 app 下的 urls 设置示例如下:

# app_ss/urls.py中
from django.conf.urls import url from app_ss import views urlpatterns = [
url(r"^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$", views.articles),
]

项目下的 urls 设置示例如下:

from django.conf.urls import url,include

from app_ss import urls as ss_urls
from app_xx import urls as xx_urls urlpatterns = [
url(r'^app_ss/', include(ss_urls)),
url(r'^app_xx/', include(xx_urls)),
]

什么时候在路由系统中使用 include 呢?

项目里有多个app(比如 car、house等),不同业务线使用不同的二级路由,方便管理。

示例演示:

127.0.0.1:8000/app_ss/articles/2018/10/

当访问上面的URL时,会现在项目下的 urls.py 里匹配 app_ss,当匹配成功时,就到 app_ss 应用下的 urls.py 里匹配 articles/2018/10/ ,如果匹配成功,就执行视图函数 views.articles(request, "year=2018", "month=10")

其他:

当 urlpatterns 中的正则匹配几乎都一样时,也可以使用 include 来删除冗余,如下:

八、传递额外的参数给视图函数(了解)

URLconfs 有一个钩子,允许一个 Python 字典作为额外的参数传递给视图函数。

示例:

from django.conf.urls import url
from . import views urlpatterns = [
url(r'^blog/(?P<year>[0-9]{4})/$', views.articles, {'foo': 'bar'}),
]

在这个例子中,对于请求 /blog/2005/ 的URL,Django将调用 views.articles(request, year='2005', foo='bar')

联合框架中使用此技术,可以将元数据和选项传递给视图。

九、URL反向解析

简单来说就是可以给 URL 匹配规则起个名字,一个 URL 匹配模式一个名字。这样以后就不需要写死 URL 代码了,只需要通过名字来调用当前的URL。

# urls.py中

urlpatterns = [
url(r"^pd_car/", views.car, name="car"),
url(r"^pd_house/", views.house, name="house"),
]
# views.py中

def car(request):
return render(request, "pd_car.html") def house(request):
return render(request, "pd_house.html")

还有两个html页面,即 pd_car.html 和 pd_house.html,在各自的 html 页面中使用模板语法 {% url "别名" %} ,就可链接到对应的 URL 页面中;如下面的代码那样,而不是写死的;比如,卖车页面要跳转到卖房页面,写死的格式就是这样的 href="/pd_car/",所以不推荐这样。

# pd_car.html中
<h1>卖车啦~~~</h1>
<a href="{% url 'house' %}">点击进入:卖房</a> # pd_house.html中
<h1>卖房啦~~~</h1>
<a href="{% url 'car' %}">点击进入:卖车</a>

总结:给每个 url 起别名,当 A 页面要跳转到 B 页面的时候,就在 A 页面用模板语法 {% url "B的别名" %} 即可

注意:

当要跳转的 url 带有参数的那种,比如:

url(r'^pd_car/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.car, name="car"),
url(r'^pd_house/([0-9]{4})/([0-9]{2})/$', views.house, name="house"),

那么在 html 中也要传递参数(还是上面那个例子):

# pd_car.html中
<h1>卖车啦~~~</h1>
<a href="{% url "house" 2018 10 %}">点击进入:卖房</a> # pd_house.html中
<h1>卖房啦~~~</h1>
<a href="{% url "car" year=2018 month=10 %}">点击进入:卖车</a>

views.py中也要给 url 对应的视图函数传递参数,不然无法运行

def car(request,year,month):
return render(request, "pd_car.html") def house(request,a,b):
return render(request, "pd_house.html")

十、URL命名空间

即使不同的APP使用相同的 url 名称,URL的命名空间模式也可以让你唯一反转命名的 url

示例:

# 项目 中的 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<pk>\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<pk>\d+)/$', views.detail, name='detail')
]

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

语法:"命名空间名称:URL名称"

# 模板中使用:

{% url 'app01:detail' pk=12 pp=99 %}
# views中的函数中使用

v = reverse('app01:detail', kwargs={'pk':11})

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

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

  1. Django URL (路由系统)

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

  2. URL路由系统-命名空间

    命名空间 1.工程Django下的urs.py from django.conf.urls import url,include from django.urls import path,re_pat ...

  3. python django基础二URL路由系统

    URL配置 基本格式 from django.conf.urls import url #循环urlpatterns,找到对应的函数执行,匹配上一个路径就找到对应的函数执行,就不再往下循环了,并给函数 ...

  4. day64 url用法以及django的路由系统

    此篇博客是以备后查的,用到的时候记得过来查找即可! 路由系统:就是我们的django项目创建的时候自带的那个urls.py 它本身里面是映射的对应关系,一个大的列表里面,一个个元祖,元祖里面是url或 ...

  5. Django之URL(路由系统)用法

    路由系统 路由系统概念 简而言之,路由系统就是路径和视图函数的一个对应关系.django的路由系统作用就是使views里面处理数据的函数与请求的url建立映射关系.使请求到来之后,根据urls.py里 ...

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

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

  7. day 66 Django基础二之URL路由系统

    Django基础二之URL路由系统   本节目录 一 URL配置 二 正则表达式详解 三 分组命名匹配 四 命名URL(别名)和URL反向解析 五 命名空间模式 一 URL配置 Django 1.11 ...

  8. day 53 Django基础二之URL路由系统

    Django基础二之URL路由系统   本节目录 一 URL配置 二 正则表达式详解 三 分组命名匹配 四 命名URL(别名)和URL反向解析 五 命名空间模式 一 URL配置 Django 1.11 ...

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

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

  10. Django之路由系统 Dj

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

随机推荐

  1. 【Eclipse提高开发速度-插件篇】安装VJET插件,JS等提示开发插件

    1.安装Apache Batik CSS 一般安装VJET插件会出现 Cannot complete the install because one or more required items co ...

  2. Combining an audio file with video file in python

    Combining an audio file with video file in python - Stack Overflow https://stackoverflow.com/questio ...

  3. tiny4412学习(四)之移植linux-设备树(1)设备树基础知识及GPIO中断【转】

    本文转载自:http://blog.csdn.net/fengyuwuzu0519/article/details/74177978 版权声明:本文为博主原创文章,转载请注明http://blog.c ...

  4. AngularJS 1.x 国际化——Angular-translate例子

    可运行代码如下: <!DOCTYPE html> <html ng-app="MyApp"> <head> <meta http-equi ...

  5. C++11 function使用

    function是一组函数对象包装类的模板,实现了一个泛型的回调机制. 引入头文件 #include <functional>using namespace std;using names ...

  6. Oracle group by分组拼接字符串

    select wm_concat(id),depon  from test_1  group by depon

  7. JavaScript中的substr和Java中的substring

    JavaScript::substr(index, length)从下标开始截取多少位,如果length为空,则截取到最后,-1倒数第一位,-2倒数第二位.... Java:substring(sta ...

  8. 344 Reverse String 反转字符串

    请编写一个函数,其功能是将输入的字符串反转过来.示例:输入:s = "hello"返回:"olleh"详见:https://leetcode.com/probl ...

  9. Hadoop Hive概念学习系列之hive里的视图(十二)

    不多说,直接上干货! 可以先,从MySQL里的视图概念理解入手 视图是由从数据库的基本表中选取出来的数据组成的逻辑窗口,与基本表不同,它是一个虚表.在数据库中,存放的只是视图的定义,而不存放视图包含的 ...

  10. Java系列学习(十)-包与权限修饰符

    1.形式参数和返回值的问题 (1)形式参数: A:类名:需要该类的对象 B:抽象类名:需要改类的子类对象 C:接口名:需要该接口的实现对象 (2)返回值类型: A:类名:抽象类名:返回的是该类的对象 ...