3

ファイルのアップロードを取得しようとしていますflask-uploadsが、いくつかの問題が発生しています。私のflaskビュー関数である html をお見せします。誰かが私が欠けているものを指摘してくれることを願っています。

基本的に何が起こるかというと、フォームを送信するとif request.method == 'POST' and form.validate():ビュー機能のチェックに失敗します。下にジャンプしてテンプレートを表示します。wtforms はフォームでエラーを発生させないので、if ステートメントがなぜ失敗するのか疑問に思っています。

私は何を見ていますか?

フラスコアップロードの設定:

# Flask-Uploads
photos = UploadSet('photos',  IMAGES)
configure_uploads(app, (photos))

意見:

def backend_uploadphoto():
    from Application import photos
    from Application.forms.backend import AddPhotoForm

    clients = Client.query.all()
    events = Event.query.order_by('date').all()

    form = AddPhotoForm(request.form, csrf_enabled=True)

    if request.method == 'POST' and form.validate():
        from uuid import uuid4

        uuid = uuid4()
        filename = '{0}.jpg'.format(uuid)

        photo = Photo(uid=uuid, client=request.form['client'], event=request.form['event'])

        photofile = photos.save(request.files.get('photo'), photo.filename)

        return redirect(url_for('backend'))

    return render_template('backend/addphoto.html', form=form, clients=clients, events=events)

形:

class AddPhotoForm(Form):
    photo = FileField('Photo')
    client = IntegerField('Client:')
    event = IntegerField('Event:')

HTML:

<form action="{{url_for('backend_uploadphoto')}}" method="post">
        <p>
            {{form.client.label}}
            <select name="client">
                {% for client in clients %}
                <option value="{{client.id}}">{{client.fullname}}</option>
                {% endfor %}
            </select>
            {{form.client.errors}}
        </p>

        <p>
            {{form.event.label}}
            <select name="event">
                {% for event in events %}
                <option value="{{event.id}}">{{event.name}}</option>
                {% endfor %}
            </select>
            {{form.event.errors}}
        </p>

        <p><label for="photo">Photo:</label>{{form.photo}} <input type="submit" value="Upload"> {{form.photo.errors}}</p>
    </form>
4

1 に答える 1

4

から継承してcsrf_enabled=Trueいないため、フォームにはCSRF保護がありませんSecureForm。CSRFを有効にする場合は、ドキュメントを読み、フォーム定義を更新してください。

これが意図しない場合は、削除することができcsrf_enabled=True、ロジックは期待どおりに機能します。

CSRF保護を有効にするには、いくつかの手順があります。

  1. から継承SecureForm
  2. generate_csrf_tokenフォームにメソッドとメソッドを作成validate_csrf_tokenします。これらのメソッドは一意のキーを生成し、検証されない場合はエラーを発生させます。
  3. {{ form.csrf_token }}テンプレートに追加します。
于 2012-10-03T04:16:12.227 に答える