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.")

 

posted @ 2017-05-26 22:34  Vincen_shen  阅读(2068)  评论(0)    收藏  举报