6

对不起我的英语不好,我会尽力描述我的问题。我将 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 运行良好。

4

4 回答 4

3

当您输入网址时,Google Chrome 会发送一个请求。因此,当您按 Enter 时,它会发送另一个请求。您遇到的问题可能是因为输入 url 和按 enter 之间的时间很短。

您也许可以实现这样的基于时间的视图规避这个问题。

于 2015-03-18T22:37:58.047 回答
2

正是这条线两次调用了您的视图:

返回渲染(请求,'testapp/template.html',{})

我遇到了同样的问题...我打印了所有请求并检查了manage.py的日志,发现 渲染调用查看了两次 css 文件

为了避免这种情况,我调用了另一个函数来处理数据。当然,你可以添加

如果 request.method=='POST':

来解决这个问题。

于 2016-11-08T12:15:46.013 回答
0

女贞!尝试在未内置的 django 网络服务器上运行应用程序。我不知道,但也许,你经常刷新页面并且网络服务器中的 biult 没有时间完成以前的响应。

于 2013-07-28T08:07:41.503 回答
0

我有同样的问题,除了我使用的是 Django 1.6、Python 2.7 并且我在非 Chrome 浏览器 (Firefox) 中也看到了这个问题。

我发现了这个问题和CACHES 设置之间的联系:

尝试在您的生产服务器(Apache)上设置:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.dummy.DummyCache',
    }
}

并确保您已配置SESSION_ENGINE

SESSION_ENGINE = 'django.contrib.sessions.backends.db'

就我而言,问题仅在CACHES设置为“真实缓存”MemcachedCacheLocMemCache(如果未设置此变量时为默认值)等设置时出现。

于 2014-03-01T17:39:13.953 回答