2015-12-05 39 views
1

我試圖創建一個學校項目的電影數據庫,並在提交表單後得到'400'。 這種形式的使用是將電影添加到您的數據庫中,描述,標題,年份和圖片(網址到數據庫)截至目前。燒瓶和平臺:400壞請求 - 提交上傳表格

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

回答

0

所以我experimentent一段時間了,發現一個可行的解決方案。 我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 

我改變了他們相應地,允許文件結尾,並還增加了一個驗證的重複。

有了這段代碼,一切似乎工作得很好。