我编写了以下烧瓶服务器:
from flask import Flask, render_template, request
import os
app = Flask(__name__)
# home
@app.route('/')
def home():
return 'HOME PAGE'
@app.route('/add')
def add():
global a
a += 1
return str(a)
if __name__ == '__main__':
a = 0
HOST = '10.10.10.10'
PORT = 5555
app.run(HOST, PORT)
考虑到我的服务器有两个用户(来自不同的IP地址):A和B。当用户A通过URL 10.10.10.10:5555/add
请求时,他得到的结果1
。此后,如果用户B通过URL 10.10.10.10:5555/add
请求,他将获得2
。因为两个用户共享相同的变量a
但是,我希望服务器分别处理A和B,这意味着用户A和B以自己的方式拥有变量a
。 A的请求不应影响B的结果。例如,当用户A请求时,他得到1
。在用户B请求之后,他也应该获得1
。
我应该如何修改代码以实现此目的?
答案 0 :(得分:3)
根据您的问题,我认为您对“全局”的定义感到困惑。
在Flask中,您有一个Flask服务器,该服务器具有多个线程,并且可能有多个进程处理请求。您有一个全局变量a,并且您希望在每个请求中继续添加它,并希望变量是独立的,这在理论和实践上都是完全可能的。这也是一个非常糟糕的主意。这种情况实际上会造成死锁
问题是您无法轻松控制哪些线程和进程“获胜”
您应该使Web服务器本身尽可能保持无状态。每个请求应完全独立,并且不共享服务器中的任何状态。而是使用将为您处理状态的数据库或缓存层。这似乎更复杂,但实际上实际上更简单。以SQLite为例;很简单。
答案 1 :(得分:1)
由于@ n00dl3的建议,我设法实现了示例的目标。这是代码:
from flask import Flask, render_template, request, session
import os
from datetime import timedelta
app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24)
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days = 7)
# login
@app.route('/<username>', methods=['GET', 'POST'])
def home(username):
if username in session:
print(session.keys())
return 'hello {}'.format(username)
else:
session[username] = username
# generate this user's variable
a[username] = 0
print(session.keys())
return 'login as {}'.format(username)
# logout
@app.route('/logout/<username>', methods=['GET', 'POST'])
def logout(username):
session.pop(username)
print(session.keys())
return '{} logout!'.format(username)
# call add function with specific username
@app.route('/add/<username>')
def add(username):
global a
a[username] += 1
return str(a[username])
if __name__ == '__main__':
a = {}
#HOST = environ.get('SERVER_HOST', 'localhost')
HOST = '10.10.50.23'
try:
PORT = int(os.environ.get('SERVER_PORT', '5555'))
except ValueError:
PORT = 5555
app.run(HOST, PORT, debug=True)
但是,我不确定我的方法是否是一个不错的解决方案。因此,仍然要听任何更好的答案。
答案 2 :(得分:0)
使用其他WSGI服务器部署您的项目。看到此链接http://flask.pocoo.org/docs/1.0/deploying/