RuntimeError: не может получить доступ к настройке внешнего запроса

Я получил следующую ошибку:

RuntimeError: cannot access configuration outside request

от выполнения следующего кода:

# -*- coding: utf-8 -*-

from flask import Flask, request, render_template, redirect, url_for
from flaskext.uploads import UploadSet, configure_uploads, patch_request_class

app = Flask(__name__)
csvfiles = UploadSet('csvfiles', 'csv', "/var/uploads")

@app.route("/")
def index():
    return "Hello World!"

@app.route('/upload', methods=['GET', 'POST'])
def upload():
    if request.method == 'POST' and 'csvfile' in request.files:
        filename = csvfiles.save(request.files['csvfile']) # the error occurs here!
        return redirect(url_for('index'))
    return render_template('upload.html')

if __name__ == "__main__":
    app.run(debug=True)

Я сам не понимаю сообщение об ошибке, и я не знаю, как решить проблему. Я прочитал официальную документацию, и, похоже, мне нужно сделать некоторую конфигурацию (где хранить закачки), но я не знаю, как это сделать правильно.

Я использую расширение Flask-Uploads.

Это выполняется в виртуальной среде python 2.7 со следующими установленными пакетами:

Flask==0.10.1
Flask-Uploads==0.1.3
Jinja2==2.7.2
MarkupSafe==0.23
Werkzeug==0.9.4
argparse==1.2.1
itsdangerous==0.24
wsgiref==0.1.2

Ответ 1

У вас нет настроено расширение флажков-загрузок. Используйте configure_uploads() функцию, чтобы прикрепить свои настройки загрузки к вашему приложению:

from flaskext.uploads import UploadSet, configure_uploads

app = Flask(__name__)
app.config['UPLOADED_CSVFILES_DEST'] = '/var/uploads'
csvfiles = UploadSet('csvfiles', ('csv',))
configure_uploads(app, (csvfiles,))

Второй аргумент UploadSet() принимает последовательность расширений. Не переходите в путь к файлу UploadSet; вы вместо этого использовали бы Flask configuration.

Установите UPLOADED_<name-of-your-set>_DEST, где имя находится в верхнем регистре. Вот что UPLOADED_CSVFILES_DEST. Вы также можете установить конфигурацию UPLOADS_DEFAULT_DEST; он будет использоваться в качестве базового каталога с отдельными подкаталогами для каждого имени набора.

В качестве альтернативы, этот третий параметр может быть вызванным:

configure_uploads(app, (csvfiles,), lambda app: '/var/uploads')