Django URLConf 进阶
Django处理一个请求
项目启动后根据 settings ROOT_URLCONF 决定项目根URLconf
urlpatterns是django.conf.urls.url()实例的一个Python列表
Django依次匹配每个URL模式,匹配成功后就停止
Django匹配成功,调用相应视图函数(或一个基于类的视图),视图参数如下
一个HttpRequest实例
如果匹配的正则表达式返回了没有命名的组,那么正则表达式匹配的内容将作为位置参数传递给视图函数
关键字参数由正则表达式匹配的命名组组成,但是可以被django.conf.urls.url()的可选参数kwargs覆盖
如果没有匹配的正则表达式,或者过程中抛出一个异常,Django将调用一个适当的错误处理视图
详细Django请求流程

modwsgi:Django实现,处理原始二进制http请求,Python标准wsgi协议,封装输出request对象
Request Middlewares:Django扩展,请求中间件,安全验证,Session处理等,对所有request应用的场景,可定制,有顺序
URLConf:Django实现,url路由系统,从上到下,依次匹配
View Middlewares:Django扩展,对url匹配后的中间件处理,可定制
View:视图函数,汇总Template所需Context
Model:数据模型,通过Mangers管理器去外部DB取得数据
Template:前端模板,包括Filters和Tags
Response Middlewares:Django扩展,响应中间件
modwsgi:Django实现,拆分为原始二进制http响应数据流,返回给浏览器
URL常见写法
# urls.py
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/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
] # views.py
def special_case_2003(request):
return HttpResponse("") def year_archive(request, year):
return HttpResponse('year_archive: %s' % year) def month_archive(request, year, month):
return HttpResponse('year, month: %s, %s' % (year, month)) def article_detail(request, year, month, day):
return HttpResponse('article_detail: %s, %s, %s' % (year, month, day))
说明:
若要从URL中捕获一个值,只需要在它的周围放置一对圆括号,如 ([0-9]{4}) 捕获4为整数
不需要添加一个前导的反斜杠,因为每个url都有,如该是articles而不是/articles
每个正则表达式前面的r''是可选的但是建议加上,它告诉Python这个字符串是“原始的”--字符串中任何字符串都不应该转义
默认捕捉到的都是字符串
/articles/2005/03/ 请求将匹配列表中的第三个模式, Django将调⽤函数views.month_archive(request, '2005', '03')
/articles/2005/03/?blog=hi 和上面相同
/articles/2005/3/ 不匹配任何URL模式,因为列表中的第三个模式要求⽉份应该是两个数字
/articles/2003/ 将匹配列表中的第一个模式不是第二个,因为模式按顺序匹配,第一个会首先测试是否匹配
/articles/2003 匹配第一个,浏览器默认转换为 /articles/2003/
/articles/2003/03/03/ 请求将调用函数views.article_detail(request, year='2003',month='03', day='03'),key名称必须和捕获的分组名称一致
URL多种组合写法
urlpatterns = [
url(r'^community/', include('django_website.aggregator.urls')),
url(r'^contact/', include('django_website.contact.urls')),
] urlpatterns += [
url(r'^log/', include(other_log)),
]
错误处理
当Django找不到一个匹配请求的URL的正则表达式时,或者抛出一个异常时,Django将调用一个错误处理视图
默认错误处理视图
-handler404 -- 参见django.conf.urls.handler404
-handler500 -- 参见django.conf.urls.handler500
-handler403 -- 参见django.conf.urls.handler403
-handler400 -- 参见django.conf.urls.handler40
传递额外选项
urlpatterns = [
url(r'^articles/([0-9]{4})/$', views.year_archive,{'foo': 'bar'}),
]
会覆盖url中捕获的值
URL反向解析几种方法
在模板中使用 {% url 'url_name' xxx %}
在视图中使用 django.shortcuts.reverse() reverse('url_name', kwargs={‘key1’:'value1'}) 或 reverse('url_name', args=('key1',))
Django URLConf 进阶的更多相关文章
- Django 2.0 学习(07):Django 视图(进阶-续)
接Django 2.0 学习(06):Django 视图(进阶),我们将聚焦在使用简单的表单进行处理和精简代码. 编写简单表单 我们将用下面的代码,来替换之前的detail模板("polls ...
- Python之路【第十七篇】:Django【进阶篇 】
Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...
- Python之路【第十七篇】:Django【进阶篇】
Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...
- Python开发【第二十二篇】:Web框架之Django【进阶】
Python开发[第二十二篇]:Web框架之Django[进阶] 猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 ...
- Python之路,Day15 - Django适当进阶篇
Python之路,Day15 - Django适当进阶篇 本节内容 学员管理系统练习 Django ORM操作进阶 用户认证 Django练习小项目:学员管理系统设计开发 带着项目需求学习是最有趣 ...
- Django orm进阶查询(聚合、分组、F查询、Q查询)、常见字段、查询优化及事务操作
Django orm进阶查询(聚合.分组.F查询.Q查询).常见字段.查询优化及事务操作 聚合查询 记住用到关键字aggregate然后还有几个常用的聚合函数就好了 from django.db.mo ...
- Django【进阶篇 】
Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行 ...
- Django web 进阶
.路由系统 .模板引擎 simple_tag .Form .Ajax请求 -简单数据 -复杂数据 内容: -作业 model xss.csrf(安全方面的内容) 分页(公共的模块) 内容复习和今日内容 ...
- Django URLconf
Django提供了干净优雅的 URL 方案,URL配置文件是一个标准的 python 文件,支持动态配置.它的本质就是URL模式与调用的视图函数之间的映射表,最简单的配置文件如下: from djan ...
随机推荐
- C#设计模式(4)——抽象工厂模式(Abstract Factory)
简单工厂模式: 简单工厂模式的工厂类随着产品类的增加需要增加额外的代码 工厂方法模式: 工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性 但是在实际应用中,一个工厂不止会创建单 ...
- python的相对导入
最近断断续续学习flask,学到蓝本时候有点小问题卡住了,问题如下 导入包的时候py文件里使用了相对路径导入,但是这种导入方法不是很明白,就自己搜索加实验了终于有点眉目了 先定义一个包 adb包 这个 ...
- indexOf() 如何判断一个元素在指定数组中是否存在? 找出指定元素出现的所有位置? indexOf()方法 是正序查找,lastIndexOf()是倒叙查找
indexOf()方法返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1. let a = [2, 9, 7, 8, 9]; a.indexOf(2); // 0 a.indexOf ...
- 把Gitlab迁移到Docker容器里
把Gitlab迁移到Docker容器里 Apr 9, 2015. | By: 任怀林 公司的gitlab一直是运行在ovm的虚拟机里的,版本还是6.7.5.版本有点老了,最近在研究docker,于是想 ...
- 人工智能为什么选择Python语言?
作为新手,在面对广泛应用于企业级应用开发的 Java.游戏客户端开发的 C++.嵌入式开发的 C.人工智能领域的 Python 等数百种编程语言时,你会如何选择自己的第一门编程语言? 作者 | JAC ...
- Ubuntu下解决MySQL自启动,chkconfig list 全部off 情况
chkconfig命令是用于RedHat/Fedora发行版的,而对于像Ubuntu之类的Debian发行版,应该使用这个命令: sudo update-rc.d mysql defaults 验证一 ...
- 用java开发图形界面项目,如何实现从本地选择图片文件并以二进制流的形式保存到MySQL数据库,并重新现实到面板
- 使用安装脚本安装Texlive
介绍 TeX Live 是 TUG (TeX User Group) 维护和发布的 TeX 系统,可说是「官方」的 TeX 系统.网上可找到的教程大多是从镜像安装完整版texlive.镜像发布的周期较 ...
- js 原型链与继承
var A = function(){ this.name="xiaoming"; } A.prototype.age=9; var a = new A(); console.lo ...
- google protobuf VC下的使用笔记
1 使用protobuf 2.x 下载地址(3.x 在c++11 vs2017下报错) 源码 https://github.com/google/protobuf 或者直接下载 二进制文件 2 如果下 ...