【问题标题】:Getting a request object as in a view function but called from `manage.py shell`在视图函数中获取请求对象,但从 `manage.py shell` 调用
【发布时间】:2012-10-12 00:24:06
【问题描述】:

当我从views.py 中的视图函数打印请求对象时,我得到一个类似于字典的django.core.handlers.wsgi.WSGIRequest 对象(继承自django.http.HttpRequest)。从视图函数打印这个类似字典的对象会返回一堆值,尤其是对于 META 键。

现在我想从我的项目的manage.py shell 中调用相同的数据,但handlers 不是shell 中django.core 的属性,所以我无法获取django.core.handlers.wsgi.WSGIRequest 对象。有没有办法像在我的视图函数中那样获取请求对象,但从manage.py shell 调用?

【问题讨论】:

  • 为什么需要在 shell 中使用它?
  • 真的不确定你想在这里做什么。但是你可以在shell中导入WSGIRequestfrom django.core.handlers.wsgi import WSGIRequest
  • 方便,我想从manage.py shell 中的类字典对象中访问值。
  • @John:我怎样才能为 WSGIRequest 中的键加载与我的视图函数相同的值? (要查看我正在谈论的那些值:只需在视图函数中添加 print request 并通过转到相关 url 来触发该视图函数。)
  • 只是为了复制一个请求对象并从 shell 中对其进行自省。我更喜欢这样做,而不是每次都需要调整我的views.py。您可以从views.py 填充模型,也可以从manage.py shell 执行它并从那里自省您的模型,所以我为什么不想要请求对象的类似功能。

标签: python django


【解决方案1】:

由于您的目标是“复制请求对象并从 shell 中调整它以进行自省”,因此完成调整请求对象的最简单方法是使用调试器。

将以下内容复制粘贴到您的视图中并重新加载:

import pdb; pdb.set_trace()

现在重新加载指向该视图的页面,您可以使用PDB's debugger commands 来执行您的内容。比如在视图函数中可以使用p request打印request的值,也可以执行标准的python代码:

(Pdb) path = request.META['USERNAME']
(Pdb) h p
p expression
Print the value of the expression.
(Pdb) p path
'Caspar'
(Pdb) from foo.models import MyUser
(Pdb) MyUser.objects.all()
[<MyUser: Bob: 3.62810036125>, <MyUser: Tim: no rating>, <MyUser: Jim: 2.41014167534>, <MyUser: Rod: 1.35651839383>]

更好的是,安装ipdb (pip install ipdb),它可以让您使用更好的IPython shell,具有精美的颜色和制表符补全。

或者,如果您不需要调试器而只需要一个交互式控制台,请安装 IPython (pip install ipython) 并使用以下 sn-p:

import IPython; IPython.embed()

注意,IPython 是 ipdb 的先决条件,所以安装 ipdb 也会安装 IPython。

【讨论】:

猜你喜欢
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-08
  • 2019-09-14
  • 2011-03-11
  • 2013-12-18
  • 1970-01-01
相关资源
最近更新 更多