Flask & Wtforms: 400 Bad Request - 提交上传表单
Flask & Wtforms: 400 Bad Request - Submitting upload form
我正在尝试为学校项目创建电影数据库,但在提交表单后收到“400”。
此表格的用途是将电影添加到您的数据库中,其中包含描述、标题、年份和图片(Url 到数据库)截至目前。
routes.py:
@login_required
@app.route('/upMovie', methods=['GET'])
def movieup():
return render_template('upload.html', MovieUploadForm=MovieUploadForm())
@login_required
@app.route('/upMovie', methods=['POST'])
def movieup_validate():
upload_form = MovieUploadForm()
if upload_form.validate_on_submit():
if Movie.query.filter_by(title=upload_form.title.data).first() is not None:
return 'Movie already exists.<a href="/upMovie">Back</a>'
file = request.files['file']
if file and allowed_file(file.filename):
filename = secure_filename(upload_form.filename.file.filename)
file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
upload_form.filename.file.save(file_path)
movie = Movie(
title=upload_form.title.data,
info=upload_form.info.data,
year=upload_form.year.data,
filename=file_path,
rating=5
)
db.session.add(movie)
db.session.commit()
return redirect(url_for('uploaded_file', filename=filename))
return 'Registration of movie successful.<br/><a href="/">Home</a>'
else:
upload_form.flash_form_errors()
return render_template('errors.html')
forms.py:
class MovieUploadForm(StandardForm):
title = StringField('Title', validators=[InputRequired(), length(1, 80)])
info = TextAreaField('Info', validators=[length(1, 2000)])
year = DateField('YYYY/MM/DD', format='%Y/%m/%d')
filename = FileField('File URL')
def flash_form_errors(self):
for field, errors in self.errors.items():
for error in errors:
flash("<strong>Error in field: %s</strong> - %s" % (getattr(self, field).label.text, error))
funtions.py
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1] in app.config['ALLOWED_EXTENSIONS']
所以我试验了一段时间并找到了一个可行的解决方案。
我在 routes.py
中所做的更改
if upload_form.validate_on_submit():
if upload_form.filename.data.filename is not "":
filename = secure_filename(upload_form.filename.data.filename)
file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
# file_path = "imdb/static/pic/" + filename
upload_form.filename.data.save(file_path)
movie = Movie(
title=upload_form.title.data,
info=upload_form.info.data,
year=upload_form.year.data,
filename=file_path if upload_form.filename.data else None,
rating=5
)
db.session.add(movie)
db.session.commit()
return 'Registration of movie successful.<br/><a href="/">Home</a>'
当我们从 wtforms 中获取日期时,我们不需要 file = request.files['file']
因为我们获取的对象是空的。
在forms.py
class MovieUploadForm(StandardForm):
title = StringField('Title', validators=[InputRequired(), length(1, 80)])
info = TextAreaField('Info', validators=[length(1, 2000)])
year = DateField('YYYY/MM/DD', format='%Y/%m/%d')
filename = FileField('File URL', validators=[FileAllowed(['jpg', 'png', 'jpeg'], 'Images only!')])
def validate(self):
v = Form.validate(self)
if not v:
return False
if Movie.query.filter_by(title=self.title.data).first() is not None:
self.title.errors.append("Movie already exists!")
return False
else:
return True
我相应地更改了它们,允许文件结尾并添加了重复验证。
使用这段代码似乎一切正常。
我正在尝试为学校项目创建电影数据库,但在提交表单后收到“400”。 此表格的用途是将电影添加到您的数据库中,其中包含描述、标题、年份和图片(Url 到数据库)截至目前。
routes.py:
@login_required
@app.route('/upMovie', methods=['GET'])
def movieup():
return render_template('upload.html', MovieUploadForm=MovieUploadForm())
@login_required
@app.route('/upMovie', methods=['POST'])
def movieup_validate():
upload_form = MovieUploadForm()
if upload_form.validate_on_submit():
if Movie.query.filter_by(title=upload_form.title.data).first() is not None:
return 'Movie already exists.<a href="/upMovie">Back</a>'
file = request.files['file']
if file and allowed_file(file.filename):
filename = secure_filename(upload_form.filename.file.filename)
file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
upload_form.filename.file.save(file_path)
movie = Movie(
title=upload_form.title.data,
info=upload_form.info.data,
year=upload_form.year.data,
filename=file_path,
rating=5
)
db.session.add(movie)
db.session.commit()
return redirect(url_for('uploaded_file', filename=filename))
return 'Registration of movie successful.<br/><a href="/">Home</a>'
else:
upload_form.flash_form_errors()
return render_template('errors.html')
forms.py:
class MovieUploadForm(StandardForm):
title = StringField('Title', validators=[InputRequired(), length(1, 80)])
info = TextAreaField('Info', validators=[length(1, 2000)])
year = DateField('YYYY/MM/DD', format='%Y/%m/%d')
filename = FileField('File URL')
def flash_form_errors(self):
for field, errors in self.errors.items():
for error in errors:
flash("<strong>Error in field: %s</strong> - %s" % (getattr(self, field).label.text, error))
funtions.py
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1] in app.config['ALLOWED_EXTENSIONS']
所以我试验了一段时间并找到了一个可行的解决方案。 我在 routes.py
中所做的更改if upload_form.validate_on_submit():
if upload_form.filename.data.filename is not "":
filename = secure_filename(upload_form.filename.data.filename)
file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
# file_path = "imdb/static/pic/" + filename
upload_form.filename.data.save(file_path)
movie = Movie(
title=upload_form.title.data,
info=upload_form.info.data,
year=upload_form.year.data,
filename=file_path if upload_form.filename.data else None,
rating=5
)
db.session.add(movie)
db.session.commit()
return 'Registration of movie successful.<br/><a href="/">Home</a>'
当我们从 wtforms 中获取日期时,我们不需要 file = request.files['file']
因为我们获取的对象是空的。
在forms.py
class MovieUploadForm(StandardForm):
title = StringField('Title', validators=[InputRequired(), length(1, 80)])
info = TextAreaField('Info', validators=[length(1, 2000)])
year = DateField('YYYY/MM/DD', format='%Y/%m/%d')
filename = FileField('File URL', validators=[FileAllowed(['jpg', 'png', 'jpeg'], 'Images only!')])
def validate(self):
v = Form.validate(self)
if not v:
return False
if Movie.query.filter_by(title=self.title.data).first() is not None:
self.title.errors.append("Movie already exists!")
return False
else:
return True
我相应地更改了它们,允许文件结尾并添加了重复验证。
使用这段代码似乎一切正常。