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 进阶的更多相关文章

  1. Django 2.0 学习(07):Django 视图(进阶-续)

    接Django 2.0 学习(06):Django 视图(进阶),我们将聚焦在使用简单的表单进行处理和精简代码. 编写简单表单 我们将用下面的代码,来替换之前的detail模板("polls ...

  2. Python之路【第十七篇】:Django【进阶篇 】

    Python之路[第十七篇]:Django[进阶篇 ]   Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...

  3. Python之路【第十七篇】:Django【进阶篇】

    Python之路[第十七篇]:Django[进阶篇 ]   Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...

  4. Python开发【第二十二篇】:Web框架之Django【进阶】

    Python开发[第二十二篇]:Web框架之Django[进阶]   猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 ...

  5. Python之路,Day15 - Django适当进阶篇

    Python之路,Day15 - Django适当进阶篇   本节内容 学员管理系统练习 Django ORM操作进阶 用户认证 Django练习小项目:学员管理系统设计开发 带着项目需求学习是最有趣 ...

  6. Django orm进阶查询(聚合、分组、F查询、Q查询)、常见字段、查询优化及事务操作

    Django orm进阶查询(聚合.分组.F查询.Q查询).常见字段.查询优化及事务操作 聚合查询 记住用到关键字aggregate然后还有几个常用的聚合函数就好了 from django.db.mo ...

  7. Django【进阶篇 】

    Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行 ...

  8. Django web 进阶

    .路由系统 .模板引擎 simple_tag .Form .Ajax请求 -简单数据 -复杂数据 内容: -作业 model xss.csrf(安全方面的内容) 分页(公共的模块) 内容复习和今日内容 ...

  9. Django URLconf

    Django提供了干净优雅的 URL 方案,URL配置文件是一个标准的 python 文件,支持动态配置.它的本质就是URL模式与调用的视图函数之间的映射表,最简单的配置文件如下: from djan ...

随机推荐

  1. vue.js插值,插入图片,属性

    <html><head><title>Insert title here</title><script type="text/javas ...

  2. request设置cookies

    mycookie = { "PHPSESSID":"56v9clgo1kdfo3q5q8ck0aaaaa" } request.get(url,cookies ...

  3. URL和URI

    (一)URL和URI是什么 1.URL(Universal Resource Locator) 是统一资源定位符,对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址. ...

  4. Selenium Java关闭浏览器

    在学习selenium的过程中发现一个问题,各种博客/教程都是教人用selenium的quit()和close()方法关闭浏览器. 但这不是我要的结果.这两个方法的前提是,用webdriver打开浏览 ...

  5. cdnbest设置301跳转

     cdnbest设置301跳转  格式:^http://kangleweb.com/(.*)$   https://www.kangleweb.com/$1  下面是站点里所有域名都跳转到https ...

  6. 解题(GeLeiMa -生成格雷码)

    题目描述 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同, 则称这种编码为格雷码(Gray Code),请编写一个函数,使用递归的方法生成N位的格雷码. 给定一个整数n,请返回n位的格雷码 ...

  7. springboot整合dubbox与zookeeper

    springboot中dubbo依赖的引入和配置(application.properties)参见:https://blog.csdn.net/wohaqiyi/article/details/72 ...

  8. Http的缓存机制

    最近参加一个面试,被面试官问到http的缓存机制,发现自己并不熟悉,于是这篇博客诞生了. HTTP是超文本传输协议,从万维网服务器传输文本到本地浏览器的传送协议,基于TCP/IP通信协议传递数据 HT ...

  9. 20175314 《Java程序设计》第六周学习总结

    20175314 <Java程序设计>第六周学习总结 教材学习内容总结 第七章:内部类与异常类 内部类:内部类就是在一个类中再定义一个类,这个在类中定义的类就叫做内部类,而包含内部类的类叫 ...

  10. Js学习(3) 数组

    数组本质: 本质上数组是特殊的对象,因此,数组中可以放入任何类型的数据,对象,数组,函数都行 它的特殊性在于键名是按次序排列好的整数 从0开始,是固定的,不用指定键名 如果数组中的元素仍是数组,则为多 ...