【引子】

  今天在看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,HttpResponse def fun_get_object_or_404(pk=None):
if pk == 1:
return 1
else:
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 object
does not exist. klass may be a Model, Manager, or QuerySet object. All other passed
arguments and keyword arguments are used in the get() query. Like with QuerySet.get(), MultipleObjectsReturned is raised if more than
one 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是行不通的、这样做话会直接报错。

----

django http404 详解的更多相关文章

  1. Django -- settings 详解

    Django settings详解 1.基础 DJANGO_SETTING_MODULE环境变量:让settings模块被包含到python可以找到的目录下,开发情况下不需要,我们通常会在当前文件夹运 ...

  2. Django -- settings 详解(转)

    Django -- settings 详解   Django settings详解 1.基础 DJANGO_SETTING_MODULE环境变量:让settings模块被包含到python可以找到的目 ...

  3. Django 2.0 学习(20):Django 中间件详解

    Django 中间件详解 Django中间件 在Django中,中间件(middleware)其实就是一个类,在请求到来和结束后,Django会根据自己的规则在合适的时机执行中间件中相应的方法. 1. ...

  4. Django中间件详解

    Django中间件详解 中间件位置 WSGI 主要负责的就是负责和浏览器和应用之家沟通的桥梁 浏览器发送过来一个http请求,WSGI负责解包,并封装成能够给APP使用的environ,当app数据返 ...

  5. Django框架详解之url

    Django基本命令 下载Django pip3 install django 创建一个django project django-admin.py startproject cms 当前目录下会生成 ...

  6. Django路由详解

    一.路由基础 1.路由url函数:路由自上而下进行匹配:url(正则路径,视图函数内存地址,默认参数,路由别名) 2.路由正则: 规定开始:^ | 规定结束:$ #url(r'index', view ...

  7. Django虚拟环境详解

    Django虚拟环境之 Virtualenv 1.安装 pip install virtualenv 2.创建虚拟环境 创建虚拟环境文件夹在当前目录 virtualenv [env_name] 3.激 ...

  8. Python之路【第二十一篇】Django ORM详解

    ORM回顾 关系对象映射(Object Relational Mapping,简称ORM). django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表. 对于ORM框 ...

  9. Django session 详解-part II-session

    Django中的session是一个高级工具,它可以让用户存储个人信息以便在下次访问网站中使用这些信息.session的基础还是cookie,但是它提供了一些更加高级的功能.请看下面的一个例子: 使用 ...

随机推荐

  1. linux发送邮件的功能总结

    今天添加了发送邮件的功能,总结一下,供以后参考: 1.直接使用管道发送邮件 echo "hello,this is the content of mail.welcome to www.mz ...

  2. 【Thinking in Java】读书笔记

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6480258.html 第三章:操作符 1:基本数据类型的比较用 ==.!=,引用类型的==.!=是针对地址的比 ...

  3. MySQL参数化查询的IN 和 LIKE

    https://stackoverflow.com/questions/650455/c-sharp-parameterized-query-mysql-with-in-clausehttps://s ...

  4. Java项目持续集成检查项

    1)   检查项:使用Super POM. 2)   检查项:GroupID应该以特定名称开头.3)   检查项:版本号符合规范.版本号必须是三段数字,之后加或不加-SNAPSHOT.4)   检查项 ...

  5. POJ--2406Power Strings+KMP求字符串最小周期

    题目链接:点击进入 事实上就是KMP算法next数组的简单应用.假设我们设这个字符串的最小周期为x 长度为len,那么由next数组的意义,我们知道len-next[len]的值就会等于x.这就是这个 ...

  6. Xamarin.Android之SlidingMenu

    一.前言 有位网友在评论中希望能够出个在Xamarin.Android下实现SlidingMenu效果的随笔,刚好昨天在观看官网示例项目的时候也看到这个SlidingMenu,但是最终的效果并不是我们 ...

  7. 无法启动此程序,因为计算机中丢失 api-ms-win-crt-stdio-l1-1-0.dll 解决

    问题描述 最近用一台Windows Server 2012 R2系统的机器的时候碰到了这个问题. 因为在网上看了很多解决方案,都没有很好的解决.所以记录一下这个问题的解决. 之前使用VS2013编译出 ...

  8. maven project创建填充项

    GroupID是项目组织唯一的标识符,实际对应JAVA的包的结构,是main目录里java的目录结构. ArtifactID就是项目的唯一的标识符,实际对应项目的名称,就是项目根目录的名称. 一般Gr ...

  9. boost asio异步读写网络聊天程序client 实例具体解释

    boost官方文档中聊天程序实例解说 数据包格式chat_message.hpp <pre name="code" class="cpp">< ...

  10. onActivityResult 传递数据

    onActivityResult 传递数据 http://www.cnblogs.com/sipher/articles/2435078.html 如下图所示.当菜单项变多时,出现了垂直的滚动条,选项 ...