在 Django 中,是不是可以从自定义标签中访问当前用户会话?

Posted

技术标签:

【中文标题】在 Django 中,是不是可以从自定义标签中访问当前用户会话?【英文标题】:In Django, is it possible to access the current user session from within a custom tag?在 Django 中,是否可以从自定义标签中访问当前用户会话? 【发布时间】:2010-09-25 00:21:26 【问题描述】:

我正在 Django 中编写一个自定义标记,该标记应输出存储在用户会话中的值,但我找不到从自定义标记函数中访问会话对象的方法。有没有办法做到这一点,而无需手动将会话对象分配给上下文变量?

【问题讨论】:

【参考方案1】:

您应该能够在 settings.py 文件中添加请求上下文处理器:

TEMPLATE_CONTEXT_PROCESSORS = ("django.core.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
'django.core.context_processors.request',)

这将与当前答案执行相同的操作,而无需添加自定义文件。

【讨论】:

我建议将答案切换到这种方法,它更干净。 我已经有了那个预处理器,但肯定忽略了会话属性。哦!谢谢。 我已经添加了这个,但是如何从模板中访问请求? context.session 不存在。 @Wouter 会话可在request.session【参考方案2】:

Sebastian 无意冒犯,因为这似乎是一个有用的 hack,但奇怪的是,12 月 24 日,在一篇关于在 Admin 中访问用户数据的博客文章中,Django 的发布经理 James Bennett 这么说 @ 987654321@:

一个重要的免责声明:这些类型的功能有很多潜在的用途。他们中的许多人都是错误的和愚蠢的,你不应该尝试它们。 ... 此外,您偶尔会看到有人建议这些功能可以通过所谓的“threadlocal hack”获得;这基本上涉及将 request.user 粘贴到一种神奇的全局可用变量中,如果您不知道自己在做什么,那么使用它是一件非常糟糕的事情。即使您确实知道自己在做什么,这通常也是一件非常糟糕的事情,因为您可能只是因为懒惰并且不想确保正确传递信息而这样做。因此,如果您看到有人建议您使用“threadlocal”执行此操作,请忽略该人。

并不是说您应该忽略 Sebastian,但可能值得追求其他途径而不是使用不是最佳实践的 threadlocal。

【讨论】:

这是很重要的一点,但我必须指出,也许 Bennett 先生关于程序员可能“懒惰并且不喜欢确保正确传递信息”的评论并不完全公平。 Django 中一个反复出现的问题是弄清楚如何正确传递信息。通常这不是懒惰,而是完全可以访问您需要的变量。那就是说;他显然是对的,threadlocal hack 是一件非常糟糕的事情。【参考方案3】:

您可以使用自定义上下文处理器执行此操作(请参阅 http://docs.djangoproject.com/en/dev/ref/templates/api/)

在这种情况下,您将在 settings.py 文件的同一级别创建一个名为 context_processors.py 的新文件,其中包含:

def add_session(request):
    return 'session': request.session

然后,在你的 settings.py 文件中,添加:

TEMPLATE_CONTEXT_PROCESSORS = ("django.core.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
'context_processors.add_session',)

您现在可以在自定义标记中引用 context['session']。

请注意,这仅适用于分配了 RequestContext 的模板,如以下代码所示:

def test(request):
    return render_to_response('test.html',, context_instance=RequestContext(request))

【讨论】:

【参考方案4】:

我发现这很有用:http://code.djangoproject.com/wiki/CookBookThreadlocalsAndUser

您可以使用中间件获取用户信息并将其存储在本地线程中,然后将其与您的标签定义一起使用。

【讨论】:

【参考方案5】:

使用来自 django-annoying 的 render_to 装饰器似乎是最好的选择(如 another question on *** 所示)

【讨论】:

以上是关于在 Django 中,是不是可以从自定义标签中访问当前用户会话?的主要内容,如果未能解决你的问题,请参考以下文章

如何判断 UITabBar 是不是从自定义视图打开?

从自定义 Django 用户模型中删除密码

获取高级自定义模板标记中的请求上下文

从自定义授权方 Lambda 函数访问 POST 请求正文

Wordpress - 从自定义帖子类型中删除子菜单

从自定义表格视图单元格获取数据到另一个 VC?