Django消息框架,自定义中间件和HttpResponseRedirect

时间:2011-01-04 15:25:23

标签: django django-templates django-middleware

注意:重写问题是因为过度简化导致了错误的示例代码。

要对此进行测试,请确保您在主机文件中包含以下设置:

test.local 127.0.0.1
subdomain.test.local 127.0.0.1

在settings.py中,将Cookie设置为跨子域工作:

SESSION_COOKIE_DOMAIN = '.test.local'

然后我有一块看起来像这样的中间件:

from django.contrib import messages
from django.http import HttpResponseRedirect

class AuthorizeAccount:

    def process_request(self, request):
        if request.get_host() != 'test.local:8000':
            messages.error(request, u'No subdomain!')
            return HttpResponseRedirect('http://test.local:8000/')
        return None

我的模板包含:

{% if messages %}
    <ul class="messages">
        {% for message in messages %}
        <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
        {% endfor %}
    </ul>
{% endif %}

您可以转到开发服务器上的http://test.local:8000(预计没有消息)并转到http://subdomain.test.local:8000(期望重定向到http://test.local:8000并发送消息)来测试这一点。

我确实得到了重定向但我没有收到消息。我错过了什么或者这是一个错误吗?

1 个答案:

答案 0 :(得分:2)

消息通过会话与用户相关联。但会话ID存储在cookie中 - 而cookie是特定于域的。然而,中间件的重点是从一个域重定向到另一个域。重定向后,用户将在新域上获得新的cookie。

换句话说,这不可能像现在一样有效。唯一的选择是将某些内容放入重定向请求的GET参数中。