Django学习小记[5] —— View Request/Response

2023-11-01

在Django中,view是指一个方法,这个方法接收一个request,然后返回一个response.

当客户端发送一个请求的时候,Django会创建一个HttpRequest对象,这个对象包含本次请求的所有相关信息,比如请求的路径,请求的参数,请求的方法等等,然后将这个对象作为view方法的第一个参数传给view,view经过处理之后,返回一个HttpResponse对象,这个HttpResponse对象可以是一段HTML文本,可以是一个重定向,可以是一个404的Error,甚至可以是图片,XML/JSON的文档等等。

举个例子:

from django.http import HttpResponse

def index(request):                         
    return HttpResponse("this is a test")

通过request参数,可以获得本次请求的所有数据:

(Pdb) request.method
'GET'
(Pdb) request.GET
<QueryDict: {}>
(Pdb) request.path_info
u'/model1/'
(Pdb) request.META  # header

HttpResponse可以带几个参数:

  • content: 返回的内容
  • content_type: 返回内容的类型
  • status

如:

def index(request):                       
    return HttpResponse('<p>this is a test</p>', content_type="text/html", status="201") 

好,理解了view的基本原理,其实view基本上已经说完了,现在关于view值得一提的主要有以下几个方面:

  • 对异常的处理
  • shortcut
  • Class-based View

在这篇文章中,只介绍一下前面两个,第三个内容较多,留在下一篇文章中单独去介绍。

Returning errors

我们经常会遇到这样的情况,当你在访问一个很久之前保存的网址时,这个网页已经不存在了,于是出现了各种有意思的画面:

404

那这在django中是怎么实现的呢?我们先来自己想一下,在所有抛出404异常的地方,捕获这个异常,然后自己渲染一个404的页面。这样虽然可行,但是略麻烦。像报404这种常见的异常,Django都已经做了比较好的封装。在Django里,你可以主动抛出django.http.Http404异常,这样Django会自动去template路径里找一个叫做”404.html”的页面,如果你访问了一个真的不存在的页面,那么同样,django也会去渲染这个页面。

当django发现有Http404异常时,默认它会调用一个特殊的view:

django.views.defaults.page_not_found(request, template_name='404.html')

这个view会去处理404这个异常,返回404页面和404状态码,如果这个view满足不了你的需求的话,可以在配置文件里进行配置,自己指定view方法来处理,如:

handler404 = 'mysite.views.my_custom_404_view'

虽然看起来挺简单的,但是我在测试的时候,还是碰到几个坑的,在这里记下来:

  • 首先要注意的是这种机制只在DEBUG=False时有效,DEBUG=True时会打印出traceback
  • 其次,要确保配置了TEMPLATE_DIRS,把你的templates告诉了django,否则它找不到404页面
  • 如果在设置了DEBUG=False后,所有的路径都报500的话,那么检查一下ALLOWED_HOSTS这个参数,这个参数是为了防止攻击而设置的,在1.4.4~1.5版本,这个参数默认是['*'],接收所有的host,在大于1.5的版本里,这个参数默认[],默认不接收所有的host,所以在大于1.5的版本里,如果设置DEBUG=False的话,ALLOWED_HOSTS这个参数就必须设置,否则会报500。在1.4.4~1.5版本里,可以不设置,它默认就是接收所有的,但是如果设置了的话,就必须要正确,否则也会报500
Shortcuts

Django提供了几个非常有用的“快捷方式”,将我们经常用到的逻辑,封装成了一个方法,简化了代码:

  • render()
  • render_to_response()
  • redirect()
  • get_object_or_404()
  • get_list_or_404()

不进行详细的解释了,看文档吧

Refs

[1] https://docs.djangoproject.com/en/1.6/topics/http/views/ 
[2] https://docs.djangoproject.com/en/1.6/ref/request-response/ 
[3] https://docs.djangoproject.com/en/1.6/topics/http/shortcuts/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django学习小记[5] —— View Request/Response 的相关文章

