2012-06-07 3 views
2

플라스크에 '정적'폴더에 파일을 요청하고 저장하는 업로드 사이트를 만들려고합니다. 내가 in.The 유일한 이유는 내 드래그 앤 드롭 자바 스크립트 업 로더를 테스트하는 데 필요한 "POST"요청을 보내려고 할 때 나는 항상 나쁜 요청을받습니다. 누군가 올바른 방향으로 나를 가리킬 수 있습니까?플라스크에 드래그 앤 드롭 업 로더 만들기

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

디버거를 켠다.하지만 여전히 아무것도 설정하지 않았다. 내가 얻을 수있는 것은 Bad Request입니다. 브라우저 (또는 프록시)가이 서버가 이해할 수없는 요청을 보냈습니다. – ArniReynir

+0

디버거가 전혀 작동하지 않습니까 (예 : 다른 오류)? 그렇지 않고 명령 줄에서 실행중인 경우 app.debug 및 app.propagate_exceptions이 True인지 확인해야합니다. –

답변

5

이 플라스크에 가지고 일반적인 문제는 초기에 - 당신은 request.args, request.form, request.valuesrequest.files에 액세스 할 때 키가 그들에 존재하지 않는 경우 그들이 KeyError 발생합니다 - 그냥 평범한 사전으로 파이썬에서 할 것입니다 (모든 파이썬 인터프리터에서 {}["test"]을 시도하십시오). 플라스크는 request 사전에 약간의 설탕을 추가합니다. KeyError은 사실은 HTTPException의 하위 클래스로, 잡히지 않으면 400 개의 잘못된 요청을 제기합니다. (this part of the quickstart documentation 참조)

이 문제를 일으키는 줄은 request.files['xhr2upload']입니다. 페이지에 JavaScript가 없으며 페이지에있는 <input type="file">만이 "xhr2upload"가 아니라 "file"의 이름을 갖습니다. request.files['xhr2upload']request.files['file']으로 변경하거나 아약스 업 로더를 페이지에로드하고 xhr2upload 이름을 사용하여 파일을 게시하십시오.

당신은이 필드가 있고 필드가 KeyError을 발생시키지 않고 정의 경우 을 확인 할 수 있습니다 다음은 .get 방법을 사용할 수있는 양식이있는 경우 :

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

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

그것은 나를 도왔습니다! 감사! – Brent81