在我的Flask应用程序中,我重定向到另一个页面,参数如下:
return redirect(url_for("edit.editFunction", plants=thisPlant))
然后,在另一个文件中,我读到了这个论点,其中有一行:
# Get arguments from url_for in administration
thisPlant = request.args.getlist("plants")
print(thisPlant)
# Get ID on edit plant
plant_id = thisPlant[0]
print(plant_id)
到目前为止,这是在我的控制台中返回:
['1', 'aa', '11', '11', 'https://i.ibb.co/QNJnLR8/empty.png', 'aa', '1']
1
但当我想在同一个文件上使用post方法时,我会得到这样的结果:
plant_id = thisPlant[0]
IndexError: list index out of range
怎么可能呢?我应该阅读1
有人能发现我的错误吗?
这是我使用这个变量的完整文件:
import sqlite3
import traceback
import sys
import re
import os
from flask import Blueprint, render_template, redirect, session, request, flash, get_flashed_messages
from application import getUserName, getUserPicture, login_required, confirmed_required, getUserRole, role_required, uploadPicture
from werkzeug.utils import secure_filename
# Set Blueprints
edit = Blueprint('edit', __name__,)
@edit.route("/edit", methods=["GET", "POST"])
@login_required
@confirmed_required
@role_required
def editFunction():
# Force flash() to get the messages on the same page as the redirect.
get_flashed_messages()
# Get arguments from url_for in administration
thisPlant = request.args.getlist("plants")
print(thisPlant)
# Get ID on edit plant
plant_id = thisPlant[0]
print(plant_id)
if request.method == "POST":
# Get variables
name = request.form.get("name")
stock = request.form.get("stock")
price = request.form.get("price")
description = request.form.get("description")
# Ensure the plant name was submitted
if not name:
flash("must provide plant name")
return redirect("/edit")
# Ensure the plant name fits server-side
if not re.search("^[a-zA-Z0-9]{1,50}$", name):
flash("Invalid plant name")
return redirect("/edit")
# Ensure the plant stock was submitted
if not stock:
flash("must provide plant stock")
return redirect("/edit")
# Ensure the plant stock fits server-side
if not re.search("^[0-9]+$", stock):
flash("Invalid plant stock")
return redirect("/edit")
# Ensure the plant price was submitted
if not stock:
flash("must provide plant price")
return redirect("/edit")
# Ensure the plant price fits server-side
if not re.search("^[0-9]+$", stock):
flash("Invalid plant price")
return redirect("/edit")
# Ensure the plant description was submitted
if not description:
flash("must provide plant description")
return redirect("/edit")
# Ensure the plant description fits server-side
if not re.search("^(?!;).+", description):
flash("Invalid plant description")
return redirect("/edit")
# Check show bool status
show = "show" in request.form
# Update plant name, stock, price, description and show status into the table
try:
sqliteConnection = sqlite3.connect("database.db")
cursor = sqliteConnection.cursor()
cursor.execute("UPDATE plants SET name=:name, stock=:stock, price=:price, description=:description, show=:show WHERE id=:plant_id;", {"name": name, "stock": stock, "price": price, "description": description, "show": show, "plant_id": plant_id})
sqliteConnection.commit()
cursor.close()
except sqlite3.Error as error:
print("Failed to read data from sqlite table", error)
print("Exception class is: ", error.__class__)
print("Exception is", error.args)
print('Printing detailed SQLite exception traceback: ')
exc_type, exc_value, exc_tb = sys.exc_info()
print(traceback.format_exception(exc_type, exc_value, exc_tb))
finally:
if (sqliteConnection):
sqliteConnection.close()
# Save, upload and delete picture file
file = request.files["picture"]
if file and file.filename:
filename = secure_filename(file.filename)
file.save(os.path.join("./static", filename))
upload = uploadPicture("./static/" + filename)
os.remove("./static/" + filename)
# Update database with new image url
try:
sqliteConnection = sqlite3.connect("database.db")
cursor = sqliteConnection.cursor()
cursor.execute("UPDATE plants SET picture=:picture WHERE name=:name;", {"picture": upload, "name": name})
sqliteConnection.commit()
cursor.close()
except sqlite3.Error as error:
print("Failed to read data from sqlite table", error)
print("Exception class is: ", error.__class__)
print("Exception is", error.args)
print('Printing detailed SQLite exception traceback: ')
exc_type, exc_value, exc_tb = sys.exc_info()
print(traceback.format_exception(exc_type, exc_value, exc_tb))
finally:
if (sqliteConnection):
sqliteConnection.close()
flash("Plant edited")
return redirect("/administration")
else:
return render_template("edit.html", name=getUserName(), picture=getUserPicture(), role=getUserRole(), plants=thisPlant)
这是完整的控制台输出:
127.0.0.1 - - [05/Jan/2021 22:20:44] "GET /administration HTTP/1.1" 200 -
127.0.0.1 - - [05/Jan/2021 22:20:44] "GET /static/styles.css HTTP/1.1" 200 -
127.0.0.1 - - [05/Jan/2021 22:20:45] "POST /administration HTTP/1.1" 302 -
['1', 'aa', '11', '11', 'https://i.ibb.co/QNJnLR8/empty.png', 'aa', '1']
1
127.0.0.1 - - [05/Jan/2021 22:20:45] "GET /edit?plants=1&plants=aa&plants=11&plants=11&plants=https%3A%2F%2Fi.ibb.co%2FQNJnLR8%2Fempty.png&plants=aa&plants=1 HTTP/1.1" 200 -
127.0.0.1 - - [05/Jan/2021 22:20:45] "GET /static/styles.css HTTP/1.1" 200 -
[]
[2021-01-05 22:20:53,655] ERROR in app: Exception on /edit [POST]
Traceback (most recent call last):
File "/home/benoit/Documents/CrazyPlantCrew/venv/lib/python3.8/site-packages/flask/app.py", line 2447, in wsgi_app
response = self.full_dispatch_request()
File "/home/benoit/Documents/CrazyPlantCrew/venv/lib/python3.8/site-packages/flask/app.py", line 1952, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/benoit/Documents/CrazyPlantCrew/venv/lib/python3.8/site-packages/flask/app.py", line 1821, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/home/benoit/Documents/CrazyPlantCrew/venv/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/home/benoit/Documents/CrazyPlantCrew/venv/lib/python3.8/site-packages/flask/app.py", line 1950, in full_dispatch_request
rv = self.dispatch_request()
File "/home/benoit/Documents/CrazyPlantCrew/venv/lib/python3.8/site-packages/flask/app.py", line 1936, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/benoit/Documents/CrazyPlantCrew/application.py", line 94, in decorated_function
return f(*args, **kwargs)
File "/home/benoit/Documents/CrazyPlantCrew/application.py", line 109, in decorated_function
return f(*args, **kwargs)
File "/home/benoit/Documents/CrazyPlantCrew/application.py", line 124, in decorated_function
return f(*args, **kwargs)
File "/home/benoit/Documents/CrazyPlantCrew/routes/edit.py", line 28, in editFunction
plant_id = thisPlant[0]
IndexError: list index out of range
127.0.0.1 - - [05/Jan/2021 22:20:53] "POST /edit HTTP/1.1" 500 -
Error on request:
Traceback (most recent call last):
File "/home/benoit/Documents/CrazyPlantCrew/venv/lib/python3.8/site-packages/flask/app.py", line 2447, in wsgi_app
response = self.full_dispatch_request()
File "/home/benoit/Documents/CrazyPlantCrew/venv/lib/python3.8/site-packages/flask/app.py", line 1952, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/benoit/Documents/CrazyPlantCrew/venv/lib/python3.8/site-packages/flask/app.py", line 1821, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/home/benoit/Documents/CrazyPlantCrew/venv/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/home/benoit/Documents/CrazyPlantCrew/venv/lib/python3.8/site-packages/flask/app.py", line 1950, in full_dispatch_request
rv = self.dispatch_request()
File "/home/benoit/Documents/CrazyPlantCrew/venv/lib/python3.8/site-packages/flask/app.py", line 1936, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/benoit/Documents/CrazyPlantCrew/application.py", line 94, in decorated_function
return f(*args, **kwargs)
File "/home/benoit/Documents/CrazyPlantCrew/application.py", line 109, in decorated_function
return f(*args, **kwargs)
File "/home/benoit/Documents/CrazyPlantCrew/application.py", line 124, in decorated_function
return f(*args, **kwargs)
File "/home/benoit/Documents/CrazyPlantCrew/routes/edit.py", line 28, in editFunction
plant_id = thisPlant[0]
IndexError: list index out of range
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/benoit/Documents/CrazyPlantCrew/venv/lib/python3.8/site-packages/werkzeug/serving.py", line 304, in run_wsgi
execute(self.server.app)
File "/home/benoit/Documents/CrazyPlantCrew/venv/lib/python3.8/site-packages/werkzeug/serving.py", line 292, in execute
application_iter = app(environ, start_response)
File "/home/benoit/Documents/CrazyPlantCrew/venv/lib/python3.8/site-packages/flask/app.py", line 2464, in __call__
return self.wsgi_app(environ, start_response)
File "/home/benoit/Documents/CrazyPlantCrew/venv/lib/python3.8/site-packages/flask/app.py", line 2450, in wsgi_app
response = self.handle_exception(e)
File "/home/benoit/Documents/CrazyPlantCrew/venv/lib/python3.8/site-packages/flask/app.py", line 1881, in handle_exception
return self.finalize_request(server_error, from_error_handler=True)
File "/home/benoit/Documents/CrazyPlantCrew/venv/lib/python3.8/site-packages/flask/app.py", line 1968, in finalize_request
response = self.make_response(rv)
File "/home/benoit/Documents/CrazyPlantCrew/venv/lib/python3.8/site-packages/flask/app.py", line 2097, in make_response
raise TypeError(
TypeError: The view function did not return a valid response. The function either returned None or ended without a return statement.
如果我读对了。。。
request.args.getlist
只获取作为URL参数发布的数据,因此在POST请求期间尝试访问plants[0]
时会获取KeyError
。请注意,在服务器日志中,POST请求期间的print(thisPlant)
给出了一个空列表:[]
看起来您只需要重新构造该路由,所以有问题的行只在GET请求中执行。
类似于:
def editFunction():
# Force flash() to get the messages on the same page as the redirect.
get_flashed_messages()
if request.method = 'GET':
# Get arguments from url_for in administration
thisPlant = request.args.getlist("plants")
print(thisPlant)
# Get ID on edit plant
plant_id = thisPlant[0]
print(plant_id)
# Do return here, rather than in 'else' statement at bottom of file
return render_template("edit.html", name=getUserName(), picture=getUserPicture(), role=getUserRole(), plants=thisPlant)
elif request.method == "POST":
# code to handle POST Request
# ...
flash("Plant edited")
return redirect("/administration")