随机推荐

  • Java 正则表达式匹配规则

    表示捕获分组 会把每个分组里的匹配的值保存起来 使用 n n是一个数字 表示第n个捕获组的内容 表示非捕获分组 和捕获分组唯一的区别在于 非捕获分组匹配的值不会保存起来 0次或者多次 匹配前面的子表式零次或多次 1次或者多次 匹配前面的子表
  • 给一非空的单词列表,返回前 k 个出现次数最多的单词。旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。 现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。

    Arrays sort是针对数组排顺序 也可以通过第二个参数指定比较规则 Collection sort是针对集合类排序 给一非空的单词列表 返回前 k 个出现次数最多的单词 旧键盘上坏了几个键 于是在敲一段文字的时候 对应的字符就不会出现
  • [蓝帽杯 2022 初赛]之Misc篇(NSSCTF)刷题记录(复现)

    NSSCTF Misc篇 蓝帽杯 2022 初赛 domainhacker 蓝帽杯 2022 初赛 domainhacker1 蓝帽杯 2022 初赛 domainhacker2 计算机取证 蓝帽杯 2022 初赛 计算机取证 1 蓝帽杯
  • Centos卸载gcc

    1 查看安装的gcc版本 y localhost Desktop rpm q gcc gcc 4 4 7 23 el6 x86 64 2 执行卸载命令 rpm e y localhost Desktop rpm e gcc 4 4 7 23
  • Algorithm Accumulation

    目标检测 DPM HOG SIFT 最优匹配 DTW HMM 优化入门 爬山算法 退火算法 遗传算法 多目标优化 ILP 复杂度 NP完全问题 这篇博客就用来积累学过的一些比较好的算法 现开始觉得算法真是一个宝啊 目标检测 DPM 参考博客
  • Oracle中5中分区介绍

    一 范围分区 就是根据数据库表中某一字段的值的范围来划分分区 例如 Sql代码 create table graderecord sno varchar2 10 sname varchar2 20 dormitory varchar2 3
  • Srpingboot注解:@ConditionalOnProperty的用法

    在之前我就一直有一个想法 就是有的bean我不想注入 比如说有的时候用的是A的bean 可能换了一个不同的系统可能要用B的bean 我可不可以自己去配置什么时候注入A什么时候注入B 而不是我都注入 用到那个用哪个 实际 Conditiona
  • Tomcat

    一 Web资源的分类 Web资源分为两类 静态资源和动态资源 静态资源 html css js mp4视频 jpg图片 txt等 动态资源 jsp页面 servlet程序等 二 常用的web服务器 Web服务器 也可以叫javaweb容器
  • 驱动开发 day4 9/13

    head h ifndef HEAD H define HEAD H typedef struct unsigned int MODER unsigned int OTYPER unsigned int OSPEEDR unsigned i
  • JAVA中类的public class与class的区别详解

    1 类的访问权限 为了控制某个类的访问权限 修饰词必须出现在关键字class之前 例如 public class Student 在编写类的时候可以使用两种方式定义类 A public class定义类 B class定义类 2 publi
  • 2021-11-3 内核态和核心态

    1 什么是内核态 当一个进程进行系统调用而陷入内核代码中时 就称程序陷入了内核态 否则就是用户态 用户程序运行在用户态而操作系统运行在内核态 用户态只能执行非特权指令 而内核态可以执行全部指令 内核态可以执行的指令比如 执行I O 设置时钟
  • 拓数派荣获 “2023 年杭州市企业高新技术研究开发中心” 认定

    近日 拓数派上榜由杭州市科学技术局公布的 2023 年杭州市企业高新技术研究开发中心名单 通过专业的技术研发 成果转化和高新技术产业化成绩 获得 杭州市拓数派数据计算企业高新技术研究开发中心 认定 图为 杭州市拓数派数据计算企业高新技术研究
  • Lattice库联合ModelSim仿真FIFO

    Lattice联合ModelSim仿真FIFO 前言 一 添加IP 二 库文件添加 一 方式一 添加器件库到ModelSim 二 方法二 直接添加器件库到Libray 和tb v在同一个目录下仿真 三 仿真 一 仿真文件 二 仿真结果 前言
  • 计算机进制存在的意义

    发布本文的实际想法 是否想过为什么要有进制的存在 如二进制 十进制等 存在即合理 通过思考 得出以下结论 希望能在计算机基础方面给你带来一定的帮助 进制的意义 二进制是计算机看得懂的语言 我们在电脑上所写的一切东西 都需要转成二进制让电脑执
  • ctfshow web4

    提示日志注入 文件包含 还有一个get方式的参数url 有nginx 那就试试它的默认日志目录 日志默认路径 1 apache Linux 日志默认路径 etc httpd logs access log var log httpd acc
  • Window下编译PJSIP,不编译Media模块

    Windows系统下使用VS2017进行编译PJSIP 下载地址 PJSIP的地址 https github com pjsip pjproject 在线clone太慢的话 可以直接在这里下载比clone会快很多 https github
  • 用数组实现邻接表

    用数组实现邻接表 转载自 http blog csdn net wang2534499 article details 47750321 坐在马桶上看算法 算法8 巧妙的邻接表 数组实现 之前我们介绍过图的邻接矩阵存储法 它的空间和时间复杂
  • Android APP专项测试之ADB命令

    Android环境准备 Android APP专项测试需要使用adb命令 需要安装Android SDK参考 验证adb 数据线连接Android设备 或虚拟机 或使用无线连接参考 Android设备进入开发者模式 打开USB调试 USB安
  • 线性DP相关例题

    目录 1 最长公共子序列 2 最长递增子序列 蓝桥骑士 3 字符串转换 4 装箱问题 0 1背包简化版 5 过河卒 1 最长公共子序列 题目描述 给定一个长度为 N 数组 a 和一个长度为 M 的数组 b 请你求出它们的最长公共子序列长度为
  • Django学习小记[5] —— View Request/Response

    在Django中 view是指一个方法 这个方法接收一个request 然后返回一个response 当客户端发送一个请求的时候 Django会创建一个HttpRequest对象 这个对象包含本次请求的所有相关信息 比如请求的路径 请求的参