Django blog - Django url 介绍

欢迎访问个人博客

Abstract

Django 遵从 MVC 模型,并将其特色化为 MTV 模型。T是模板template,V是视图view。模型的核心是通过用户访问的 url 来指向处理的view函数,而view函数处理后返回相应的结果。
url是所有功能的入口,所以url的编写就变得非常重要。
另外Django的URL支持re正则表达式,可以提供丰富的URL解析地址


关于请求

这里简单说明下Django的请求原理

  • 用户发起request请求到Django服务

  • Django 服务通常会根据settings.py里面的配置ROOT_URLCONF来进行模块匹配。默认ROOT_URLCONF = 'myproject.urls'

  • Django 加载该 Python 模块并寻找可用的 urlpatterns 变量。该变量是一个 Python 列表,详见myproject/myproject/urls.py

  • Django 按照顺序的方式,正则匹配每一个URL模式,在第一个与请求的URL 匹配的地方停下来(下面也符合的会被忽视)。

  • 一旦匹配到,Django 将导入并调用给出的视图中涉及到的函数。

    视图将获得如下参数:

    • 一个HttpRequest 实例(这也是为什么 view 函数的第一个参数要是 request,该实例封装了所有的 http 请求报文的信息)

    • 如果正则匹配的 url 中使用了括号分组,但却没有为分组进行命名,则使用位置参数的模式为view函数传参。强烈建议使用关键字命名的分组

    • 如果是命名的分组,则使用关键字传参的方式。但是可以被django.conf.urls.url()的可选参数kwargs覆盖。

    • 如果没有匹配到正则表达式,或者如果过程中抛出一个异常,Django 将调用一个适当的错误处理视图。

    • 函数处理完毕,返回处理后的结果。


urlpatterns

前面讲到Django会加载Python模块最终寻找 urlpatterns 变量的配置,这里该变量有自己固有的配置方式。

参考官网例子:

from django.conf.urls import url

from . 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),
    url(r'^admin/', admin.site.urls),  ## 特殊URL
    url('r'^blog/', include('blog.urls', namespace='blog')) ## 包含APP URL
]
  • 每一行url()记录都是一类URL匹配模式
  • 每个正则表达式前面的r 是可选的但是建议加上。
    它是原始的,字符串中任何字符都不应该转义。
  • 不需要添加一个前导的反斜杠,因为django自动在域名后添加了/
    比如这里: 应该是^articles 而不是^/articles
  • 如上面的最后两个配置,admin和新增的APP blog的配置。/ 后面不需要添加$
  • 若要从 URL 中捕获一个值,只需要在它周围放置一对圆括号。也就是上面提到的命名分组(即正则中的分组匹配)

命名分组

我们强烈建议使用关键字命名分组

举例如下:

(?P<articleid>\d+) 这个分组表示匹配一个或多个(+ Python正则中代表一个或者多个)任意的数字(\d 代表匹配数字),并以 articleid = 匹配到的数字,如 articleid = '123' 的方式传给view匹配到的函数。

注意:

url 捕获的所有参数都是字符串类型,虽然 \d 在正则中表示匹配数字,但传参的时候,传的都是字符串


匹配/分组算法

下面是URLconf 解析器使用的算法,针对正则表达式中的命名组和非命名组:

1、如果有命名参数,则使用这些命名参数,忽略非命名参数。
2、否则,它将以位置参数传递所有的非命名参数。
3、命名分组不允许同名

对于上面的第一条,举例验证如下:

## urls.py
url(r'add/(\d+)/(?P<num1>\d+)/(?P<num2>\d+)/', add, name='add'),

## views.py
def add(request, num1, num2):
    num1 = int(num1)
    num2 = int(num2)
    return HttpResponse(num1 + num2)

在实际中看到这里有三个参数,比如我们有地址 /add/789/456/123,匹配到了上面的这条URL记录,然后对应的解析到view函数add

实际返回的结果是 456+123=679 而不是 789+456+123=1368
请自行实践操作验证哦


url() 中的name

name 可以用于在 templates, models, views ……中得到对应的网址,相当于给网址取了个名字,只要这个名字不变,网址变了也能通过名字获取到。

举例说明:
我们有如下URL请求

url(r'add/(\d+)/(?P<num1>\d+)/(?P<num2>\d+)/', views.add, name='add'),

在模板中存在一个add.html的页面

<a href="{% url 'add' 4 5 %}">计算求和</a>
# 这里的HTML的地址最终会被解析成
<a href="/add/4/5">计算求和</a>

如果我们的URL地址发生变化,变成:

url(r'new_add/(\d+)/(?P<num1>\d+)/(?P<num2>\d+)/', views.add, name='add'),

只要我们上面的name='add' 不发生变化,HTML页面的中<a href="{% url 'add' 4 5 %}">计算求和</a> 将会自动解析成<a href="/new_add/4/5">计算求和</a>

这里也就要求我们在HTML模板页面中不要用写死的方式写URL地址哦,而要用 {% url 'xxx' %}的方式


参考:
https://docs.djangoproject.com/en/1.11/topics/http/urls/
http://code.ziqiangxuetang.com/django/django-url-name.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,757评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,478评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,540评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,593评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,903评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,329评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,659评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,383评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,055评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,337评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,864评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,227评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,820评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,999评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,750评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,365评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,260评论 2 258

推荐阅读更多精彩内容