详解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下的多进程编程
Apr 28 Python
Python同时向控制台和文件输出日志logging的方法
May 26 Python
Python PyQt5实现的简易计算器功能示例
Aug 23 Python
pandas series序列转化为星期几的实例
Apr 11 Python
python实现在IDLE中输入多行的方法
Apr 19 Python
python中metaclass原理与用法详解
Jun 25 Python
pytorch 模型可视化的例子
Aug 17 Python
python利用openpyxl拆分多个工作表的工作簿的方法
Sep 27 Python
python 单线程和异步协程工作方式解析
Sep 28 Python
python中的函数递归和迭代原理解析
Nov 14 Python
Python连接字符串过程详解
Jan 06 Python
python 基于pygame实现俄罗斯方块
Mar 02 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访问查询mysql数据的三种方法
2006/10/09 PHP
如何在php中正确的使用json
2013/08/06 PHP
Yii Framework框架获取分类下面的所有子类方法
2014/06/20 PHP
php+mysql实现无限级分类
2015/11/11 PHP
php实现文章置顶功能的方法
2016/10/20 PHP
thinkPHP js文件中U方法不被解析问题的解决方法
2016/12/05 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
Javasipt:操作radio标签详解
2013/12/30 Javascript
九种原生js动画效果
2015/11/11 Javascript
JavaScript利用HTML DOM进行文档操作的方法
2016/03/28 Javascript
全面解析Bootstrap中nav、collapse的使用方法
2016/05/22 Javascript
jQuery实现布局高宽自适应的简单实例
2016/05/28 Javascript
概述jQuery中的ajax方法
2016/12/16 Javascript
Express URL跳转(重定向)的实现方法
2017/04/07 Javascript
BootStrap TreeView使用实例详解
2017/11/01 Javascript
vue.js中实现登录控制的方法示例
2018/04/23 Javascript
Python去除、替换字符串空格的处理方法
2018/04/01 Python
pandas 快速处理 date_time 日期格式方法
2018/11/12 Python
Django实现文件上传和下载功能
2019/10/06 Python
通过实例解析Python return运行原理
2020/03/04 Python
使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)
2020/10/12 Python
基于HTML5 Canvas:字符串,路径,背景,图片的详解
2013/05/09 HTML / CSS
美国女性卫生用品公司:Thinx
2017/06/30 全球购物
Willer台湾:日本高速巴士/夜行巴士预约
2017/07/09 全球购物
李维斯法国官网:Levi’s法国
2019/07/13 全球购物
Groupon法国官方网站:特卖和网上购物高达-70%
2019/09/02 全球购物
国际贸易专业个人鉴定
2014/02/22 职场文书
2015年元旦文艺汇演主持词
2014/03/26 职场文书
实践单位评语
2014/04/26 职场文书
大学生党员承诺书
2014/05/20 职场文书
2014年设备管理工作总结
2014/11/26 职场文书
如何用JavaScript学习算法复杂度
2021/04/30 Javascript
详解PHP设计模式之依赖注入模式
2021/05/25 PHP
Nginx实现高可用集群构建(Keepalived+Haproxy+Nginx)
2021/05/27 Servers
python opencv将多个图放在一个窗口的实例详解
2022/02/28 Python
“鬼灭之刃”热度不减,其成功背后的原因是什么?
2022/03/22 日漫