【引子】
今天,在查看django的官方文档时,看到get_object_or_404这个函数感到很奇怪。 这主要来自其功能,如果有要查询的对象
如果存在则返回对象; 如果对象不存在,则报告404 Not Found; 但是,404 Not Found不是其返回值,django直接返回
到了第404页,这种感觉就奇怪了。
1、对get_object_or_404的一次失败地模拟
from django.shortcutsimportrenderfromdjango.httpimporthttp 404, httpresponsedeffun _ get _ object _ or _ 404 (PK=none ) : ifpk==1: return1else 3360 return httpresponse () () object _404 )返回httpresponse (' object is {0} '.format ) (obj ) )。
从返回的内容可以看出,view对HttpResponse的处理不像middleware,middleware类似于return HttpResponse
内容立即将response对象返回给浏览器; get_object_or_404是如何实现的呢?
2、get_object_or_404 的官方实现
defget_object_or_404(klass,*args,**kwargs ) : ''' Use get ) to return an object,orraiseahttp 404 exception Manager,orquerysetobject.allotherpassedargumentsandkeywordargumentsareusedintheget () query. Like with QuerySet.get, multipleobjectsreturnedisraisedifmorethanoneobjectisfound.' ' queryset=_ get _ queryset (klass ) try:returnqueryset * klass _ _ name=klass._ _ name _ if isinstance (kwargs ) klass, type ) else klass._ _ class _._ _ name _ _ raisevalueerror (firstargumenttoget _ object _ or _ 404 ) must not ' % e Http404 (no % smatchesthegivenquery.'这也只是raise制作了http 404。 请注意,这里是raise而不是return。 Http404不是HttpResponse的子类,应该是异常的。
3、Http404的官方实现
classhttp404(exception ) : pass刺在心上! 此产品是简单的Exception子类,不是HttpResponse子类。 另一个需要注意的是,不要使用raise Exception('xxx '方式
不能代替Http404。 这样做的话,会直接报告错误。
-----