Python/Django中的全局请求变量可用吗?

19 投票
6 回答
16850 浏览
提问于 2025-04-17 01:02

我写了一个插件,用来发送信号来激活我的代码。不过,它没有把用户请求的对象传给我的代码。我想找到一种方法来获取当前的请求,而不需要修改主应用程序。我找不到关于全局请求的任何文档(就像PHP中的$_SERVER['REMOTE_ADDR']那样)。

我想知道在Python/Django中有没有类似的变量可以做到这一点。

6 个回答

4

据我所知,这个功能是不可用的,除非你自己去实现它。

你可以复制并粘贴其他回答中提供的代码片段,或者你可以使用这个库:https://pypi.python.org/pypi/django-crequest

这个中间件可以让你随时访问当前的请求。

23

Django并没有提供一个全局的请求对象(其实它应该是线程本地的,而不是全局的)。不过,你可以使用一些方法自己实现类似的效果:http://nedbatchelder.com/blog/201008/global_django_requests.html

-1

根据我的理解,你可以通过一些方法来定义你的Django视图,比如:

def detail(request, some_param):
  # [...]

这里的参数 request 包含了关于HTTP请求的信息。例如,request.META['HTTP_X_FORWARDED_FOR'] 可以返回客户端的IP地址。

如果你的插件和请求有关,它的类和函数可能会在你的视图中被创建或调用。这就意味着你需要把当前的 request 对象传递给它,因为让一个 全局 的请求对象存在是没有意义的。 在PHP中,这是可以做到的,因为每次请求都会从头执行整个代码,但在Django中,请求是由服务器处理的,并通过 HttpRequest 对象在框架中传递。想了解更多信息,可以参考 Django文档的这一部分

撰写回答