Развертывание Azure Flask - интерфейс WSGI

В настоящее время я работаю над книгой Flask Web Development, Разработка веб-приложений на Python, и в настоящее время у меня возникают некоторые проблемы, определяющие, где мне следует разместить интерфейс WSGI, чтобы я мог развернуть его в веб-службе Azure. Для справки, я в настоящее время нахожусь в Главе 7, и копию этого кода, с которым я сейчас работаю, можно найти по адресу https://github.com/miguelgrinberg/flasky/tree/7a

Чтобы попытаться решить проблему, я создал тестовую облачную службу Azure с Flask в Visual Studio, которая отлично работает в эмуляторе Azure. Следующий код является копией файла app.py.

"""
This script runs the application using a development server.
It contains the definition of routes and views for the application.
"""

from flask import Flask
app = Flask(__name__)

# Make the WSGI interface available at the top level so wfastcgi can get it.
wsgi_app = app.wsgi_app

@app.route('/')
def hello():
    """Renders a sample page."""
    return "Hello World!"

if __name__ == '__main__':
    import os
    HOST = os.environ.get('SERVER_HOST', 'localhost')
    try:
        PORT = int(os.environ.get('SERVER_PORT', '5555'))
    except ValueError:
        PORT = 5555
    app.run(HOST, PORT)

Ключевой строкой здесь является объявление атрибута wsgi_app, который выбирает wfastcgi. Тем не менее, когда я пытаюсь вставить это в следующий код ( manage.py для справки) и немного изменить его для запуска с настройками тестового проекта

#!/usr/bin/env python
import os
from app import create_app, db
from app.models import User, Role
from flask.ext.script import Manager, Shell
from flask.ext.migrate import Migrate, MigrateCommand

app = create_app(os.getenv('FLASK_CONFIG') or 'default')
manager = Manager(app)
migrate = Migrate(app, db)


def make_shell_context():
    return dict(app=app, db=db, User=User, Role=Role)
manager.add_command("shell", Shell(make_context=make_shell_context))
manager.add_command('db', MigrateCommand)


@manager.command
def test():
    """Run the unit tests."""
    import unittest
    tests = unittest.TestLoader().discover('tests')
    unittest.TextTestRunner(verbosity=2).run(tests)

# Make the WSGI interface available at the top level so wfastcgi can get it.
wsgi_app = app.wsgi_app

if __name__ == '__main__':
    HOST = os.environ.get('SERVER_HOST', 'localhost')
    try:
        PORT = int(os.environ.get('SERVER_PORT', '5555'))
    except ValueError:
        PORT = 5555
    app.run(HOST, PORT)

Я получаю следующую ошибку при попытке запустить его в эмуляторе Azure.

AttributeError: 'module' object has no attribute 'wsgi_app'

Я подозреваю, что я не помещаю переменную wsgi_app в правильное местоположение, но я не могу точно определить, где я должен поместить это.

Любая помощь будет очень признательна.

3 ответа

Решение

После небольшого беспокойства я смог найти решение своей проблемы, но, к сожалению, не смог точно определить, что пошло не так.

По сути, я прошел процесс перестройки своего тестового проекта с нуля в VS2015 (Python -> облачная служба Azure -> веб-роль Flask) и на этот раз каким-то образом смог получить рабочее решение с использованием тестового проекта 7a, запустив его в Azure. Эмулятор с последующей успешной публикацией в качестве веб-приложения Azure.

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

  • Файл needs.txt, скорее всего, не обновлен. Обратите внимание, что когда вы запускаете Azure Simulator, он проверяет файл require.txt и обновляет / устанавливает все библиотеки, которые в данный момент не установлены в вашей среде python, автоматически (без запроса).
  • Возможно, у меня не было файла ConfigureCloudService.ps1 или ps.cmd в папке bin в проекте роли рабочего Flask. (Также стоит прочитать файл Readme.mht, если у вас возникнут какие-либо проблемы)
  • Я также изменил базу файла manage.py на:

    if __name__ == '__main__':
        app.run()
    

Что, возможно, помогло также.

Я надеюсь, что это поможет любому, кто может столкнуться с подобной проблемой.

Рассматривали ли вы использование веб-приложения для запуска Flask? Вот подробное руководство по развертыванию Flask в веб-приложении: https://azure.microsoft.com/en-us/documentation/articles/web-sites-python-create-deploy-flask-app/

Он автоматически настроит ваш сайт и обработает web.config и быстрые сценарии cgi.

Я создал тестовую облачную службу Azure с Flask, попытался воспроизвести вашу проблему, к счастью, я нашел проблему.

Я скопировал относительные пакеты в мой тестовый проект, найденный, если входной файл в корневом каталоге был назван app.py, это произойдет с вами та же ошибка. Но я переименовал файл в manage.py Проект работал нормально.

Насколько я понимаю, возможно, входной файл app.py и пакет с именем app будут конфликтовать из-за сопоставления.

Другие вопросы по тегам