【问题标题】:use Django request.session inside utility function在实用程序函数中使用 Django request.session
【发布时间】:2020-01-28 22:09:14
【问题描述】:

我正在尝试从自定义 util 函数 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 

【问题讨论】:

  • request 是您收到的请求。因此,您还需要将 request 对象本身传递给 processData

标签: python django


【解决方案1】:

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

request 不是一些通用变量,您只能从其他地方导入。相反,它是一组特定于刚刚提出的特定请求的信息。它包含诸如 cookie 和当前 URL 之类的内容。

每当有人通过服务器向它发出请求时都会生成它,这就是为什么您将其视为视图函数的参数。

我想你可以把它变成某种全局变量,但这是一条荒谬的路线。

【讨论】:

  • 是的,有一个选项可以实现这一目标
【解决方案2】:

有一个选项允许您使用此软件包:django-threadlocals。你应该看看他们的代码,看看它是怎么做的。

像这样:

from threadlocals.threadlocals import get_current_session

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

如果您尝试采用这种方法,请确保您了解 django-threadlocals 的作用。这是因为如果我们想在更深层使用请求对象的一些数据,并且您不想通过每个闭包层传递请求对象。

This question也很关心到底要不要用,不过答案描述了我们应该用它的所有理由,所以请看一下。

希望有帮助!

【讨论】:

  • 请给我一个拒绝投票的理由。是因为解决方案没有解决问题还是不应该使用本地线程或者我的话有问题
  • 不是反对者,但这是一种非常不标准的方法。 Django wiki 上最初推荐这种方法的页面stopped recommending threadlocal storage in 2010,然后是was deleted altogether by 2012
  • @krubo,我看到 2010 年的文章似乎不是推荐的方法,更像是警告。但是后来他们删除了它,Django 是否还应该保留它以提醒人们停止使用它?或者作者已经改变了 Django 如何使用线程的设计??
猜你喜欢
  • 2021-07-17
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 2014-01-08
  • 2018-10-13
  • 1970-01-01
  • 2020-05-10
相关资源
最近更新 更多