2012-06-07 70 views
2

我試圖讓上傳網站接受請求並將文件存儲在燒瓶中的「靜態」文件夾中。當我嘗試發送「POST」請求時,我總是收到不好的請求。我需要的唯一原因是測試我的拖放JavaScript上傳器。有人能指引我朝着正確的方向嗎?在燒瓶中拖放上傳器

import os 
from flask import Flask, request, redirect, url_for 
from werkzeug import secure_filename 

UPLOAD_FOLDER = 'static' 
ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif']) 

app = Flask(__name__) 
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER 


def allowed_file(filename): 
    return '.' in filename and \ 
      filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS 

@app.route('/', methods=['GET', 'POST']) 
def upload_file(): 
    if request.method == 'POST': 
     file = request.files['xhr2upload'] # [0] 
     if file and allowed_file(file.filename): 
      filename = secure_filename(file.filename) 
      file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) 
      return redirect(url_for('uploaded_file', 
            filename=filename)) 
    return ''' 
    <!doctype html> 
    <title>Upload new File</title> 
    <h1>Upload new File</h1> 
    <form action="" method=post enctype=multipart/form-data> 
     <p><input type=file name=file> 
     <input type=submit value=Upload> 
    </form> 
    ''' 

if __name__ == '__main__': 
    app.run() 
+0

您需要激活調試器並找出導致400錯誤的原因。如果它沒有使原因顯而易見,請在此處回溯。 –

+0

我設置了調試器,但仍然沒有。只有我得到的是錯誤的請求 瀏覽器(或代理)發送請求,此服務器無法理解。 – ArniReynir

+0

調試器是否可以工作(例如,有其他錯誤)?如果沒有,並且您從命令行運行,則需要檢查app.debug和app.propagate_exceptions是否爲True。 –

回答

5

這是有瓶一個共同的問題早 - 當您試圖訪問request.argsrequest.formrequest.valuesrequest.files他們會拋出一個KeyError如果該鍵不存在於他們 - 只是作爲一個普通字典會在Python中(在任何Python解釋器中嘗試{}["test"])。 request字典 - KeyError實際上是HTTPException的一個子類,如果它未被捕獲,則會引發400個錯誤請求。 (請參閱this part of the quickstart documentation

導致此問題的行是request.files['xhr2upload']。您不在頁面上包含任何JavaScript,並且您在頁面上的唯一<input type="file">具有「文件」的名稱,而不是「xhr2upload」。將request.files['xhr2upload']更改爲request.files['file']或將ajax上傳器加載到您的網頁中,並使用xhr2upload名稱發佈您的文件。

如果你有一個表單可以有一個領域,你要檢查,如果一個字段不提高一個KeyError定義那麼你可以使用.get方法:

request.form["not_here"] # KeyError -> 400 Bad Request 

request.form.get("might_be_here") # Value if provided, else None 
+0

它幫助我!謝謝! – Brent81