详解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文件及目录操作实例详解
Jun 04 Python
解析Python中while true的使用
Oct 13 Python
python中ASCII码字符与int之间的转换方法
Jul 09 Python
python游戏地图最短路径求解
Jan 16 Python
python获取微信企业号打卡数据并生成windows计划任务
Apr 30 Python
python实现两张图片拼接为一张图片并保存
Jul 16 Python
基于Python实现拆分和合并GIF动态图
Oct 22 Python
使用 Python ssh 远程登陆服务器的最佳方案
Mar 06 Python
Python爬虫设置ip代理过程解析
Jul 20 Python
详解Python Celery和RabbitMQ实战教程
Jan 20 Python
Python Django项目和应用的创建详解
Nov 27 Python
python_tkinter事件类型详情
Mar 20 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 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
2013/06/25 PHP
PHP中怎样防止SQL注入分析
2014/10/23 PHP
php对象在内存中的存在形式分析
2015/02/03 PHP
PHP使用Memcache时模拟命名空间及缓存失效问题的解决
2016/02/27 PHP
浅谈PHP中的
2016/04/23 PHP
PHP实现更改hosts文件的方法示例
2017/08/08 PHP
QQ登录简单实现代码
2021/03/09 Javascript
JS获取月的最后一天与JS得到一个月份最大天数的实例代码
2013/12/16 Javascript
extJS中常用的4种Ajax异步提交方式
2014/03/07 Javascript
JS、DOM和JQuery之间的关系示例分析
2014/04/09 Javascript
JavaScript中的bold()方法使用详解
2015/06/08 Javascript
jquery简单实现网页层的展开与收缩效果
2015/08/07 Javascript
js添加绑定事件的方法
2016/05/15 Javascript
微信小程序 在Chrome浏览器上运行以及WebStorm的使用
2016/09/27 Javascript
解决Vue不能检测数组或对象变动的问题
2018/02/24 Javascript
利用js将ajax获取到的后台数据动态加载至网页中的方法
2018/08/08 Javascript
JavaScript实现学生在线做题计时器功能
2018/12/05 Javascript
vue+elementUI实现图片上传功能
2019/08/20 Javascript
layui点击按钮页面会自动刷新的解决方案
2019/10/25 Javascript
JQuery Ajax如何实现注册检测用户名
2020/09/25 jQuery
关于IDEA中的.VUE文件报错 Export declarations are not supported by current JavaScript version
2020/10/17 Javascript
Python入门篇之条件、循环
2014/10/17 Python
在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例
2019/01/29 Python
详解python 3.6 安装json 模块(simplejson)
2019/04/02 Python
基于django传递数据到后端的例子
2019/08/16 Python
python3实现高效的端口扫描
2019/08/31 Python
基于python实现学生信息管理系统
2019/11/22 Python
Python远程开发环境部署与调试过程图解
2019/12/09 Python
如何快速一次性卸载所有python包(第三方库)呢
2020/10/20 Python
opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器
2020/11/13 Python
HTML5 层的叠加的实现
2020/07/07 HTML / CSS
文秘专业应届生求职信范文
2013/11/14 职场文书
婚礼新郎父母答谢词
2014/01/16 职场文书
“向国旗敬礼”活动策划方案(4篇)
2014/09/27 职场文书
2015年预算员工作总结
2015/05/14 职场文书
Win11怎么解除儿童账号限制?Win11解除微软儿童账号限制方法
2022/07/07 数码科技