我已经编写了以下flask服务器:
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
。
我应该如何修改我的代码来实现这一点?
发布于 2018-11-06 16:54:40
根据你的问题,我认为你对“全局”的定义感到困惑。
在Flask中,您有一个具有多个线程的Flask服务器,并且可能有多个处理请求的进程。你有一个全局变量a,你想在每个请求中不断添加它,并希望变量为independent.This在理论和实践中都是完全可能的。这也是一个非常糟糕的想法。这种情况实际上会产生死锁。
问题是您不能轻松地控制哪个线程和进程“获胜”。
您应该使You服务器本身尽可能保持无状态。每个请求应该是完全独立的,并且不共享服务器中的任何状态。相反,您可以使用数据库或缓存层来为您处理状态。这看起来更复杂,但实际上更简单。以SQLite为例,它非常简单。
发布于 2018-11-07 17:25:27
感谢@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)
然而,我不确定我的方式是否是一个好的解决方案。所以还是要听听更好的答案。
发布于 2018-11-06 17:07:23
使用不同的WSGI服务器部署您的项目。请参阅此链接http://flask.pocoo.org/docs/1.0/deploying/
https://stackoverflow.com/questions/53168297
复制相似问题