簡體   English   中英

關於在flask(flask,Python3)中保存表單數據的問題

[英]Question about saving form data in flask (flask, Python3)

所以,我正在嘗試制作一個預算應用程序,主要用於我自己的 python/flask 練習。 該應用程序適用於用戶在表單中輸入一個值,例如“收入”,然后將其轉移到下一頁。

表單數據在移動到下一個 url 時完美保存,但如果我嘗試在稍后的 URL 中調用它,我會收到 BadRequestKeyError,並且頁面似乎無法再找到我的表單數據。

這是代碼:

from flask import Flask, render_template, request, session
from datetime import date
app = Flask(__name__)
app.secret_key = "Nash"

@app.route('/', methods=['GET'])
def entry():
    return render_template('entry.html',
                           the_title='Smith Family Budgeting')

@app.route('/income', methods=['GET'])
def income():
    session['income'] = ''
    return render_template('income.html')

@app.route('/housing', methods=['POST'])
def housing():
    if request.method == 'POST':
        session['housing'] = ''
        session['income'] = request.form["income"]
        return render_template('housing.html', the_income=session['income'])

@app.route('/transportation', methods=['POST'])
def transport():
    if request.method == 'POST':
        income = session["income"]
        session['housing'] = request.form["housing"]
        session['leftover'] = float(income) - float(session['housing'])
        return render_template('trans.html', leftover=session['leftover'])

@app.route('/food', methods=['POST'])
def food():
    if request.method == 'POST':
        session['gas'] = request.form['gas']
        session['leftover'] = int(session['leftover'] - int(session['gas']))
        return render_template('food.html', leftover=session['leftover'])

@app.route('/utilities', methods=['POST'])
def utilities():
    if request.method == 'POST':
        session['food'] = request.form['food']
        session['leftover'] = float(session['leftover']) - float(session['food'])
        return render_template('utilities.html',
                               leftover=session['leftover'])

@app.route('/insurance', methods=['POST'])
def insurance():
    if request.method == 'POST':
        session['bills'] = float(request.form['gas_bill']) + float(request.form['electric_bill']) + float(request.form['internet_bill']) + float(request.form['city_bill'])
        session['leftover'] = float(session['leftover']) - float(session['bills'])
        return render_template('insurance.html', leftover=session['leftover'])

@app.route('/entertainment', methods=['POST'])
def fun():
    if request.method == 'POST':
        session['leftover'] = float(session['leftover']) - float(request.form['insurance']) -float(request.form['life'])
        return render_template('entertainment.html', leftover=session['leftover'])

@app.route('/services', methods=['POST'])
def services():
    if request.method == 'POST':
        session['leftover'] = float(session['leftover']) - float(request.form['derek']) - float(request.form['taylor']) - float(request.form['outings']) - float(request.form['dates'])
        return render_template('services.html', leftover=session['leftover'])

@app.route('/health', methods=['POST'])
def health():
    if request.method == 'POST':
        session['services'] = float(request.form['hulu']) + float(request.form['spotify']) + float(request.form['amc']) + float(request.form['amazon'])
        session['leftover'] = session['leftover'] - session['services']
        return render_template('health.html',
                               leftover=session['leftover'])

@app.route('/savings', methods=['POST'])
def savings():
    if request.method == 'POST':
        session['health'] = float(request.form['health'])
        session['leftover'] = session['leftover'] - session['health']
        return render_template('savings.html',
                               leftover=session['leftover'])

@app.route('/results', methods=['POST'])
def results():
    if request.method == 'POST':
        housing = request.form['housing']
        session['savings_and_givings'] = float(request.form['savings']) - float(request.form['giving'])
        session['leftover'] = session['leftover'] - session['savings_and_givings']
        today = date.today()
        return render_template('results.html',
                               leftover=session['leftover'],
                               date=today,)


app.run(debug = True)

錯誤回溯:

Traceback (most recent call last):
File "/python3.7/site-packages/flask/app.py", line 2463, in __call__
return self.wsgi_app(environ, start_response)
File "/python3.7/site-packages/flask/app.py", line 2449, in wsgi_app
response = self.handle_exception(e)
File "/python3.7/site-packages/flask/app.py", line 1866, in handle_exception
reraise(exc_type, exc_value, tb)
File "/python3.7/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/python3.7/site-packages/flask/app.py", line 2446, in wsgi_app
response = self.full_dispatch_request()
File "/python3.7/site-packages/flask/app.py", line 1951, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/python3.7/site-packages/flask/app.py", line 1820, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/python3.7/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/python3.7/site-packages/flask/app.py", line 1949, in full_dispatch_request
rv = self.dispatch_request()
File "/python3.7/site-packages/flask/app.py", line 1935, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "budget/budget.py", line 84, in results
housing = request.form['housing']
File "/python3.7/site-packages/werkzeug/datastructures.py", line 443, in __getitem__
raise exceptions.BadRequestKeyError(key)
werkzeug.exceptions.BadRequestKeyError: 400 Bad Request: The browser(or proxy) sent a request that this server could not understand.
KeyError: 'housing'

關於為什么會發生這種情況的任何想法? 提前致謝

試圖從表單中不存在的表單中獲取值。 這里housing = request.form['housing']

當使用session['housing'] = request.form["housing"]將數據存儲在flask session 中時,數據將存儲在用戶的瀏覽器 Z55E7DD3016CE4AC57B9A0F56AF12F 中,並在用戶重新啟動瀏覽器時清除。

@app.route('/results', methods=['POST'])
def results():
    if request.method == 'POST':
        housing = session['housing']
        session['savings_and_givings'] = float(request.form['savings']) - float(request.form['giving'])
        session['leftover'] = session['leftover'] - session['savings_and_givings']
        today = date.today()
        return render_template('results.html',
                               leftover=session['leftover'],
                               date=today,)

如果值不存在,使用get提供默認值

session['income'] = request.form.get("income", 0)

使用session.clear()清除用戶 cookies 中的所有數據

@app.route('/', methods=['GET'])
def entry():
        session.clear()
        return render_template('entry.html',
                           the_title='Smith Family Budgeting')

Web 頁面是無狀態的,您只是無法保存它們的 state。 如果您稍后需要獲取操作結果,請考慮將數據保存到某個文件或使用任何 SQL 數據庫。 對於小型項目和培訓,我推薦 SQLITE3,它已經是 Python 標准庫的一部分,並與您的其他項目文件(.py、.htmls、.css 等)一起存儲為多個文件(模式 + db 本身)

更多關於 web 頁面是無狀態的意味着什么

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM