我正在开发一个 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/