Django 404错误处理
在Django中返回HTTP错误代码是相当容易的。HttpResponse的许多子类对应着除了200(代表“OK”)以外的一些常用的HTTP状态码。你可以在request/response文档中找到所有可用的子类。为了标示一个错误,你可以直接返回那些子类中的一个实例,而不是普通的HttpResponse 。例如:
from django.http import HttpResponse, HttpResponseNotFound def my_view(request): # ... if foo: return HttpResponseNotFound('<h1>Page not found</h1>') else: return HttpResponse('<h1>Page was found</h1>')
Http404异常
为了便利起见,也因为你的站点有个一致的404页面是个好主意,Django提供了Http404异常。如果你在视图函数中的任何地方抛出Http404异常,Django都会捕获它,并且带上HTTP404错误码返回你应用的标准错误页面。
像这样:
from django.http import Http404 from django.shortcuts import render_to_response from polls.models import Poll def detail(request, poll_id): try: p = Poll.objects.get(pk=poll_id) except Poll.DoesNotExist: raise Http404("Poll does not exist") return render_to_response('polls/detail.html', {'poll': p})
效果图
get_list_or_404
返回一个给定模型管理器上filter() 的结果,并将结果映射为一个列表,如果结果为空则返回Http404。
下面的示例从MyModel 中获取所有发布出来的对象:
from django.shortcuts import get_list_or_404 def my_view(request): my_objects = get_list_or_404(MyModel, published=True)
这个示例等同于:
from django.http import Http404 def my_view(request): my_objects = list(MyModel.objects.filter(published=True)) if not my_objects: raise Http404("No MyModel matches the given query.")
get_object_or_404
在一个给定的模型管理器上调用get(),但是引发Http404 而不是模型的DoesNotExist 异常。
示例:
from django.shortcuts import get_object_or_404 def my_view(request): my_object = get_object_or_404(MyModel, pk=1)
这个示例等同于:
from django.http import Http404 def my_view(request): try: my_object = MyModel.objects.get(pk=1) except MyModel.DoesNotExist: raise Http404("No MyModel matches the given query.")