对不起我的英语不好,我会尽力描述我的问题。我将 Django 1.5 与 Python 3.2 一起使用。我正在使用 django.contrib.messages 在重定向用户后向用户显示消息。如果我尝试加载重定向到显示消息的另一个页面的页面,则在多次尝试后它不会删除以前的消息(仅删除上一页的消息)。因此,我看到的是 2 条相同的消息。这只发生在 Google Chrome(和 Cromium)中。永远不要在 FireFox 或 Opera 中。无论消息是保存为 cookie 还是会话中。视图函数被调用了两次,但我不知道为什么 Chrome 与它有什么特别的关系(???)。
我录制了视频:http ://www.youtube.com/watch?v=nXtQ0uj1Hbw&feature=youtu.be 。
后来添加...
好的。我为此启动了一个新项目(项目“mysite”,其中包含一个名为“test_app”的应用程序):
mysite/urls.py 的内容:
from django.conf.urls import patterns, include, url
urlpatterns = patterns('',
url(r'^ms', include('test_app.urls', namespace="testapp")),
)
test_app.py 的内容
from django.conf.urls import patterns, url
urlpatterns = patterns('test_app.views',
url(r'/go-away/$', 'go_away', name='go-away'),
url(r'/come-here/$', 'come_here', name='come-here'),
)
test_app/views.py 的内容
from django.shortcuts import render
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
from django.contrib import messages
import random
def go_away(request):
messages.info(request, 'FORBIDDEN PLACE! Float: %f' % random.random())
return HttpResponseRedirect(reverse('testapp:come-here'))
def come_here(request):
return render(request, 'testapp/template.html', {})
testapp/templates/testapp/template.html 的内容
{% if messages %}
<ul>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% else %}
There was no redirection.
{% endif %}
除此之外,我添加到我的 settings.py (在和):
# Context processors
TEMPLATE_CONTEXT_PROCESSORS = {
'django.contrib.messages.context_processors.messages',
}
配置数据库(mysite/mysite.db),甚至运行命令“python3 manage.py syncdb”
没有做其他任何事情。您可以轻松地复制它。
我的软件: - Python 3.2 - Django 1.5 - 带有从源代码编译的 MOD_WSGI 的 Apache 2.2。- 所有这些都在 Linux Mint 14 下。
最后你应该看到什么: http ://www.youtube.com/watch?v= 3L27iwP1PqM&feature=youtu.be 质量不是最重要的,但我确实在这里粘贴了代码。
如您所见,浮动都是不同的,这意味着消息仅在一个请求期间添加,并且不会在任何其他页面上显示。这意味着,据我所知,视图函数运行了两次,忽略了第一次重定向。
PS:会话也是一样,如果你手动将消息保存到 request.session.messages 列表中。我只有在使用 Chrome 或 Chromium 时才会遇到这样的问题。如您所见,Opera 运行良好。