2016-03-18 69 views
0

我對此很陌生。我不明白爲什麼應用似乎無法保留隨機生成的數據。 get_question()返回一個帶有2個鍵值對的字典。問題/答案是從這個函數中隨機生成的。每次調用flash()時,它都會重新運行index()中的所有代碼?當閃現的消息出現時,用戶的答案與輸入的內容相關,但問題和正確答案似乎隨機出現 - 表明每次點擊提交時都會調用整個index()。我如何防止這種情況發生?我應該使用'會話'嗎?Python - 燒瓶 - 理解routing/flash的行爲()

更新:更具體一點 - 我不明白爲什麼閃爍的消息與瀏覽器中呈現的內容完全無關。看起來好像flash()正在對我的get_question()函數運行自己的調用,並因此得到不同的問題/答案,以顯示那些?

Here are some images that show the problem

@app.route('/', methods=['GET', 'POST']) 
@app.route('/index', methods=['GET', 'POST']) 

def index(): 
    user = {'nickname': 'test'} # fake user 
    question = question_gen.get_question() 
    answer = AnswerQuestionForm() 
    q = question['question'] 
    correct = question['answer'] 
    response = "" 

    if answer.validate_on_submit(): 
     you_said = request.form['answer'] 


     print("You said {}, to the question {}. correct was {}".format(you_said, q, correct)) 

     flash("The question was: %s" % q) 
     flash("The correct answer was: %s" % correct) 
     flash("You said: %s" % you_said) 
     return redirect(url_for('index')) 


    return render_template('index.html', 
          title='Home', 
          user=user, 
          question=question, 
          answer=answer, 
          response=response) 

回答

1

思考的flash就像是檔案櫃。當您運行flash('message')命令時,它會將該消息存儲在機櫃中。如果您的模板沒有主動在消息櫃中查看消息並將其取出,那麼它們會繼續積聚。有時候,如果你沒有立即在下一頁抓取它們,這會讓你感到困惑,因爲當你最終檢查它們時,那​​時產生的反饋現在顯示出來,當它不再有用時(現在可能會混淆)。

因此,如果我們假設一個簡單的應用程序,如:

from flask import Flask, flash, render_template 
from datetime import datetime 

app = Flask(__name__) 
app.secret_key = 'SO' 

@app.route('/') 
def store(): 
    flash('Stored at {}'.format(datetime.now())) 
    return 'Reload to store another message!' 


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

if __name__ == '__main__': 
    app.run(debug=True) 

隨着contents.html存在的內容:

<!doctype html> 
<title>Messages</title> 
{% with messages = get_flashed_messages() %} 
    {% if messages %} 
    <ul class=flashes> 
    {% for message in messages %} 
     <li>{{ message }}</li> 
    {% endfor %} 
    </ul> 
    {% endif %} 
{% endwith %} 

如果我去/十次,然後加載/contents/它會呈現我的contents.html模板,並顯示任何等待消息,基本上模板代碼將「打開文件櫃,並提出並顯示每個存儲的消息,然後將其扔掉」。通常,上面的模板代碼包含在頁面模板中,所以閃現的反饋是即時的並且不會累積。

更新

如果你看一下你的程序流程,在用戶第一次訪問該頁面沒有表單提交,會發生以下情況:

  1. 獲取隨機的問題
  2. 渲染index.html使用隨機問題的模板

當用戶填入第Ë答案並提交表單,會發生以下情況:

  1. 得到一個新的隨機問題
  2. 從形式
  3. 打印表單中的answer領域,新的隨機生成question和拉answer場新隨機生成answer
  4. 閃存相同的信息
  5. 將用戶重定向到index視圖

在這一點上,什麼也沒有被顯示給用戶的(不正確)閃現的消息已經在內閣,但我們沒有完成,因爲重定向:

  • 獲取使用隨機質詢
  • 另一隨機質詢
  • 渲染index模板10

    你缺少的是查找現有問題的能力,當表單提交時,你需要一些邏輯來說「讓我的問題匹配這個提交的表單條目,所以我可以檢查答案是正確的」。

    通常是與一個id關鍵question = {id: 1, question: "1+1", answer: "2"}做然後,你可以存儲id在表單的隱藏字段,並調整get_question有選擇地採取id參數,所以它可以翻檢的問題列表,找到正確的一個。

  • +0

    謝謝這是有幫助的 - 我添加了一些圖像來顯示我的具體問題。我怎樣才能讓flash()識別出瀏覽器中出現的問題,而不是它看起來如何並得到自己的問題? –

    +0

    再次感謝您的幫助 - 我無法識別問題/答案,因爲它們基於隨機數生成,而不是從列表中隨機選擇。任何想法我應該怎麼做呢? –

    +0

    您可能有一個問題的原始列表,所以有一個訂單。如果我把這份名單給了你,然後我扔了一對骰子,我可以說「我隨機選擇了問題...... 4」。然後你可以低頭看第四個問題,找到我想說的那個。 – Doobeh