抱歉我的英语不好,我会尽力描述我的问题。 我正在使用Django 1.5和Python 3.2。我正在使用django.contrib.messages在重定向后向用户显示消息。如果我尝试加载重定向到另一个显示消息的页面的页面,经过多次尝试后,它不会删除以前的消息(仅限于上一个上一页)。所以,我看到的是两条相同的消息。这仅在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 质量不是最好的,但我确实在这里粘贴了代码。
正如您所看到的,浮点数都是不同的,这意味着只在一个请求期间添加消息,而不会在任何其他页面上显示消息。这意味着,据我所知,视图函数运行了两次,忽略了第一次重定向。
P.S。:如果您将消息手动保存到request.session.messages列表中,则与会话相同。 我只有在使用Chrome或Chromium时才遇到这样的问题。正如您所见,Opera非常有效。
答案 0 :(得分:3)
Google Chrome会在您输入网址时发送请求。因此,当您按Enter键时,它会发送另一个请求。您遇到的问题可能是因为输入网址和按Enter键之间的时间非常短。
您可以实现基于时间的视图like来解决问题。
答案 1 :(得分:1)
这一行调用你的观点两次:
返回渲染(请求,&#39; testapp / template.html&#39;,{})
我遇到了同样的问题...我打印了所有 请求 并检查了 manage.py <的日志/ strong>并发现 render calls views two more times for css files
为了避免这种情况,我调用了另一个函数来处理数据。 当然,你可以添加
如果request.method ==&#39; POST&#39;:
解决这个问题。
答案 2 :(得分:0)
女贞! 尝试在不是内置的django webserver中运行app。我不知道,但也许,你经常刷新页面,而webserver中的biult没有时间完成之前的回复。
答案 3 :(得分:0)
我遇到了同样的问题,除了我使用的是Django 1.6,Python 2.7,我在非Chrome浏览器(Firefox)中也看到了这个问题。
我发现此问题与CACHES
settings:
尝试在生产服务器上设置(Apache):
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
}
}
并确保您已配置SESSION_ENGINE
:
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
在我的情况下,只有当CACHES
设置为“真实缓存”(如MemcachedCache
或LocMemCache
时才会出现问题(如果未设置此变量,则为默认值)等。