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