Django视图在刷新时返回多个结果

时间:2015-08-29 12:09:41

标签: python django django-views

我正在尝试设置我的第一款django应用。我使用过nginx + uwsgi + django。我测试了一个简单的Hello World视图,但是当我检查网址时,每次刷新会得到不同的结果:

  1. AttributeError /control/

  2. Hello world

  3. 标准的Django消息: 它奏效了! 祝贺你第一个支持Django的页面。

  4. urls.py我有这个简单的模式:

    urlpatterns = patterns('',
                    url(r'^control/?$',hello),
                )
    

    views.py我有:

    def hello(request):
        return HttpResponse("Hello world")
    

    为什么每次刷新的结果会有所不同?

1 个答案:

答案 0 :(得分:1)

如何启动和停止uWSGI服务器可能是一个问题。

默认情况下,当代码更改时,uWSGI不会重新加载自身,因此除非停止或重新加载,否则它将包含旧的django代码的缓存版本并使用它进行操作。但是,只要第一次请求,缓存就不会立即发生。

但是...... uWSGI可以同时生成多个worker,因此它可以一次处理多个请求(每个工作线程可以一次处理一个请求),并且worker将拥有自己的缓存版本的代码。

所以有一个场景可能是:你已经启动了你的uWSGI服务器,然后你做了一些请求(在创建任何视图之前,所以它工作的标准django显示出来),那个时候一个工作者缓存负责该动作的代码。您已经决定更改某些内容,但是您已经做了一些错误,在下一个请求代码中,提供该错误的内容缓存在另一个工作者上。然后你修复了这个错误,下一个工作人员缓存了固定代码,为你提供了你的hello world响应。

现在有一种情况是所有工作人员都有一些代码的缓存版本,并且根据哪一个代码处理你的代码,你会得到不同的结果。

解决方案是:重新启动uWSGI实例,并将py-auto-reload添加到uWSGI配置中,这样uWSGI将在代码更改时自动重新加载(仅在开发中使用该选项,从不在生产环境中使用)。 / p>

其他情况是:您没有多个工作人员,但每次您在代码中更改某些内容时,您都会在不停止旧的uWSGI实例的情况下启动它。这将导致多个实例同时运行,并且当您使用unix套接字时,它们将共存,在处理请求时轮流执行。如果是这种情况,请停止所有uWSGI实例,然后在开始新实例之前停止旧实例。或者只是简单地重装旧的。