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("2003")

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‘,))
时间: 2024-07-30 10:35:24

Django URLConf 进阶的相关文章

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

Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 import MySQLdb def GetList(sql): db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost')

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

Python开发[第二十二篇]:Web框架之Django[进阶] 猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 新随笔 联系 订阅 管理 随笔-124  文章-127  评论-205 Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻

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

Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 import MySQLdb def GetList(sql): db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost')

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

Python之路,Day15 - Django适当进阶篇 本节内容 学员管理系统练习 Django ORM操作进阶 用户认证 Django练习小项目:学员管理系统设计开发 带着项目需求学习是最有趣和效率最高的,今天就来基于下面的需求来继续学习Django 项目需求: 1.分讲师\学员\课程顾问角色,2.学员可以属于多个班级,学员成绩按课程分别统计3.每个班级至少包含一个或多个讲师4.一个学员要有状态转化的过程 ,比如未报名前,报名后,毕业老学员5.客户要有咨询纪录, 后续的定期跟踪纪录也要保存6

Django【进阶篇 】(地阶段位二)

Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 import MySQLdb def GetList(sql): db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost') cursor = db.cur

Django -- URLconf 配置技巧

本章我们将对视图和URL配置使用一些高超的小技巧. [流线型化函数导入(streamlining)] 方法一:传统方法 from django.conf.urls.defaults import * from mysite.views import hello, current_datetime, hours_ahead urlpatterns = patterns('',     (r'^hello/$', hello),     (r'^time/$', current_datetime),

Django【进阶篇 】

Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 import MySQLdb def GetList(sql): db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost') cursor = db.cursor() cursor.

python django -5 进阶

高级知识点包括: 静态文件处理 中间件 上传图片 Admin站点 分页 使用jquery完成ajax 管理静态文件 项目中的CSS.图片.js都是静态文件 配置静态文件 在settings 文件中定义静态内容 STATIC_URL = '/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), ] 在项目根目录下创建static目录,再创建当前应用名称的目录 mysite/static/myapp/ 在模板中可以使用硬编码

Django Model 进阶

回顾: 定义 models settings.py激活app才能使用models migrations:版本控制,当更改库表结构时可以处理数据 增删改查 常见Field 模型的价值在于定义数据模型,使用Python的形式操作数据库 from django.db import models class Person(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max