详解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 相关文章推荐
Python单例模式实例分析
Jan 14 Python
tensorflow入门之训练简单的神经网络方法
Feb 26 Python
Django 多语言教程的实现(i18n)
Jul 07 Python
Python3爬虫爬取百姓网列表并保存为json功能示例【基于request、lxml和json模块】
Dec 05 Python
Python类的继承用法示例
Jan 31 Python
Python 旋转打印各种矩形的方法
Jul 09 Python
python 使用socket传输图片视频等文件的实现方式
Aug 07 Python
Django通用类视图实现忘记密码重置密码功能示例
Dec 17 Python
Python matplotlib读取excel数据并用for循环画多个子图subplot操作
Jul 14 Python
python脚本第一行如何写
Aug 30 Python
Python如何使用ConfigParser读取配置文件
Nov 12 Python
python 如何在测试中使用 Mock
Mar 01 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
php引用计数器进行垃圾收集机制介绍
2012/09/19 PHP
PHP中数组定义的几种方法
2013/09/01 PHP
使用php的HTTP请求的库Requests实现美女图片墙
2015/02/22 PHP
Docker搭建自己的PHP开发环境
2018/02/24 PHP
php接口隔离原则实例分析
2019/11/11 PHP
根据地区不同显示时间的javascript代码
2007/08/13 Javascript
JavaScript表达式:URL 协议介绍
2013/03/10 Javascript
jquery eval解析JSON中的注意点介绍
2013/08/23 Javascript
检查输入的是否是数字使用keyCode配合onkeypress事件
2014/01/23 Javascript
浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入
2016/01/19 Javascript
基于jQuery实现的Ajax 验证用户名唯一性实例代码
2017/06/28 jQuery
JavaScript编写的网页小游戏,很给力
2017/08/18 Javascript
vue.js todolist实现代码
2017/10/29 Javascript
深入浅析Vue中的Prop
2018/06/10 Javascript
webpack中如何使用雪碧图的示例代码
2018/11/11 Javascript
基于vue手写tree插件的那点事儿
2019/08/20 Javascript
vue3实现v-model原理详解
2019/10/09 Javascript
Echarts在Taro微信小程序开发中的踩坑记录
2020/11/09 Javascript
python的re模块应用实例
2014/09/26 Python
Python黑魔法@property装饰器的使用技巧解析
2016/06/16 Python
Python正则抓取网易新闻的方法示例
2017/04/21 Python
详谈Python2.6和Python3.0中对除法操作的异同
2017/04/28 Python
Python实现根据日期获取当天凌晨时间戳的方法示例
2019/04/09 Python
django云端留言板实例详解
2019/07/22 Python
python实现密码验证合格程序的思路详解
2020/06/01 Python
Python如何测试stdout输出
2020/08/10 Python
python 中关于pycharm选择运行环境的问题
2020/10/31 Python
用Python实现职工信息管理系统
2020/12/30 Python
里程积分管理买卖交换平台:Points.com
2017/01/13 全球购物
美国家居装饰店:Pier 1
2019/09/04 全球购物
中科前程Java笔试题
2016/11/20 面试题
入学申请自荐信范文
2014/02/26 职场文书
教师党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
教师年度考核自我评鉴
2015/08/11 职场文书
eval(cmd)与eval($cmd)的区别与联系
2021/07/07 PHP
java版 简单三子棋游戏
2022/05/04 Java/Android