Enctype = Multipart / Form-Data и не может получить доступ к конфигурации вне запроса - PullRequest
0 голосов
/ 02 июля 2018

Я пытаюсь загрузить файлы в Amazon S3, для чего мне нужно было включить enctype="multipart/formdata". Как только я отправляю форму, браузер лает на меня с RuntimeError: cannot access configuration outside request из-за включения enctype. Я упомянул: RuntimeError: не могу получить доступ к конфигурации вне запроса , но я все еще получаю тот же RuntimeError, как только я настроил Flask_uploads. Я не совсем понимаю часть app.config, а также то, что включать в параметры UploadSet в примере. Любое понимание того, что я делаю неправильно, чтобы вызвать эту ошибку, было бы здорово. Спасибо

forms.py

app = Flask(__name__)
# app.config['UPLOADS_DEFAULT_URL'] = 'https://nevcodocs.s3.amazonaws.com/'
app.config['UPLOADED_DOCUMENTS_DEST'] = '/var/uploads'
documents = UploadSet('documents', IMAGES)
configure_uploads(app, documents)

отслеживающий

Traceback (most recent call last):
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\flask\app.py", line 1997, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\flask\app.py", line 1985, in wsgi_app
    response = self.handle_exception(e)
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\flask\app.py", line 1540, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\flask\_compat.py", line 33, in reraise
    raise value
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\flask\app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\flask\app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\flask\app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\flask\_compat.py", line 33, in reraise
    raise value
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\flask\app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\flask\app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "C:\Users\snguyen\Documents\Nevco_Support\nevco-support\nevco_support\main\views.py", line 150, in register
    if not form.validate_on_submit():
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\flask_wtf\form.py", line 101, in validate_on_submit
    return self.is_submitted() and self.validate()
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\wtforms\form.py", line 310, in validate
    return super(Form, self).validate(extra)
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\wtforms\form.py", line 152, in validate
    if not field.validate(self, extra):
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\wtforms\fields\core.py", line 204, in validate
    stop_validation = self._run_validation_chain(form, chain)
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\wtforms\fields\core.py", line 224, in _run_validation_chain
    validator(form, self)
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\flask_wtf\file.py", line 89, in __call__
    if not self.upload_set.file_allowed(field.data, filename):
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\flask_uploads.py", line 370, in file_allowed
    return self.extension_allowed(extension(basename))
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\flask_uploads.py", line 380, in extension_allowed
    return ((ext in self.config.allow) or
  File "C:\Users\snguyen\Documents\Nevco_Support\venv\lib\site-packages\flask_uploads.py", line 329, in config
    raise RuntimeError("cannot access configuration outside request")
RuntimeError: cannot access configuration outside request

Я также попытался поместить конфигурацию в views.py вместо forms.py, поскольку там я использую request.files, но происходит то же самое RunTimeError: cannot access configuration outside request. Возможно, существует конфликт между планом / app = Flask(__name__), о котором я не знаю?

views.py

blueprint = Blueprint("main", __name__, url_prefix="/")
app = Flask(__name__)
# app.config['UPLOADS_DEFAULT_URL'] = 'https://nevcodocs.s3.amazonaws.com/'
app.config['UPLOADED_DOCUMENTS_DEST'] = '../static/images'
documents = UploadSet('documents', IMAGES)
configure_uploads(app, documents)

@blueprint.route("register/", methods=['GET', 'POST'])
def register():
    """Renders register page."""
    form = RegisterForm()
    if request.method == 'POST':
        if not form.validate_on_submit():
        return render_template('main/register.html', page_title="Service Registration",
                               form=form, form_success=False, message="if not validate_on_submit")
        s3 = boto3.resource('s3')
        s3.Bucket('nevcodocs/Uploads').put_object(Key='frontview.png', Body=request.files['upload'])

Обновление: у меня есть файл settings.py, который содержит Config, ProdConfig, StagingConfig и т. Д. Я считаю, что ошибка, которую я получаю, связана с не указанием на указанный файл. Поэтому я изменил app.config['UPLOADED_DOCUMENTS_DEST'] на app.config.from_pyfile('../settings.py'). Это приводит к RuntimeError: no destination for set documents. Ссылаясь на документ для Upload Sets, 3-й параметр - default_dest, но я не уверен относительно того, что я установил это?

1 Ответ

0 голосов
/ 03 июля 2018

Ошибка произошла из-за валидаторов в FileFields в forms.py. Избавление от валидаторов устранило проблему, но я не уверен, почему эти FileFields не проверяются, когда пользователь выбирает файл.

...