django视图叫了两次

时间:2013-07-28 06:52:52

标签: python django view web

抱歉我的英语不好,我会尽力描述我的问题。 我正在使用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非常有效。

4 个答案:

答案 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设置为“真实缓存”(如MemcachedCacheLocMemCache时才会出现问题(如果未设置此变量,则为默认值)等。