2012-08-03 56 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