我正在尝试设置我的第一款django应用。我使用过nginx + uwsgi + django。我测试了一个简单的Hello World视图,但是当我检查网址时,每次刷新会得到不同的结果:
AttributeError
/control/
Hello world
标准的Django消息: 它奏效了! 祝贺你第一个支持Django的页面。
在urls.py
我有这个简单的模式:
urlpatterns = patterns('',
url(r'^control/?$',hello),
)
在views.py
我有:
def hello(request):
return HttpResponse("Hello world")
为什么每次刷新的结果会有所不同?
答案 0 :(得分:1)
如何启动和停止uWSGI服务器可能是一个问题。
默认情况下,当代码更改时,uWSGI不会重新加载自身,因此除非停止或重新加载,否则它将包含旧的django代码的缓存版本并使用它进行操作。但是,只要第一次请求,缓存就不会立即发生。但是...... uWSGI可以同时生成多个worker,因此它可以一次处理多个请求(每个工作线程可以一次处理一个请求),并且worker将拥有自己的缓存版本的代码。
所以有一个场景可能是:你已经启动了你的uWSGI服务器,然后你做了一些请求(在创建任何视图之前,所以它工作的标准django显示出来),那个时候一个工作者缓存负责该动作的代码。您已经决定更改某些内容,但是您已经做了一些错误,在下一个请求代码中,提供该错误的内容缓存在另一个工作者上。然后你修复了这个错误,下一个工作人员缓存了固定代码,为你提供了你的hello world响应。
现在有一种情况是所有工作人员都有一些代码的缓存版本,并且根据哪一个代码处理你的代码,你会得到不同的结果。
解决方案是:重新启动uWSGI实例,并将py-auto-reload
添加到uWSGI配置中,这样uWSGI将在代码更改时自动重新加载(仅在开发中使用该选项,从不在生产环境中使用)。 / p>
其他情况是:您没有多个工作人员,但每次您在代码中更改某些内容时,您都会在不停止旧的uWSGI实例的情况下启动它。这将导致多个实例同时运行,并且当您使用unix套接字时,它们将共存,在处理请求时轮流执行。如果是这种情况,请停止所有uWSGI实例,然后在开始新实例之前停止旧实例。或者只是简单地重装旧的。