【问题标题】:Updating a HTML field using Flask使用 Flask 更新 HTML 字段
【发布时间】:2012-08-03 01:48:28
【问题描述】:

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

应用程序应该有一个文本字段和一个按钮。每当按下按钮时,字符串 '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 作为初始显示。那说明我看不懂程序中事件的调用顺序。

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

Avner

【问题讨论】:

    标签: python cookies flask


    【解决方案1】:

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

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

    【讨论】:

      【解决方案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)) 
      

      【讨论】:

        【解决方案3】:

        按如下方式修复您的节目条目:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-08-30
          • 1970-01-01
          • 2018-11-24
          • 1970-01-01
          • 2017-05-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多