3

過去数日間、ご協力いただきありがとうございます。私はまだそこにいません。そこで、マニュアルの第5章のサンプルに基づいて、最小限のアプリケーションを作成することにしました。

アプリケーションには、1つのテキストフィールドと1つのボタンが必要です。ボタンが押されるたびに、文字列「1」がフィールドの値と連結され、フラッシュがこれをアドバタイズする必要があります。

現状のコードでは、フィールドに「なし」と表示されているだけです。

このフォームは、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があると思っていたでしょう。これは、プログラム内のイベントの呼び出し順序がわからないことを示しています。

ありがとう、そして長い投稿をお詫びします。

アヴナー

4

3 に答える 3

2

session(デフォルトでは署名付き Cookie を使用してセッション データを保存する) と独自のカスタム Cookie を混同しています。より具体的には、show_entriesコードで Cookie を取得しますが、AO_sInteger引き出された値を渡しsession['AO_sInteger']ます (どこにも設定していません)。どちらか一方を一貫して使用する必要があります。

たとえば、最後の行を)`ではなくshow_entriesuseに変更すると、問題が解決します。AO_sIntegersession.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

show エントリを次のように修正します。

@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 に答える