Django URLConf 进阶

Posted Jonathan1314

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\',))

以上是关于Django URLConf 进阶的主要内容,如果未能解决你的问题,请参考以下文章

Django 路由系统(URLconf)

Django的URLconf

Django 视图与URL进阶

Django的路由层(urlconf)

Django 路由层(urlconf)

5 Django-1的路由层(URLconf)