Django 之 URL(路由)分发机制
本质
(1):它的本质是 URL 模式以及要为该 URL 模式调用的视图函数之间的映射表。
django-admin.py startproject 运行时,该脚本会自动为你建了一份 URLconf(URL configuration)(即 urls.py 文件)。
由于它是纯Python代码(pure Python code),可以动态创建(Dynamically Constructed).
(2):Django 把这个记录到ROOT_URLCONF 中
ROOT_URLCONF
Default: Not defined
自动创建的settings.py包含一个ROOT_URLCONF配置用来指向自动产生的urls.py. 打开文件settings.py你将看到如下:
ROOT_URLCONF = 'mysite.urls'
# 相对应的文件是mysite/urls.py
一个字符串代表完整的Python导入路径URLconf根,如’mydjangoapps.urls’,可以覆盖根据每条请求通过设置属性urlconf传入的HttpRequest对象。
(3):当访问 URL /hello/ 时,Django 根据 ROOT_URLCONF 的设置装载 URLconf 。 然后按顺序逐个匹配URLconf里的URLpatterns,直到找到一个匹配的。
当找到这个匹配 的URLpatterns就调用相关联的view函数,并把 HttpRequest 对象作为第一个参数。
(4):视图函数必须返回一个HttpResponse,Django转换HttpResponse为一个适合的HTTP response, 以Web page显示出来
patterns()函数
urlpatterns should be a Python list,in the format returned by the function patterns()
#django.conf.urls.defaults.patterns()
django.conf.urls.defaults import * # import patterns()
- patterns(prefix, pattern_description, ...)
The first arguement to patterns() is a string prefix(前缀)
The remaining(剩余的) arguements should be tuples :
一般我们将patterns()函数返回的值保存到 urlpatterns变量中.
Once one of the regexes matches, Django imports and calls the given view, which is a simple Python function.
视图函数使用HttpRequest对象作为第一个参数,任何值捕获的正则表达式作为其他参数。
def myblog(request,id,name):
pass
url()函数
You can use the url() function, instead of a tuple, as an argument to patterns()
语法:
url(regex, view, kwargs=None, name=None, prefix='')
urlpatterns =patterns('djtest.views',
(r'^json/$','json'),
url(r'^geturl/$','geturls',name='get_urls'),
)
#如果patterns()没有前缀的话,也可这样:
urlpatterns += patterns('',
url(r'^geturl2/$','geturl2',name='geturl2_test',prefix='djtest.views'),
)
include()函数
include(<module or pattern_list>)
your urlpatterns can “include” other URLconf modules!
通常用于分类处理,使项目中urls高度统一.如:
urlpatterns +=patterns('',
(r'^blog/',include('myblog.urls')), #myblog app 中urls
(r'^manage/',include('manager.urls')), #manage app 中urls
)
注意:
(1)include() 的正则表达式并不包含一个 $ (字符串结尾匹配符),但是包含了一个斜杆/。
(2)每当Django遇到 include() 时,它将截断匹配的URL,并把剩余的字符串发往包含的URLconf作进一步处理。
如在 myblog.app中urls如下:
#myblog.app 中的urls
urlpatterns =patterns('myblog.views',
(r'^index/$','index'), #博客首页
)
那么就讨论一下include()匹配的模式吧:
(1)不含变量参数
如在url输入框中输入 http://127.0.0.1:8000/blog/index/ 则,它会截取include()中匹配的url,这里是”blog” 接下来找到了宿主了也就是myblog.urls,那么剩余的部分,也就是”index” 去匹配myblog.urls中的url模式。
(2)含有变量参数(如命名组)
#root urls
urlpatterns += patterns('',
(r'^(?P<username>\w+)/blog/',include('blog.urls')),
) #blog.urls
urlpatterns = patterns('blog.views',
(r'^index/$','index'),
(r'^other/$','other'),
) #blog.views
def index(request):
return HttpResponse('ok') #参数变量处理
def other(request,username):
return HttpResponse(username)
被捕获的 username 变量将传递给被包含的 URLconf,进而传递给那个URLconf中的 每一个 视图函数。
那么在浏览器输入:http://127.0.0.1:8000/BeginMan/blog/other/
则输出:BeginMan
更复杂点:
(r'^blog/(?P<username>\w+)/(?P<user_id>\d+)/',include('blog.urls'))
#.....
def index(request,username,user_id):
return HttpResponse('ok:%s,%s' %(username,user_id))
输入:http://127.0.0.1:8000/blog/BeginMan/20/index/
输出:ok:BeginMan,20
注意 后面不要忘了去匹配blog urls的哪个urls。如(r'^index/$’)
url高级配置
参考:Django零碎知识(10):URL常用配置方法 [转载]
1、命名组:
无命名 正则表达式组,即,在我们想要捕获的URL部分上加上小括号,Django 会将捕获的文本作为位置参数传递给视图函数。
命名 正则表达式组来捕获URL,并且将其作为 关键字 参数传给视图。
命名的正则表达式组的语法是:
(?P<name>pattern)
name:组名称
pattern:匹配的某个模式,常见有:
| Symbol | Matching |
| . | 任意单个字符 |
| \d | 匹配任意数字 |
| [A-Z] | 匹配A-Z任意大写字母 |
| [a-z] | 匹配a-z任意小写字母 |
| [A-Za-z] | 匹配a-z任意字母不论大小写 |
| + | 匹配一个或多个 (如:\d+) |
| [^xxx]+ | 匹配一个或多个不为xxx的(如[^name]+) |
| ? | 匹配零个或一个(如:\d?) |
| * | 匹配零个或更多(如:\d*) |
| {a,b} | 匹配介于a ,b之间(如:\d{1,3}一个或两个或三个数字) |
实例如下:
('^position/(\d{4})/(\d{2})/$','position'), #无命名 正则表达式组
('^name/(?P<year>\d{4})/(?P<month>\d{2})/$','name'), #命名组
则输入地址:http://127.0.0.1:8000/position/2013/15/、http://127.0.0.1:8000/name/2013/15/在相应视图函数中进行处理
#以位置参数的形式,如果位置改变,如(request,month,year),则相应的值也会随之改变
def position(request,year,month):
return HttpResponse('position:%s--%s' %(year,month))
#输出:position:2013--10 #关键字参数,key-value映射关系,与位置无关,所以当位置改变,值不变
def name(request,month,year):
return HttpResponse('name:%s--%s' %(year,month))
2、传递额外的参数到视图函数中
URLconf里面的每一个模式都可以包含第三个数据: 一个关键字参数的字典。
('^foo/$','commonView',{'name':'foo','age':22}),
('^bar/$','commonView',{'name':'bar','age':12}),
def commonView(request,name,age):
return HttpResponse('name:%s--age:%s' %(name,age))
则输入:http://127.0.0.1:8000/bar/、http://127.0.0.1:8000/foo/ 则输出: bar、 foo
常见应用是传递模板:
# urls.py from django.conf.urls.defaults import *
from mysite import views urlpatterns = patterns('',
(r'^foo/$', views.foobar_view, {'template_name': 'template1.html'}),
(r'^bar/$', views.foobar_view, {'template_name': 'template2.html'}),
) # views.py from django.shortcuts import render_to_response
from mysite.models import MyModel def foobar_view(request, template_name):
m_list = MyModel.objects.filter(is_new=True)
return render_to_response(
template_name,
{'m_list': m_list})
Django 之 URL(路由)分发机制的更多相关文章
- day56——http协议、MVC和MTV框架模式、django下载安装、url路由分发
day56 昨日复习 今日内容 HTTP协议 网页:https://www.cnblogs.com/clschao/articles/9230431.html 老师整理的重点 老师整理的重点 请求信息 ...
- HTTP协议 django下载安装 url路由分发
今日内容 HTTP协议 MVC和MTV框架模式 django下载安装 django的url路由分发 HTTP协议 http协议 请求信息格式 GET / HTTP/1.1 请求行 Host: 127. ...
- Django框架02 /Django下载安装、url路由分发
Django框架02 /Django下载安装.url路由分发 目录 Django框架02 /Django下载安装.url路由分发 1. django下载安装 2. pycharm创建项目 3. 基于D ...
- Django之url路由
Django之url路由 url路由介绍 url路由是关联url及其视图函数关系的过程. 作用就是使views里面处理数据的函数与请求的url建立映射关系 url路由配置 Django的url路由配置 ...
- Django学习之路由分发和反向解析
原 Django学习之路由分发和反向解析 2018年07月12日 14:04:55 huangql517 阅读数 519 1>路由分发 我们之前学习的路由配置都是在项目的全局控制文件(项目名称目 ...
- Django 02 url路由配置及渲染方式
Django 02 url路由配置及渲染方式 一.URL #URL #(Uniform Resoure Locator) 统一资源定位符:对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是 ...
- RabbitMQ学习总结(6)——消息的路由分发机制详解
一.Routing(路由) (using the Java client) 在前面的学习中,构建了一个简单的日志记录系统,能够广播所有的日志给多个接收者,在该部分学习中,将添加一个新的特点,就是可以只 ...
- 3/19 Django框架 url路由配置及模板渲染
3/19 Django框架 url路由配置及模板渲染 1.路由分配 URL(Uniform Resoure Locato):统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示, ...
- Django之URL路由系统
一 URL配置 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表.你就是以这 ...
随机推荐
- 转用Jmeter测试RabbitMQ
转自:https://blog.csdn.net/luozhuwang/article/details/62044872 1.下载AMQP插件 github上面有源码,可以通过ant+ivy在本地进行 ...
- Hive 练习 简单任务处理
1.2018年4月份的用户数.订单量.销量.GMV (不局限与这些统计量,你也可以自己想一些) -- -- -- 2018年4月份的用户数量 select count(a.user_id) as us ...
- Redis命令学习-string类型操作
APPEND key value 假设key已经存在,而且为字符串.那么这个命令会把value追加到原来值的末尾.假设key不存在.首先创建一个空字符串,再运行追加操作. 返回值:返回 ...
- tcp3握手,作用,syn攻击
tcp建立链接3次握手: 1.客户端→服务端,发送seq=x,syn=1 2.服务端→客户端,发送seq=y,syn=1,ack=x+1 3.客户端→服务端,发送seq=z,ack=y+1 三次握手作 ...
- centos 7 下安装haproxy
1 haproxy 下载 从如下目录下载haproxy:http://www.haproxy.org/download/1.7/src/haproxy-1.7.1.tar.gz 2 haproxy 安 ...
- Java并发编程(三)概念介绍
在构建稳健的并发程序时,必须正确使用线程和锁.但是这终归只是一些机制.要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享的(Shared)和可变的(Mutable)状态的访问. 对 ...
- linux系统下crontab 配置启动定时任务
1 crontab -e 配置启动定时任务 */1 * * * * sh /home/admin/application/wd/core-python/getMemPositionFromAnaual ...
- atexit
atexit - register a function to be called at normal process termination注册进程正常退出时的回调函数. #include < ...
- Mybatis结果生成键值对
在实际应用中我们经常会遇到这样的情况,需要给下拉框赋值,这个时候就需要键值对了,具体使用方法如下 1,在maper.xml文件中定义结果类型(resultType)定义为hashmap,如下所示 &l ...
- svn删除账户信息
当我们需要清理eclipse中记录的SVN账号信息时,按如下操作: eclipse中打开window------>preferences------->SVN页面,如下所示: 一般情况下, ...