django的request处理流程和错误处理

jango如何处理一个请求:
1.找到root URLconf module ,就是ROOT_URLCONF中的信息。但是,如果传进来的HttpRequest对象有一个名

叫urlconf的属性(这是在middleware中设置的),那么将采用这个属性的值来代替ROOT_URLCONF中的信息。
2.django导入模块,寻找urlpatterns变量。这个变量必须是一个list类型的值。是使用patterns()函数返回

的。
3.django搜索urls,找到第一个匹配的url
4.django导入和调用给出的view函数。这个函数将得到一个HttpRequest对象作为第一个参数,再加上从url

上得到的其他参数的值。
5.如果没有匹配到任何正则表达式,那么将报错。并转到错误视图处理。

注意:每个正则表达式都会在第一次访问时编译,这样可以更快。

patterns中可以使用include()将其他应用导入到这里。

传递额外的参数到视图函数

urlpatterns = patterns(’blog.views’,
(r’^blog/(?P<year>\d{4})/$’, ’year_archive’, {’foo’: ’bar’}),)

这样,views.year_archive函数将得到两个参数year和foo。
如果两个参数的名字是一样的,则保存从url中得到的参数的值。

urlpatterns = patterns(’’,
(r’^blog/’, include(’inner’), {’blogid’: 3}),
)
这样,inner.py中的每行url都会包含blogid这个参数。不管视图函数是否需要。

一般情况下,我们不能够将两个及以上的url映射到一个view函数。因为,django无法从view函数得到相对应

的url。
解决这种办法可以使用 named URL patterns
urlpatterns = patterns(’’,
url(r’^archive/(\d{4})/$’, archive, name="full-archive"),
url(r’^archive-summary/(\d{4})/$’, archive, {’summary’: True}, "arch-summary"),
)


编写视图函数

返回错误
def my_view(request):
# ...
 if foo:
  return HttpResponseNotFound(’<h1>Page not found</h1>’)  #返回的是404错误
 else:
  return HttpResponse(’<h1>Page was found</h1>’)


使用状态码:
def my_view(request):
 # ...
 # Return a "created" (201) response code.
 return HttpResponse(status=201)        #可以返回任何状态码

404错误:
from django.http import Http404
 def detail(request, poll_id):
  try:
   p = Poll.objects.get(pk=poll_id)
  except Poll.DoesNotExist:
   raise Http404
  return render_to_response(’polls/detail.html’, {’poll’: p})

Http404将调用你的template根目录下的404.html的文件

默认情况下,当产生了Http404 exception,django会使用一个特殊的视图来处理404错误——

django.views.defaults.page_not_found,然后它会装载和渲染404.html模板。这个处理函数会返回一个变

量:request_path。就是产生异常的这个url。

这个处理函数可以满足99%的web应用,如果你想使用自己的404处理函数,可以如下:
handler404='mysite.my_own_404_view'  (urls.py文件中)
django决定404的处理视图是通过在你的root URLconf中查找handler404来实现的。如果没有找到,就使用系

统自带的。
注意:
    1.当一个url没有找到匹配的正则表达式时,那么他就会使用404视图
    2.如果你想使用系统自带的404处理视图,那么你还要创建一个404.html模板。
    3.如果settings.py的DEBUG设置为True时,你的404视图将永远也不会被使用。将会被一些调试信息取代

500错误:
  默认使用django.views.defaults.server_error来处理。必须提供一个500.html文件。不同的是,500处理

视图不会传递任何参数到模板中。
  自定义500错误处理视图使用:
  handler500='mysite.myview'

403错误,同404和500错误处理方法
默认处理视图django.views.defaults.permission_denied

posted @ 2012-04-28 14:16  jianhong  阅读(800)  评论(0编辑  收藏  举报