苏州网站建设上往建站,wordpress伪静态iis6,甘肃省城乡建设局网站首页,vue.js 做网站【引子】 今天在看django的官方文档的时候看到get_object_or_404这个函数感觉比较奇怪。这个主要来自于它的功能#xff0c;如果要查询的对象 存在那么就返回对象#xff1b;如果对象不存在那么就要报404 Not Found #xff1b;但是404 Not Found并不是它的返回值#xff0…【引子】 今天在看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(pkNone):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