2016-06-28 2 views
1

ich ein flask_wtf Formular mit diesem Gebiet:Flask Datei nicht auf Upload-Erkennung

logo_image = FileField('logo_image', validators=[FileRequired(), FileAllowed(['jpg', 'png'], 'Images only!')])

Meine Form wie folgt aussieht:

<form action="" method="POST" name="app_branding" enctype="multipart/form-data"> 
    {{ form.csrf_token }} 
    {{ form.brand.label }} {{ form.brand }} 
    {{ form.logo_image.label }} {{ form.logo_image }} 
    {{ form.title_text.label }} {{ form.title_text }} 
    {{ form.first_paragraph.label }} {{ form.first_paragraph }} 
    {{ form.faq.label }} {{ form.faq }} 
    {{ form.privacy_policy.label }} {{ form.privacy_policy }} 
    {{ form.success_message.label }} {{ form.success_message }} 
    {{ form.submit.label }} {{ form.submit }} 
</form> 

Zum Debuggen, meiner Meinung nach, habe ich:

@expose('/', methods=['GET', 'POST']) 
def index(self): 
    form = BrandForm(request.form) 
    print(form.validate()) 
    print(form.errors) 
    print("request.files") 
    print(request.files) 

Und in der Konsole bekomme ich die Nachricht, dass logo_image erforderlich ist, obwohl es ich s dort in request.files:

False 
{'logo_image': ['This field is required.']} 
request.files 
ImmutableMultiDict([('logo_image', <FileStorage: u'20140725_095232.jpg' ('image/jpeg')>)]) 

Wie bekomme ich die FileRequired() Methode, um die Datei zu erkennen?

Antwort

1

request.form enthält nur Formulareingabedaten. request.files enthält Datei-Upload-Daten. Sie müssen die Kombination von beiden an das Formular übergeben. Da Ihr Formular von Flask-WTF Form (jetzt FlaskForm genannt) erbt, wird es automatisch behandelt, wenn Sie nichts an das Formular übergeben.

form = BrandForm() 

if form.validate_on_submit(): 
    ... 

Ohne flaschen WTF, verwenden eine CombinedMultiDict um die Daten zu kombinieren und das in die Form übergeben.

from werkzeug.datastructures import CombinedMultiDict 

form = BrandForm(CombinedMultiDict((request.files, request.form))) 

if request.method == 'POST' and form.validate(): 
    ...