2013-08-26 72 views
3

有一段時間我正在學習如何在Flask中使用Ajax。在燒瓶的官方網站上有一個例子:ajax的python-flask示例

from flask import Flask, jsonify, render_template, request 
app = Flask(__name__) 

@app.route('/_add_numbers') 
def add_numbers(): 
    a = request.args.get('a', 0, type=int) 
    b = request.args.get('b', 0, type=int) 
    return jsonify(result=a + b) 

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

它適用於我。但我找下面的程序:

  1. 一個jQuery代碼發送初始數量爲Python應用程序
  2. 的Python應用程序商店的數量和響應「獲得:[數目]」
  3. while true:的Python應用程序等待請求「增加」爲它加1號並將其返回

jQuery的部分不要緊,我能做到這一點,但我不知道如何實現蟒蛇部分:

@app.route('/_inc_number') 
def inc_number(): 
    n = request.args.get('n', 0, type=int) 
    while true: 
     req = request.args.get('req', 0, type=string) 
     if req == 'increase': 
      n = n + 1 
      return n #It exits the function. how respond without quit? 

請解釋一下我可以如何恢復數據?我對Ajax和Flask都是新手,我懷疑它不是「真正的」ajax ......是嗎?你將如何在燒瓶中實現一個具有相同功能的簡單函數?

回答

1

HTTP請求沒有內存,它們彼此獨立。這意味着當您的Python應用程序獲取請求時,它會執行某些操作,並立即發送響應並退出。這就是HTTP的本質。

如果你想要的東西,持久的(像你的電話號碼),通過更多的請求活着,你需要:

  • 服務器的持久存儲。它可以是一個文件,一個數據庫,或者Flask只是內存中的一個對象(變量)。
  • 識別不同請求之間的用戶。這就是會話處理和cookie的用途。

    • 持久存儲:在index()創建main()
    • 全局字典(稱爲num):

      非常原始的方法(不應對生產系統中使用的)創建一個隨機會話標識符(si

    • set num[si] = 0
    • 從餅乾(由瀏覽器發回)發送si作爲cookie
  • inc_number()使用si增加相應num[si]
+0

szepnapot,但有各種聊天應用程序使用Ajax;這個HTTP請求與此不同嗎?如何在python中實現>真正的 gen

+1

Ajax使用HTTP。 「通常情況下」您的瀏覽器通過輸入url並點擊Enter或點擊鏈接來發送HTTP請求。 Ajax也是如此,但在後臺。這兩種情況之間沒有區別:都發送HTTP請求。我所描述的「原始方法」可以使用或不使用Ajax,這是您的選擇。 某些聊天應用程序使用[長輪詢](http://en.wikipedia.org/wiki/Push_technology#Long_polling),這會使連接長時間處於打開狀態。但是你不能無限期地打開它,所以最終你需要堅持和會話處理。 – Cucu

+0

謝謝我看到它知道 – gen

4

我認爲你缺少的是,每次客戶端請求數量增加有一個獨立的要求。

@app.route('/_inc_number') 
def inc_number(): 
    n = request.args.get('n', 0, type=int) 
    n = n + 1 
    return n 

然後從你必須要增加數量,每次調用一個獨立的Ajax請求jQuery的一面:你inc_number處理程序將如下編碼。

請注意,使用這種類型的解決方案,jQuery應用程序會跟蹤計數器的當前值,並且每次請求都必須將其發送給Flask。另一種可能是讓Flask側記住用戶會話中的號碼。該類型的解決您的水壺的應用程序將有兩個視圖功能:

from flask import session 
# you need to set a SECRET_KEY in configuration, used to sign the user session 

@app.route('/set_number') 
def set_number(): 
    # store n in the user session 
    session['n'] = request.args.get('n', 0, type=int) 

@app.route('/inc_number') 
def inc_number(): 
    session['n'] = session['n'] + 1 
    return session['n'] 

有了這個解決方案現在jQuery的可以設置的數量,而不必每次都當它調用inc_number發送。

我希望這會有所幫助。

+0

是的,這有助於很多,謝謝,但我仍然有一些問題: 該程序將運行多久?它還可以爲其他客戶服務嗎?我需要做什麼與SECRET_KEY? – gen

+0

這是一個Web服務器,它會一直運行,直到您停止它。 Web服務器監聽來自任何客戶端的連接,而不是特定的連接。請求是短暫的,一旦服務器處理一個它忘記它的請求並準備好從相同或不同的客戶端接收另一個請求。您可以有一個或一百個客戶端,都要求服務器增加數量,服務器將獨立處理每個客戶端的數量。當然,每個客戶都有自己的櫃檯。 – Miguel

+0

SECRET_KEY只是配置,Flask使用它將密碼簽名添加到用戶會話中,以便內容不會被篡改。這是因爲通常用戶會話包含身份驗證信息,您不希望攻擊者能夠僞造這些信息。所有你需要做的就是在配置中定義你的SECRET_KEY,然後由Flask完成。每個應用程序應該有不同的密鑰,並且您選擇的密鑰不應該公開。 – Miguel