簡體   English   中英

在多個燒瓶視圖中訪問類實例?

[英]Accessing class instances in multiple flask views?

假設我有一個類,用於存儲呈現站點所需的重要動態數據。 應該為每個用戶單獨創建此類,並且需要根據一些用戶輸入來更新該類中的數據,因此我至少有兩個視圖:

@app.route('/')
def index():
    myclass = MyClass()
    return render_template('index.html')

@app.route('/_update', methods=['GET'])
def update():
    ret_data = {"value": request.args.get('c', type=float)}
    a = myclass.calculate(ret_data['value'])
    return jsonify(result=a)

當然,它不能以這種方式工作,因為myclassupdate()不存在-因此,一種可行的解決方案是使myclass在創建時成為全局類。 但這似乎並不干凈,並且破壞了每個會話中單獨上課的可能性。

因此,是否有任何干凈的方法可以在不同的視圖中訪問類實例,或者我應該如何處理,對我來說,這並不是一種不常見的情況。

其次,我想為每個用戶創建該類實例,但也要在每個用戶關閉其瀏覽器窗口時都關閉該類實例__del__()我真的不知道該怎么做,我的類中有一個__del__()函數,但如果將實例設置為global,則不會使用它。

非常感謝你!

您對Web應用程序如何工作有基本的誤解。 它們是無狀態的 :對於任何特定用戶的請求之間不會共享任何內容。 相反,無論碰巧碰到哪個應用程序,任何用戶都可以訪問任何全局變量。

為用戶存儲狀態的方法是將其放入數據庫中。 您可以使用會話cookie將單個用戶與其特定數據相關聯。

正如Daniel Rosemann指出的那樣,可能不是設計Web應用程序的方式。 但是,有一種使用全局變量和多個實例來實現該功能的方法。 我對python的了解還不足以估計全局變量的使用有多么錯誤(甚至危險),但它似乎對我有用-我對此解決方案的每條評論都很滿意:

設置兩個全局dict,一個用於存儲類實例,一個用於跟蹤實例是否仍然相關:

global session_instances, session_alive
session_instances = {}
session_alive = {}

在我的根視圖中,我創建一個uuid並將類實例與它一起保存在字典中,並啟動一個線程,該線程應在一段時間后關閉我的類:

@app.route('/')
def index():
    if not session.get('uid'):
        session['uid'] = uuid.uuid4()
        session_instances.update({session['uid'] : pyd2d.d2d()})
        session_alive.update({session['uid'] : 0})
        t = Thread(target=close_session, args = (session['uid'], ))
        t.start()
    return render_template('index.html')

負責關閉的線程(例如,最后一個請求之后的15秒):

def close_session(uid):
    global session_alive
    while True:
        time.sleep(15)
        if session_alive[uid] == 0:
            session_instances[uid].stop()
            break
        session_alive[uid] = 0

最后,在發送請求時更新計時器:

@app.before_request
def before_request():
    global session_alive
    if session.get('uid'):
        session_alive[session['uid']] = 1

這似乎工作正常。 我應該對使用全局變量感到不舒服,還是在這種情況下可以嗎? 感謝您的投入!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM