Falcon 中变量的不稳定行为
Erratic behaviour of variables in Falcon
情况
我有一台连接到多台仪器的计算机。在这台计算机上,有一个 nginx
服务器为 Falcon WSGI
application using uWSGI 提供服务。该应用程序被认为是这样的,如果一个用户需要访问仪器,则其他人将无法使用。我通过以下一段(我的精简版)代码实现了这一点:
import json
import falcon
class Lab(object):
def __init__(self):
self.available_instruments = ["money_maker", "unicornifier"] # Not actual instruments
self.connected_instruments = []
def on_get(self, request, response):
response.status = falcon.HTTP_OK
response.content_type = "application/json"
response.body = json.dumps({
"connected": self.connected_instruments,
"available": self.available_instruments
})
def on_post(self, request, response):
json_body = json.loads(request.body)
instrument = json_body['connect']
if instrument in self.connected_instruments:
raise falcon.HTTPBadRequest('Busy')
elif instrument not in self.available_instruments:
raise falcon.HTTPBadRequest('No such instrument')
self.connected_instruments.append(instrument)
response.status = falcon.HTTP_OK
response.content_type = "application/json"
response.body = json.dumps({
"connected": self.connected_instruments,
"available": self.available_instruments
})
application = falcon.API()
l = Lab()
application.add_route('/', lab)
和请求正文
{
"connect": "money_maker"
}
问题
当我"connect"一个仪器时,立即回答显示它已连接。但是连续的 GET 请求没有给出预期的答案。我得到
{
"connected": [],
"available": ["money_maker", "unicornifier"]
}
但是如果我出于测试目的在本地 uWSGI 实例上执行上述代码,这不会发生。有没有我不知道的 nginx-uWSGI 交互?感谢任何帮助。
为了完整起见,这里跟在uWSGI调用的nginx.conf
和api.ini
文件之后
nginx/sites-available/api
#nginx config file for uWSGI requests routing
server {
listen 80;
server_name example.com;
location /api {
include uwsgi_params;
uwsgi_pass unix:///tmp/api.sock;
}
}
api.ini
[uwsgi]
master = true
processes = 5
socket = /tmp/%n.sock
chmod-socket = 666
uid = apidev
gid = www-data
chdir = %d../%n
pythonpath = %d../%n
module = %n
vacuum = true
self.connected_instruments.append(instrument)
只是将发布的数据存储在内存中!即,在一个进程的内存 space 中...但是当您在 nginx 后面 运行 5 uwsgi 进程时,您很有可能发布数据到一个进程,然后由没有该数据的另一个进程提供服务。
您必须使用数据库或所有进程可以共享的东西来保存和检索数据。
情况
我有一台连接到多台仪器的计算机。在这台计算机上,有一个 nginx
服务器为 Falcon WSGI
application using uWSGI 提供服务。该应用程序被认为是这样的,如果一个用户需要访问仪器,则其他人将无法使用。我通过以下一段(我的精简版)代码实现了这一点:
import json
import falcon
class Lab(object):
def __init__(self):
self.available_instruments = ["money_maker", "unicornifier"] # Not actual instruments
self.connected_instruments = []
def on_get(self, request, response):
response.status = falcon.HTTP_OK
response.content_type = "application/json"
response.body = json.dumps({
"connected": self.connected_instruments,
"available": self.available_instruments
})
def on_post(self, request, response):
json_body = json.loads(request.body)
instrument = json_body['connect']
if instrument in self.connected_instruments:
raise falcon.HTTPBadRequest('Busy')
elif instrument not in self.available_instruments:
raise falcon.HTTPBadRequest('No such instrument')
self.connected_instruments.append(instrument)
response.status = falcon.HTTP_OK
response.content_type = "application/json"
response.body = json.dumps({
"connected": self.connected_instruments,
"available": self.available_instruments
})
application = falcon.API()
l = Lab()
application.add_route('/', lab)
和请求正文
{
"connect": "money_maker"
}
问题
当我"connect"一个仪器时,立即回答显示它已连接。但是连续的 GET 请求没有给出预期的答案。我得到
{
"connected": [],
"available": ["money_maker", "unicornifier"]
}
但是如果我出于测试目的在本地 uWSGI 实例上执行上述代码,这不会发生。有没有我不知道的 nginx-uWSGI 交互?感谢任何帮助。
为了完整起见,这里跟在uWSGI调用的nginx.conf
和api.ini
文件之后
nginx/sites-available/api
#nginx config file for uWSGI requests routing
server {
listen 80;
server_name example.com;
location /api {
include uwsgi_params;
uwsgi_pass unix:///tmp/api.sock;
}
}
api.ini
[uwsgi]
master = true
processes = 5
socket = /tmp/%n.sock
chmod-socket = 666
uid = apidev
gid = www-data
chdir = %d../%n
pythonpath = %d../%n
module = %n
vacuum = true
self.connected_instruments.append(instrument)
只是将发布的数据存储在内存中!即,在一个进程的内存 space 中...但是当您在 nginx 后面 运行 5 uwsgi 进程时,您很有可能发布数据到一个进程,然后由没有该数据的另一个进程提供服务。
您必须使用数据库或所有进程可以共享的东西来保存和检索数据。