Linux运维python Django开发Python运维与数据分析

Django blog - Django url 介绍

2017-08-28  本文已影响148人  菩提老鹰

欢迎访问个人博客

Abstract

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


关于请求

这里简单说明下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
]

命名分组

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

举例如下:

(?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

上一篇 下一篇

猜你喜欢

热点阅读