Как обрабатывать запросы нескольких пользователей отдельно во Flask? - PullRequest
0 голосов
/ 06 ноября 2018

Я написал следующий колб-сервер:

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. Например, когда пользователь А запрашивает, он получает 1. После этого пользователь Б запрашивает, и он также должен получить 1.

Как мне изменить мой код для достижения этой цели?

Ответы [ 3 ]

0 голосов
/ 06 ноября 2018

используйте другой сервер WSGI для развертывания вашего проекта. см. эту ссылку http://flask.pocoo.org/docs/1.0/deploying/

0 голосов
/ 07 ноября 2018

Благодаря предложению @ 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)

Однако я не уверен, является ли мой путь достойным решением. Так что послушайте все лучшие ответы.

0 голосов
/ 06 ноября 2018

Исходя из вашего вопроса, я думаю, вы не понимаете, что такое "глобальный".

В Flask у вас есть сервер Flask с несколькими потоками и потенциально несколькими процессами, обрабатывающими запросы. у вас была глобальная переменная a, и вы хотели добавлять к ней каждый запрос и хотите, чтобы переменная была независимой. Это вполне возможно в теории и на практике. Это тоже очень плохая идея. Этот случай фактически создает Deadlocks

Проблема в том, что вы не можете легко контролировать, какие потоки и процессы "выигрывают"

Вы должны держать сам веб-сервер как можно без состояний. Каждый запрос должен быть полностью независимым и не иметь общего состояния на сервере. Вместо этого используйте слой базы данных или кэширования, который будет обрабатывать состояние за вас. Это кажется более сложным, но на самом деле проще на практике. Проверьте SQLite например; это довольно просто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...