我可以在Flask请求中保留http连接(或其他数据)吗?

时间:2016-05-30 01:06:16

标签: 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()

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

1 个答案:

答案 0 :(得分:0)

我认为你并没有从正确的方向接近这个问题,因为你将你的应用程序作为myanimelist.net的代理而过多。

拥有2000名用户时会发生什么?您的应用程序最终会向myanimelist.net提出大量请求,而且一个普通用户肯定可以使用您的应用程序(或将其用于DoS myanimelist.net)。

这是一个更清洁的方式恕我直言:

  • 服务器端:

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

我怀疑你能做得更好,假设myanimelist.net没有提供"推送" API。