烧瓶& Wtforms:400 Bad Request - 提交上传表格

时间:2015-12-05 17:33:48

标签: python file-upload flask flask-sqlalchemy flask-wtforms

我正在尝试为学校项目创建一个电影数据库,而我正在获得一个400英镑的电影数据库。提交表格后。 使用此表单是为了向您的数据库添加电影,其中包含截至目前的描述,标题,年份和图片(Url到DB)。

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']

1 个答案:

答案 0 :(得分:0)

所以我实验了一段时间,找到了一个有效的解决方案。 我在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

我通过允许的文件结尾相应地更改了它们,并且还添加了重复验证。

使用此代码,一切似乎都运行正常。

相关问题