2012-08-03 32 views
3

過去幾天感謝您的幫助。我還沒有。所以我決定根據手冊第五章中的示例創建一個最小化的應用程序。使用Flask更新HTML字段

應用程序應該有一個文本字段和一個按鈕。無論何時按下按鈕,字符串「1」應與字段中的值連接,並且閃光燈應宣傳此內容。

這個代碼只是在該字段中顯示「None」。

的形式是show_entries模板的簡化版本:

{% extends "layout.html" %} 
{% block body %} 
    {% if session.logged_in %} 
    <form action="{{ url_for('add_entry') }}" method="post" class="add-entry"> 
    <h2> Integer:</h2> 
    <input id="text" name="text" size="10" value="{{ AO_sInteger }}" /> 
    <input type="submit" value="Add 1" /> 
    </form> 
    {% endif %} 
{% endblock %} 

「最小」的應用程序是:

import sqlite3 
from werkzeug.wrappers import Request, Response 
from jinja2 import Template 
from flask import Flask, request, session, g, redirect, url_for, abort, render_template, flash, make_response 

app = Flask(__name__) 
app.config.from_object(__name__) 
app.config.from_envvar('FLASKR_SETTINGS', silent=True) 
app.secret_key = '\xa5M\x05\xda=Y<\xfdV\x1f#\xa6\\\xbd%\xd8\xa1mBd\xca\xc9\xb1\xfe' 
app.debug = True 

@app.route('/add', methods=['POST']) 
def add_entry(): 
    if not session.get('logged_in'): 
     abort(401) 
    AO_sInteger = request.form['text'] 
    AO_sInteger = AO_sInteger+'1' 
    render_template('show_entries.html', AO_sInteger = AO_sInteger) 
    resp = make_response(render_template('show_entries.html', AO_sInteger = AO_sInteger)) 
    resp.set_cookie('AO_sInteger', AO_sInteger) 
    flash('the new seed is: %s.' %(session.get('AO_sInteger'))) 
    return redirect(url_for('show_entries')) 

@app.route('/login', methods=['GET', 'POST']) 
def login(): 
    if request.method == 'POST': 
     session['logged_in'] = True 
     flash('You were logged in') 
     return redirect(url_for('show_entries')) 

@app.route('/logout') 
def logout(): 
    session.pop('logged_in', None) 
    flash('You were logged out') 
    return redirect(url_for('show_entries')) 

@app.route('/', methods=['GET', 'POST']) 
def show_entries(): 
    try: 
     AO_sInteger = request.cookies.get('AO_sInteger') 
    except KeyError: 
     AO_sInteger = '42' 
    return render_template('show_entries.html', AO_sInteger = session.get('AO_sInteger')) 

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

我會期望具有42作爲初始顯示時該cookie沒有被創建。這表明我不明白程序中事件的調用順序。

謝謝,並且很抱歉這麼長的帖子。

阿夫納

回答

2

你是混合了session(它默認使用簽署餅乾在會話數據存儲)與自己的自定義Cookie。更具體地說,在你的show_entries代碼中,你得到了cookie AO_sInteger,但是傳入從session['AO_sInteger'](你沒有設置任何地方)拉取的值。你會想要一致地使用其中一個。

例如,將show_entries的最後一行更改爲使用AO_sInteger而不是session.get('AO_sInteger)將解決該問題。

+0

謝謝肖恩,我的確是混合兩個概念。 – 2012-08-04 04:23:05

1

修復你的節目條目,如下所示:

@app.route('/', methods=['GET', 'POST']) 
def show_entries(): 
try: 
    AO_sInteger = request.cookies.get('AO_sInteger') 
except KeyError: 
    AO_sInteger = '42' 
return render_template('show_entries.html', AO_sInteger = AO_sInteger) 
+0

是的codegeek它修復了顯示條目! – 2012-08-04 04:23:52

2

我不知道你爲什麼要在這裏使用cookie,但似乎你對會話和cookie混淆(這是區別的東西)。如果您想設置默認值AO_sInteger您應該使用這裏

會議,你的代碼可以改寫爲這樣的:

@app.route('/add', methods=['POST']) 
def add_entry(): 
    if not session.get('logged_in'): 
     abort(401) 
    session['AO_sInteger'] = request.form.get('text', 41) + 1 

    flash('the new seed is: %s.' %(session.get('AO_sInteger'))) 
    return redirect(url_for('show_entries')) 


@app.route('/', methods=['GET', 'POST']) 
def show_entries(): 
    return render_template('show_entries.html', AO_sInteger = session.get('AO_sInteger', 42)) 
+0

謝謝hdand,我現在明白如何使用會話。這是我的第一個Web項目,這是學習曲線。 – 2012-08-04 04:26:26