【问题标题】:How to send a session message to an anonymous user in a Django site?如何向 Django 站点中的匿名用户发送会话消息?
【发布时间】:2010-10-16 10:08:28
【问题描述】:

我经常使用以下方式在我的 Django 应用视图中向登录用户显示有关用户操作的消息:

request.user.message_set.create("message to user")

我怎样才能为匿名(未登录)用户做同样的事情?匿名用户没有 request.user ,但 Django 文档说使用“会话”中间件可以执行与上述代码相同的操作。链接到会话中间件的 Django 文档声称这是可能的,但我无法从会话文档中找到如何做到这一点。

【问题讨论】:

    标签: python django session django-views


    【解决方案1】:

    这就是我所做的,使用上下文处理器:

    project/application/context.py(检查消息并将它们添加到上下文中):

    def messages(request):
        messages = {}
        if 'message' in request.session:
            message_type = request.session.get('message_type', 'error')
            messages = {'message': request.session['message'],
                        'message_type': message_type}
            del request.session['message']
            if 'message_type' in request.session:
                del request.session['message_type']
        return messages
    

    project/settings.py(将上下文添加到TEMPLATE_CONTEXT_PROCESSORS):

    TEMPLATE_CONTEXT_PROCESSORS = (
        "django.core.context_processors.request",
        "django.core.context_processors.debug",
        "django.core.context_processors.media",
        "django.core.context_processors.auth",
        "project.application.context.messages",  
    )
    

    使用上述函数messages 将在每个请求上调用,并且它返回的任何内容都将添加到模板的上下文中。有了这个,如果我想给用户一个消息,我可以这样做:

    def my_view(request):
        if someCondition:
            request.session['message'] = 'Some Error Message'
    

    最后,在模板中你可以检查是否有错误要显示:

    {% if message %}
        <div id="system_message" class="{{ message_type }}">
            {{ message }}
        </div>
    {% endif %}
    

    消息类型仅用于设置样式,具体取决于它是什么(“错误”、“通知”、“成功”)以及设置方式,您一次只能为用户添加 1 条消息,但是这就是我真正需要的,所以它对我有用。它可以很容易地更改为允许多条消息等。

    【讨论】:

      【解决方案2】:

      请参阅http://code.google.com/p/django-session-messages/,直到启用基于会话的消息的补丁登陆 Django 树(正如我最近看到的,它被标记为 1.2,所以没有希望快速添加...)。

      另一个具有类似功能的项目是 Django Flash (http://djangoflash.destaquenet.com/)。

      【讨论】:

      • 不幸的是 django_session_messages 不能与 django.core.context_processors.auth 一起使用,它会在此补丁中的代码运行之前删除所有用户消息。可能有人会考虑在 django 中重新做整个消息系统。
      • 如果你在设置中翻转两个上下文处理器的顺序,第二个会覆盖消息列表,所以它也无济于事。
      【解决方案3】:

      将数据直接存储在会话中,这是一个类似dict的对象。然后在视图/模板中,检查该值。

      更多信息在这里:

      http://docs.djangoproject.com/en/dev/topics/http/sessions/#using-sessions-in-views

      您还可以创建一个中间件类来检查每个请求的会话对象,并在那里进行构建/拆除。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-04
        • 1970-01-01
        • 2012-02-14
        • 2018-10-25
        • 1970-01-01
        • 1970-01-01
        • 2021-03-22
        • 1970-01-01
        相关资源
        最近更新 更多