【引子】

今天,在查看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。 这样做的话,会直接报告错误。

-----