Загрузка файла из google-app-engine в Python-флаконе работает в режиме предварительного просмотра, но не работает на рабочем месте FileNotFoundError: [Errno 2] Нет такого файла или каталога: - PullRequest
0 голосов
/ 31 января 2019

У меня есть простое приложение для загрузки файлов из флакона Python в облачном движке Google.

При работе в режиме предварительного просмотра разработки через

dev_appserver.py ./app.yaml

Работает нормально.При запуске в качестве развернутого производственного приложения через

gcloud app deploy ./app.yaml --project PROJECTNAME

Он работает нормально, но при загрузке файла в эту форму я получаю следующую ошибку:

FileNotFoundError: [Errno 2] No such file or directory: '/home/USERNAME/python-docs-samples/appengine/standard_python37/hello_world/images/3d9c4a10a31c46e8a4166eddf659f4d7.jpg'
at save (/env/lib/python3.7/site-packages/werkzeug/datastructures.py:2725)
at upload_file (/srv/main.py:34)

Каталог существует, имеет оченьоткрыть разрешения, и загрузка работает в режиме предварительного просмотра, но просто не в производстве.

from flask import Flask, render_template, request
    from werkzeug import secure_filename
    import uuid
    import logging
    unique_filename = str(uuid.uuid4().hex)
    import os
    app = Flask(__name__)
    UPLOAD_FOLDER = '/home/USERNAME/python-docs-samples/appengine/standard_python37/hello_world/images'
    app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

    @app.route('/upload', methods = ['GET', 'POST'])
    def upload_file():
       if request.method == 'POST':
          f = request.files['file']
          fullfilename = (unique_filename + os.path.splitext(f.filename)[1])
          f.save(os.path.join(app.config['UPLOAD_FOLDER'], secure_filename(fullfilename)))
    #      f.save(secure_filename(f.filename))
          return 'file uploaded successfully'

1 Ответ

0 голосов
/ 01 февраля 2019

В стандартной среде GAE 2-го поколения (python 3.7) запись в файловую систему разрешена, но только в каталог /tmp, а записанные файлы могут не отображаться в запросах.С Доступ к файловой системе :

Файлы могут быть временно записаны в /tmp.Обратите внимание, что файлы, записанные в /tmp, могут быть недоступны при последующих запросах к вашему приложению.

Так что ваша попытка указать UPLOAD_FOLDER в /home не будет работать вообще .

Если переместить его под /tmp, он может иногда работать, но не всегда : более поздний запрос, пытающийся получить доступ к успешно загруженному и сохраненному файлу , может не найти его.

Как прокомментировал @Alex - хранение загруженного файла в Cloud Storage - лучший / официальный подход.

...