详解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在linux系统下获取系统内存使用情况的方法
May 11 Python
利用Python爬取可用的代理IP
Aug 18 Python
浅谈Scrapy框架普通反爬虫机制的应对策略
Dec 28 Python
numpy中以文本的方式存储以及读取数据方法
Jun 04 Python
pandas通过字典生成dataframe的方法步骤
Jul 23 Python
python中的global关键字的使用方法
Aug 20 Python
将python2.7添加进64位系统的注册表方式
Nov 20 Python
python 消除 futureWarning问题的解决
Dec 25 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
Mar 02 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
Mar 14 Python
基于Tensorflow读取MNIST数据集时网络超时的解决方式
Jun 22 Python
浅谈django不使用restframework自定义接口与使用的区别
Jul 15 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 简易输出CSV表格文件的方法详解
2013/06/20 PHP
php模仿asp Application对象在线人数统计实现方法
2015/01/04 PHP
PHP开发之用微信远程遥控服务器
2018/01/25 PHP
另类调用flash无须激活的方法
2006/12/27 Javascript
jQuery Ajax 实例全解析
2011/04/20 Javascript
JS中令人发指的valueOf方法介绍
2013/02/22 Javascript
NodeJS学习笔记之Connect中间件模块(二)
2015/01/27 NodeJs
jQuery实现向下滑出的二级菜单效果实例
2015/08/22 Javascript
全面了解JS中的匿名函数
2016/06/29 Javascript
Vue.js每天必学之计算属性computed与$watch
2016/09/05 Javascript
js实现带缓动动画的导航栏效果
2017/01/16 Javascript
Koa 使用小技巧(小结)
2018/10/22 Javascript
vue+php实现的微博留言功能示例
2019/03/16 Javascript
基于JavaScript实现单例模式
2019/10/30 Javascript
Vue路由对象属性 .meta $route.matched详解
2019/11/04 Javascript
JavaScript实现雪花飘落效果
2020/12/27 Javascript
python Django框架实现自定义表单提交
2016/03/25 Python
Python实现查看系统启动项功能示例
2018/05/10 Python
python实现requests发送/上传多个文件的示例
2018/06/04 Python
Python动态参数/命名空间/函数嵌套/global和nonlocal
2019/05/29 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
2020/04/15 Python
如何在VSCode下使用Jupyter的教程详解
2020/07/13 Python
python/golang实现循环链表的示例代码
2020/09/14 Python
html5与css3小应用
2013/04/03 HTML / CSS
环境工程与管理大学毕业生求职信
2013/10/02 职场文书
总裁办公室主任职责
2014/01/02 职场文书
前台文员个人求职信范文
2014/01/05 职场文书
党的群众路线教育实践活动个人对照检查材料(校长)
2014/11/05 职场文书
2016自主招生校长推荐信范文
2015/03/23 职场文书
小学工作总结2015
2015/05/04 职场文书
新闻稿格式范文
2015/07/18 职场文书
2015年网络舆情工作总结
2015/07/24 职场文书
Nginx使用X-Accel-Redirect实现静态文件下载的统计、鉴权、防盗链、限速等
2021/04/04 Servers
python实现MD5进行文件去重的示例代码
2021/07/09 Python
Python实现老照片修复之上色小技巧
2021/10/16 Python
python数字图像处理:图像的绘制
2022/06/28 Python