【问题标题】:django view called twicedjango 视图调用了两次
【发布时间】:2013-07-28 03:56:39
【问题描述】:

对不起,我的英语不好,我会尽力描述我的问题。 我将 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 中(在 and 处):

# Context processors
TEMPLATE_CONTEXT_PROCESSORS = {
   'django.contrib.messages.context_processors.messages',
}

配置数据库(mysite/mysite.db),甚至运行命令“python3 manage.py syncdb”

什么都没做。您可以轻松地复制它。

我的软件: - Python 3.2 - 姜戈 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 运行良好。

【问题讨论】:

  • 没有代码我们如何告诉你问题出在哪里?
  • 网址、视图的邮政编码以及您重定向的位置。
  • 请贴出你的代码,你的英文很好。
  • @user2626972 你解决了吗?我有完全相同的问题。

标签: python django view web


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    正是这一行调用了你的视图两次:

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

    我遇到了同样的问题...我打印了所有 request 并检查了 manage.py 发现 render calls views two more times for css files

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

    如果 request.method=='POST':

    解决这个问题。

    【讨论】:

      【解决方案3】:

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

      我发现了这个问题和CACHESsettings之间的联系:

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

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

      并确保您已配置 SESSION_ENGINE:

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

      在我的情况下,只有当 CACHES 设置为“真实缓存”时才会出现问题,例如 MemcachedCacheLocMemCache(如果未设置此变量则为默认值)等。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 我在 apache 2.2、MOD_WSGI 3.4、Python 3.2、Linux Mint 14 64 位下运行我的应用程序。
        猜你喜欢
        • 2014-02-20
        • 1970-01-01
        • 2017-06-11
        • 2020-05-24
        • 2016-03-19
        • 2017-12-19
        • 2010-11-09
        • 1970-01-01
        • 2017-06-19
        相关资源
        最近更新 更多