Python/Django中的全局请求变量可用吗?
我写了一个插件,用来发送信号来激活我的代码。不过,它没有把用户请求的对象传给我的代码。我想找到一种方法来获取当前的请求,而不需要修改主应用程序。我找不到关于全局请求的任何文档(就像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文档的这一部分。