2016-05-30 19 views
1

我正在開發一個Flask應用程序,它從myanimelist.net API(sample)中檢索用戶的XML,對其進行處理並返回一些數據。返回的數據可能會有所不同,具體取決於用戶正在查看的Flask頁面,但在每個請求之前完成的初始過程(檢索XML,創建用戶對象等)始終是相同的。我可以在Flask請求中持久保存http連接(或其他數據)嗎?

目前,從myanimelist.net檢索XML是我應用程序性能的瓶頸,併爲每個請求增加了500-1000ms。由於應用程序的所有請求都是針對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() 

那麼,有沒有辦法像我提到的堅持有什麼聯繫?請讓我知道,如果我從正確的方向接近這一點。

+0

爲什麼不把你的get_xml與任務處理程序一起分發,這個任務處理程序會在後臺運行這個進程,例如Celery? – glls

+0

那不會像緩存一樣返回陳舊的結果嗎?這是不可避免的? – Noah

回答

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通道的客戶端差異(假設有差異)。
  • 客戶端:
    • 上接收的diff:更新與該差的本地XML。從WebSocket的
    • 斷開+斷開時添加的界面上的按鈕來重新

我懷疑你可以做任何事情要好得多假設myanimelist.net不提供「推n秒無活動後「API。

+0

只是爲了澄清 - 只爲連接的用戶進行更新(發現更改時),並按固定時間間隔進行更新? 「本地」XML(更新之間)將在用戶請求之間存儲在緩存中的什麼位置? – Noah

+0

是的,只在固定接口上更新已連接的用戶。你可以在更新之間或者在磁盤上將xml存儲在RAM中,但是是的,這是某種緩存。 –

相關問題