首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Flask中分别处理多个用户的请求?

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

Stack Overflow用户
提问于 2018-11-06 16:33:10
回答 3查看 7.7K关注 0票数 2

我已经编写了以下flask服务器:

代码语言:javascript
运行
复制
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

我应该如何修改我的代码来实现这一点?

EN

回答 3

Stack Overflow用户

发布于 2018-11-06 16:54:40

根据你的问题,我认为你对“全局”的定义感到困惑。

在Flask中,您有一个具有多个线程的Flask服务器,并且可能有多个处理请求的进程。你有一个全局变量a,你想在每个请求中不断添加它,并希望变量为independent.This在理论和实践中都是完全可能的。这也是一个非常糟糕的想法。这种情况实际上会产生死锁。

问题是您不能轻松地控制哪个线程和进程“获胜”。

您应该使You服务器本身尽可能保持无状态。每个请求应该是完全独立的,并且不共享服务器中的任何状态。相反,您可以使用数据库或缓存层来为您处理状态。这看起来更复杂,但实际上更简单。以SQLite为例,它非常简单。

票数 4
EN

Stack Overflow用户

发布于 2018-11-07 17:25:27

感谢@n00dl3的建议,我成功地实现了示例的目标。代码如下:

代码语言:javascript
运行
复制
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)

然而,我不确定我的方式是否是一个好的解决方案。所以还是要听听更好的答案。

票数 1
EN

Stack Overflow用户

发布于 2018-11-06 17:07:23

使用不同的WSGI服务器部署您的项目。请参阅此链接http://flask.pocoo.org/docs/1.0/deploying/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53168297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档