python - 我可以跨 Flask 请求保持一个 http 连接(或其他数据)吗?

标签 python http flask

我正在开发一个 Flask 应用程序,它从 myanimelist.net API ( sample ) 检索用户的 XML,处理它,并返回一些数据。返回的数据可能因用户查看的 Flask 页面而异,但在每个请求之前完成的初始过程(检索 XML、创建用户对象等)始终相同。

目前,从 myanimelist.net 检索 XML 是我的应用程序性能的瓶颈,每个请求都会增加 500-1000 毫秒。由于应用程序的所有请求都发往 myanimelist 服务器,我想知道是否有办法保持 http 连接,以便在发出第一个请求后,后续请求的加载时间不会那么长。我不想缓存整个 XML,因为数据经常更改。

这是我的应用程序的总体概述:

from flask import Flask
from functools import wraps
import requests

app = Flask(__name__)


def get_xml(f): 
    @wraps(f)
    def wrap():
        # Get the XML before each app function
        r = requests.get('page_from_MAL') # Current bottleneck
        user = User(data_from_r) # User object
        response = f(user)
        return response
    return wrap


@app.route('/one')
@get_xml
def page_one(user_object):
    return 'some data from user_object'


@app.route('/two')
@get_xml
def page_two(user_object):
    return 'some other data from user_object'

if __name__ == '__main__':
    app.run()

那么有没有办法像我提到的那样保持连接?如果我从正确的方向着手,请告诉我。

最佳答案

我认为您没有从正确的方向来处理这个问题,因为您将您的应用过多地用作 myanimelist.net 的代理。

当您有 2000 个用户时会发生什么?您的应用程序最终会向 myanimelist.net 发出大量请求,而平均用户肯定可以对您的应用程序进行 DoS(或使用它来对 myanimelist.net 进行 DoS)。

恕我直言,这是一种更简洁的方式:

  • 服务器端:

    • 创建一个 websocket 服务器(例如:https://github.com/aaugustin/websockets/blob/master/example/server.py)
    • 当用户连接到 websocket 服务器时,将客户端添加到列表中,在断开连接时将其从列表中删除。
    • 对于每个连接的用户,请经常检查 myanimelist.net 以获取关联的 xml(可能在线用户越多,频率越低)
    • 对于每个 xml 文档,与您的服务器本地版本进行比较,然后使用 websocket channel 将该差异发送到客户端(假设存在差异)。
  • 客户端:
    • 收到差异:用差异更新本地 xml。
    • 在 n 秒不活动后断开与 websocket 的连接 + 断开连接时在界面上添加一个按钮以重新连接

如果 myanimelist.net 不提供“推送”API,我怀疑您能否做得更好。

关于python - 我可以跨 Flask 请求保持一个 http 连接(或其他数据)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37516409/

相关文章:

python - 复制枚举函数的功能而不使用它

java - 如何更改Java Filter中的HTTP响应内容长度 header

http - =3D 在恶意 URL 中的含义

python - 为什么 SQLAlchemy 不更新 Flask WSGI 服务器中的行值?

javascript - 将数据从 Python (Flask) 发送到 Javascript?

python - Discord.py 获取 channel 名称和服务器名称返回错误消息

python - 格式化 csv 以允许 numpy 制作数据框

python - 带有networkx的超图

html - 背景图片不通过 HTTPS 加载

python - Flask - 自定义装饰器打破路由