django http404 详解
【引子】
今天在看django的官方文檔的時候看到get_object_or_404這個函數感覺比較奇怪。這個主要來自于它的功能,如果要查詢的對象
存在那么就返回對象;如果對象不存在那么就要報404 Not Found ;但是404 Not Found并不是它的返回值,而django直接返回
了404頁面、這個感覺就比較奇怪了。
?
1、對get_object_or_404的一次失敗地模擬
from django.shortcuts import render from django.http import Http404,HttpResponsedef fun_get_object_or_404(pk=None):if pk == 1:return 1else:return HttpResponse('object is not found ...')def index(request):obj = fun_get_object_or_404()return HttpResponse("object is {0}".format(obj))先看一下view的執行結果吧
從返回的內容我們可以看出來、view對HttpResponse的處理并不像middleware中的那樣;middleware只要是遇到return HttpResponse 這樣的
內容就會馬上返回response對象到瀏覽器;那get_object_or_404 是怎么實現的呢?
?
2、get_object_or_404 的官方實現
def get_object_or_404(klass, *args, **kwargs):"""Use get() to return an object, or raise a Http404 exception if the objectdoes not exist.klass may be a Model, Manager, or QuerySet object. All other passedarguments and keyword arguments are used in the get() query.Like with QuerySet.get(), MultipleObjectsReturned is raised if more thanone object is found."""queryset = _get_queryset(klass)try:return queryset.get(*args, **kwargs)except AttributeError:klass__name = klass.__name__ if isinstance(klass, type) else klass.__class__.__name__raise ValueError("First argument to get_object_or_404() must be a Model, Manager, ""or QuerySet, not '%s'." % klass__name)except queryset.model.DoesNotExist:raise Http404('No %s matches the given query.' % queryset.model._meta.object_name)這個也只是raise 了一個Http404、注意這里是raise 而不是return 說明Http404并不是一個HttpResponse的子類、應該是一個異常。
?
3、Http404的官方實現
class Http404(Exception):pass扎心啦! 這貨就一個簡單的Exception 子類、并不是HttpResponse的子類、還有一點要注意的不要想用raise Exception('xxx')的方式來
替代Http404是行不通的、這樣做話會直接報錯。
?
?
----
轉載于:https://www.cnblogs.com/JiangLe/p/9178903.html
總結
以上是生活随笔為你收集整理的django http404 详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 线上服务CPU100%问题快速定位实战
- 下一篇: Dede更新提示DedeTag Engi