如何在Flask中分别处理多用户的请求?

时间:2018-11-06 08:33:10

标签: python 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

我应该如何修改代码以实现此目的?

3 个答案:

答案 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/