视图层:
Django 有视图的观点来封装逻辑负责来处理用的请求和返回响应。
找到需要的直到视图通过下面的信息:
URL dispatcher URL调度器
一个干净,优雅的URL scheme是一个重要的细节在一个高质量的Web应用。
Django 让你设计URLs,没有框架限制
没有.php 或者.cgi 需要
概述:
设计URL 对于一个app,你创建一个Python 模块通俗的称为一个URlconf(URL 配置).
这个模块是纯Python代码的,是一个简单的映射在URL 模式和Python函数之间
这种映射可以是短的,或者按需的。 可以参考其他映射。
因为它是纯Python代码,可以动态的重构
Django 如何处理一个请求:
当一个用户骑牛一个页面从Django-powered site, 这是系统遵循的算法来决定 哪段Python代码需要执行:
1.Django 决定root URLconf 模块来使用,通常,这是ROOT_URLCONF setting
但是如果进来的HttpRequest 请求有一个urlconf 属性,它的值会代替ROOT_URLCONF 设置
2.Django 加载 Python 模块,寻找变量url欧式
这是一个Python列表在 django.conf.urls.url()
3.Django 运行通过每个URL 模式,顺序的,在第一个匹配后就停止
4. 一旦一个表达式匹配,Django 导入和调用给定的视图,是一个简单的函数(或者一个基于类的视图)
视图通过以下参数
1.一个HttpRequest实例
2.如果匹配的正则表达式 返回 no named groups,
然后从正则表达式匹配的是作为位置参数:
3.关键参数是由任何命名组通过正则表达式组成的,
例子:
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),
]
注意:
1.从URL 捕获一个值,只需在它周围放入一个圆括号
2. 没有必要增加一个前导的斜杠,因为每个URL都有,例如 it’s ^articles, not ^/articles.
3. 'r' 在每个正则表达式字符串前是可选的,但是是推荐的。
它告诉Python 一个字符串是"raw"
Example requests:
1. 一个请求到/articles/2005/03/ 会匹配第3个条目在列表里。
Django 会调用函数 views.month_archive(requests,'2005','03');
url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
def month_archive(request, year,month):
print '-----------------'
print year
print month
print '-----------------'
response = "zhaoyangjian TLCB You're looking at the second results of question %s %s" %(year,month)
return HttpResponse(response )
http://192.168.137.3:9000/articles/2005/09/
zhaoyangjian TLCB You're looking at the second results of question 2005 09
-----------------
2005
09
-----------------
[28/Jan/2018 12:03:05] "GET /articles/2005/09/ HTTP/1.1" 200 75
2.
/articles/2005/3/ 不会匹配任何URL 模式, 因为第3条在list需要2个数字对于月份
url(r'^articles/([0-9]{4})/$', views.year_archive),
3.
/articles/2003/ 会匹配第一个模式, 不是第2个,因为模式是按顺序测试的,第一个模式是第一个测试通过的。
def special_case_2003(req):
print '-------------------'
print '-------------------'
return HttpResponse('year')
def special_case_2003(req):
print '-------------------'
print '-------------------'
return HttpResponse('year')
def year_archive(request, aaaa):
print '-------------------------'
print aaaa
print '-------------------------'
response = "You're looking at first the results of question %s."
return HttpResponse(response % aaaa)
3./articles/2003/ 会匹配 第一个模式,不是第2个,因为模式测试是按顺序的,
第一个是第一个通过的测试。
/articles/2003 不会匹配上面3个模式,因为每个模式需要URL 以斜杠结束
4.
/articles/2003/03/03/ would match the final pattern. Django would call the function views.article_detail(request, '2003', '03', '03').
Named groups 命名分组
上面的例子使用简单,非命名正则表达式分组(通过括号)来捕获URL的位置和传递它们作为额外的参数到一个视图。
在更高级的用法里,它是可以使用命名正则表达式分组来捕获URL的位作为键值参数到一个视图
在Python 正则表达式,命名正则表达式分组是(?P<name>pattern), name 是group的名字,模式是匹配的模式
from django.conf.urls import url
from . 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),
]
这个与之前的例子完全相同, 有一个细微的区别:捕获的值是传递到视图函数作为键值相比作为位置参数:
1.
一个请求到 /articles/2005/03/ 会调用函数 views.month_archive(request, year='2005', month='03'), instead of views.month_archive(request, '2005', '03').
url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', newview.month_archive),
def month_archive(request, year,month):
print '-----------------'
print year
print month
print '-----------------'
response = "zhaoyangjian TLCB You're looking at the second results of question %s %s" %(year,month)
return HttpResponse(response )
http://192.168.137.3:9000/articles/2003/03/
zhaoyangjian TLCB You're looking at the second results of question 2003 03
2.
A request to /articles/2003/03/03/ would call the function views.article_detail(request, year='2003', month='03', day='03').
一个请求到/articles/2003/03/03/ 会调用函数 views.article_detail(request, year='2003', month='03', day='03').
def article_detail(req,year,month,day):
print year
print month
print day
return HttpResponse(year+month+day)
匹配和分组算法:
这里的算法URLconf 解析如下,相当于命名粉盒和非命名分组
1.如果有任何命名参数,它会使用那些,忽略未命名参数
2.否则,它会传递所有非命名参数作为位置参数
URLconf 搜索什么?
URLconf 搜索请求的URL,作为一个Python字符串。这个不包括GET或者POST参数,或者域名
For example, in a request to https://www.example.com/myapp/, the URLconf will look for myapp/.
比如,在一个请求到 https://www.example.com/myapp/, URLconf 会查找myapp/
In a request to https://www.example.com/myapp/?page=3, the URLconf will look for myapp/.
在一个请求到 https://www.example.com/myapp/?page=3 URLconf 会查找myapp/
URLconf 不看请求方法,换句话说,所有的请求方法 POST, GET, HEAD, etc
会被路由到相同的函数对于相同的URL
捕获的参数总是字符串
每个捕获的参数是发送到视图作为一个Python字符串
url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
year 参数传递到view.year,year_archive()是一个字符串的,
不是整数,尽管通过[0-9]{4} 只是匹配整数的字符串
指定视图参数的默认值:
一个方便的技巧是为视图参数指定默认参数,有一个URLconf 和视图:
url(r'^blog/$', newview.page),
url(r'^blog/page(?P<num>[0-9]+)/$', newview.page),
def page(request,num="1"):
print num
return HttpResponse(num)
url(r'^blog/$', views.page),
url(r'^blog/page(?P<num>[0-9]+)/$', views.page),
在上面的例子, URL 模式指向相同的视图--views.page
但是第一个模式不捕获。
如果第一个模式匹配, page() 函数会使用它的默认参数对于num =1
如果第2个模式匹配,page() 会使用捕获的值
Performance 性能:
每个正则表达式在一个urlpatterns是在第一次被编译,这使得系统非常快
Including other URLconfs 包含其他URLconfs
在任何时候,你的urlpatterns 可以包含其他URLconf模块,这个本质上'roots' 是在其他urls下的一组URLs
例如,这里有一个 URLconf的引用对于Django website 本身,它包含了一些其他URLconfs的
from django.conf.urls import include, url
urlpatterns = [
# ... snip ...
url(r'^community/', include('django_website.aggregator.urls')),
url(r'^contact/', include('django_website.contact.urls')),
# ... snip ...
]
注意,在这里例子中的正则表达式没有一个$(字符串尾部匹配字符) 但确实包含一个斜杠。
当Django 遇到include() (django.conf.urls.include()), 它砍下 URL匹配的部分
url(r'^delEquipment/',include("news.urls")),
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^(?P<year>[0-9]{4})/$', views.year_archive),
url(r'^(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
url(r'^(?P<delip>[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3})/$', views.delEquipment),
url(r'^date/$', views.my_view),
url(r'^onearray/$', views.onearray),
url(r'^displayonearray/$', views.displayonearray),
url(r'^displayarrays/$', views.displayarrays),
url(r'^arrays/$', views.arrays),
]
Captured parameters 捕获参数:
一个包含的URLconf 接收任何捕获的参数从父URLconfs,因此下面的例子是正确的: