详解Django中Request对象的相关用法


Posted in Python onJuly 17, 2015

从Request对象中获取数据

我们在第三章讲述View的函数时已经介绍过HttpRequest对象了,但当时并没有讲太多。 让我们回忆下:每个view函数的第一个参数是一个HttpRequest对象,就像下面这个hello()函数:

from django.http import HttpResponse

def hello(request):
  return HttpResponse("Hello world")

HttpRequest对象,比如上面代码里的request变量,会有一些有趣的、你必须让自己熟悉的属性和方法,以便知道能拿它们来做些什么。 在view函数的执行过程中,你可以用这些属性来获取当前request的一些信息(比如,你正在加载这个页面的用户是谁,或者用的是什么浏览器)。
URL相关信息

HttpRequest对象包含当前请求URL的一些信息:

详解Django中Request对象的相关用法

在view函数里,要始终用这个属性或方法来得到URL,而不要手动输入。 这会使得代码更加灵活,以便在其它地方重用。 下面是一个简单的例子:

# BAD!
def current_url_view_bad(request):
  return HttpResponse("Welcome to the page at /current/")

# GOOD
def current_url_view_good(request):
  return HttpResponse("Welcome to the page at %s" % request.path)

有关request的其它信息

request.META 是一个Python字典,包含了所有本次HTTP请求的Header信息,比如用户IP地址和用户Agent(通常是浏览器的名称和版本号)。 注意,Header信息的完整列表取决于用户所发送的Header信息和服务器端设置的Header信息。 这个字典中几个常见的键值有:

  •     HTTP_REFERER,进站前链接网页,如果有的话。 (请注意,它是REFERRER的笔误。)
  •     HTTP_USER_AGENT,用户浏览器的user-agent字符串,如果有的话。 例如: "Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17" .
  •     REMOTE_ADDR 客户端IP,如:"12.345.67.89" 。(如果申请是经过代理服务器的话,那么它可能是以逗号分割的多个IP地址,如:"12.345.67.89,23.456.78.90" 。)

注意,因为 request.META 是一个普通的Python字典,因此当你试图访问一个不存在的键时,会触发一个KeyError异常。 (HTTP header信息是由用户的浏览器所提交的、不应该给予信任的“额外”数据,因此你总是应该好好设计你的应用以便当一个特定的Header数据不存在时,给出一个优雅的回应。)你应该用 try/except 语句,或者用Python字典的 get() 方法来处理这些“可能不存在的键”:

# BAD!
def ua_display_bad(request):
  ua = request.META['HTTP_USER_AGENT'] # Might raise KeyError!
  return HttpResponse("Your browser is %s" % ua)

# GOOD (VERSION 1)
def ua_display_good1(request):
  try:
    ua = request.META['HTTP_USER_AGENT']
  except KeyError:
    ua = 'unknown'
  return HttpResponse("Your browser is %s" % ua)

# GOOD (VERSION 2)
def ua_display_good2(request):
  ua = request.META.get('HTTP_USER_AGENT', 'unknown')
  return HttpResponse("Your browser is %s" % ua)

我们鼓励你动手写一个简单的view函数来显示 request.META 的所有数据,这样你就知道里面有什么了。 这个view函数可能是这样的:

def display_meta(request):
  values = request.META.items()
  values.sort()
  html = []
  for k, v in values:
    html.append('<tr><td>%s</td><td>%s</td></tr>' % (k, v))
  return HttpResponse('<table>%s</table>' % '\n'.join(html))

做为一个练习,看你自己能不能把上面这个view函数改用Django模板系统来实现,而不是上面这样来手动输入HTML代码。 也可以试着把前面提到的 request.path 方法或 HttpRequest 对象的其它方法加进去。

Python 相关文章推荐
详解Django框架中的视图级缓存
Jul 23 Python
Django数据库表反向生成实例解析
Feb 06 Python
Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例
Jun 09 Python
python3实现名片管理系统
Nov 29 Python
python与C、C++混编的四种方式(小结)
Jul 15 Python
Django之使用内置函数和celery发邮件的方法示例
Sep 16 Python
利用python实现AR教程
Nov 20 Python
Python求正态分布曲线下面积实例
Nov 20 Python
Python加密模块的hashlib,hmac模块使用解析
Jan 02 Python
40个你可能不知道的Python技巧附代码
Jan 29 Python
Python3的socket使用方法详解
Feb 18 Python
python 基于selectors库实现文件上传与下载
Dec 31 Python
Python实现SVN的目录周期性备份实例
Jul 17 #Python
Python的Django框架中设置日期和字段可选的方法
Jul 17 #Python
Python的Django框架下管理站点的基本方法
Jul 17 #Python
Django中更新多个对象数据与删除对象的方法
Jul 17 #Python
Django框架中数据的连锁查询和限制返回数据的方法
Jul 17 #Python
Django中对数据查询结果进行排序的方法
Jul 17 #Python
在Python的Django框架中获取单个对象数据的简单方法
Jul 17 #Python
You might like
外媒评选出10支2020年最受欢迎的Dota2战队
2021/03/05 DOTA
php 短链接算法收集与分析
2011/12/30 PHP
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
2013/06/25 PHP
PHP设计模式之装饰器模式实例详解
2018/02/07 PHP
WordPress 插件——CoolCode使用方法与下载
2007/07/02 Javascript
FormValid0.5版本发布,带ajax自定义验证例子
2007/08/17 Javascript
用jquery和json从后台获得数据集的代码
2011/11/07 Javascript
JavaScript高级程序设计(第3版)学习笔记13 ECMAScript5新特性
2012/10/11 Javascript
jQuery控制cookie过期时间的方法
2015/04/07 Javascript
将页面table内容与样式另存成excel文件的方法
2015/08/05 Javascript
基于jquery实现页面滚动到底自动加载数据的功能
2015/12/19 Javascript
Javascript中的几种继承方式对比分析
2016/03/22 Javascript
详解vee-validate的使用个人小结
2017/06/07 Javascript
Angular4 中常用的指令入门总结
2017/06/12 Javascript
浅谈node.js 命令行工具(cli)
2018/05/10 Javascript
Vue.js 中的 v-cloak 指令及使用详解
2018/11/19 Javascript
vue中组件的过渡动画及实现代码
2018/11/21 Javascript
在layui中layer弹出层点击事件无效的解决方法
2019/09/05 Javascript
[02:30]DOTA2放量测试专访海涛:呼吁保护新手玩家
2013/08/26 DOTA
python多线程操作实例
2014/11/21 Python
python模拟鼠标拖动操作的方法
2015/03/11 Python
Python Unittest根据不同测试环境跳过用例的方法
2018/12/16 Python
对python中类的继承与方法重写介绍
2019/01/20 Python
详解基于python-django框架的支付宝支付案例
2019/09/23 Python
50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)
2019/11/20 Python
Spark处理数据排序问题如何避免OOM
2020/05/21 Python
Tensorflow卷积实现原理+手写python代码实现卷积教程
2020/05/22 Python
Python生成并下载文件后端代码实例
2020/08/31 Python
摩托车和ATV零件、配件和服装的首选在线零售商:MotoSport
2017/12/22 全球购物
美国在线宠物商店:Chewy
2019/01/12 全球购物
Java面试笔试题大全
2016/11/23 面试题
校园报刊亭创业计划书
2014/01/02 职场文书
公司离职证明范本
2014/01/13 职场文书
模具设计与制造专业求职信
2014/07/19 职场文书
导游词之永济鹳雀楼
2020/01/16 职场文书
SpringBoot+Redis实现布隆过滤器的示例代码
2022/03/17 Java/Android