分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 代码编程

django http404 详解

发布时间:2023-09-06 01:59责任编辑:彭小芳关键词:httpdjango

【引子】

  今天在看django的官方文档的时候看到get_object_or_404这个函数感觉比较奇怪。这个主要来自于它的功能,如果要查询的对象

  存在那么就返回对象;如果对象不存在那么就要报404 Not Found ;但是404 Not Found并不是它的返回值,而django直接返回

  了404页面、这个感觉就比较奇怪了。

1、对get_object_or_404的一次失败地模拟

from django.shortcuts import renderfrom django.http import Http404,HttpResponsedef 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 详解

原文地址:https://www.cnblogs.com/JiangLe/p/9178903.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved