3

感谢您在过去几天的帮助。我还没有。所以我决定根据手册第五章中的示例创建一个最小的应用程序。

应用程序应该有一个文本字段和一个按钮。每当按下按钮时,字符串 '1' 应该与字段中的值连接起来,并且 Flash 应该宣传这一点。

现有的代码只是在字段中显示“无”。

该表单是 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()

当未创建 cookie 时,我本来希望将 42 作为初始显示。那说明我看不懂程序中事件的调用顺序。

谢谢,很抱歉这么长的帖子。

阿夫纳

4

3 回答 3

2

您正在将session(默认情况下使用签名的 cookie 来存储会话数据)与您自己的自定义 cookie 混合。更具体地说,在您的show_entries代码中,您获取 cookie AO_sInteger,然后传入从中提取的值session['AO_sInteger'](您尚未在任何地方设置)。你会想要始终如一地使用其中一个。

例如,将最后一行更改show_entries为使用AO_sInteger而不是session.get('AO_sInteger)` 将解决问题。

于 2012-08-03T02:15:54.393 回答
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)) 
于 2012-08-03T05:45:56.697 回答
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)  
于 2012-08-03T02:26:31.793 回答