在实用函数中使用Django request.session

3
我正在尝试从自定义的工具函数util.py中调用request.session.get('items', {}),但是在该文件中,request对象不可访问。我可以从views.py传递请求对象,但我不想这样做。有没有办法在自定义函数(不是视图/模板)中使用请求对象?我尝试从django.http import HttpRequest导入,但这个类没有任何会话变量。作为django初学者,非常感谢您的帮助。 util.py:
def processData(data=None):
   ## get items form  session
   items = request.session.get('items', {})  ## error name 'request' is not defined
   # append with data
   items.update(data)
   return items 

3
“request” 是您收到的请求。因此,您需要将“request”对象本身传递给“processData”。 - Willem Van Onsem
2个回答

1

你必须通过它。没有其他选择。

request 不是你可以从其他地方导入的通用变量。相反,它是刚刚发出的特定请求所包含的信息集合。它包含诸如 cookies 和当前 URL 等内容。

每当有人通过服务器发起请求时,它就会被生成,这就是为什么你在视图函数中看到它作为一个参数。

我想你可以将其转换为某种全局变量,但这是一条荒谬的路线。


1
是的,有一种方法可以实现这个。 - Toan Quoc Ho

1

有一个选项可以让你这样做,就是使用这个包:django-threadlocals。你应该查看他们的代码,看看它是如何实现的。

像这样:

from threadlocals.threadlocals import get_current_session

def processData(data=None):
    session = get_current_session()
    # Do your stuff here

如果你试图采用这种方法,请确保你理解django-threadlocals的作用。这是为了当我们希望在更深层次使用请求对象的一些数据而又不想通过每个闭包层传递请求对象时创建的。

这个问题也涉及是否应该使用它,但答案描述了我们为什么应该使用它的所有原因,请看一下。

希望对你有所帮助!


请给我一个你下投票的理由。是因为解决方案没有解决问题,或者不应该使用线程本地变量,还是我的表达有问题? - Toan Quoc Ho
不是投票者,但这种方法相当非标准。Django wiki上最初推荐这种方法的页面在2010年停止推荐线程本地存储,然后在2012年被彻底删除 - krubo
@krubo,我看到2010年的那篇文章似乎并不是一个推荐的方法,更像是一个警告。但后来他们将其删除了,所以Django是否应该继续保留它来提醒人们停止使用呢?或者作者已经改变了Django与线程工作的设计吗? - Toan Quoc Ho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接