2012-08-03 4 views
3

Nous vous remercions de votre aide au cours des derniers jours. Je ne suis pas encore là. J'ai donc décidé de créer une application minimale basée sur l'exemple du chapitre cinq du manuel.Mise à jour d'un champ HTML en utilisant Flask

L'application doit avoir un champ de texte et un bouton. Chaque fois que le bouton est enfoncé, la chaîne '1' devrait être concaténée la valeur dans le champ et un flash devrait annoncer ceci.

Le code tel qu'il est affiché affiche simplement "Aucun" dans le champ.

La forme est une version simplifiée du modèle de 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 %} 

L'application "minimale" est:

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() 

Je me serais attendu d'avoir 42 comme l'affichage initial lorsque le cookie n'a pas été créé. Cela montre que je ne comprends pas l'ordre d'invocation des événements dans le programme.

Merci, et désolé pour le poste long.

Avner

Répondre

2

Vous confondez la session (qui utilise par défaut les cookies signé pour stocker les données de session dans) avec vos propres cookies personnalisés. Plus précisément, dans votre code show_entries, vous obtenez le cookie AO_sInteger, puis transmettez la valeur tirée de session['AO_sInteger'] (que vous n'avez définie nulle part). Vous voudrez utiliser l'un ou l'autre de manière cohérente. Par exemple, changer la dernière ligne de show_entries pour utiliser AO_sInteger plutôt que session.get('AO_sInteger) `réglerait le problème.

+0

Merci Sean, je mélange bien les deux concepts. –

1

Fix votre entrée show comme suit:

@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

Oui codegeek il a fixé l'entrée de spectacle! –

2

Je ne sais pas pourquoi vous voulez utiliser des cookies ici, mais il semble que votre session et tromper sur les cookies (Ce sont des choses de différence). Vous devez utiliser la session ici

Si vous souhaitez définir la valeur par défaut AO_sInteger, votre code peut réécrire quelque chose comme:

@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

Merci hdand, je comprends maintenant comment utiliser les sessions. C'est mon premier projet web et c'est la courbe d'apprentissage. –