Замените AppEngine Devserver на Spawning (BaseHTTPRequestHandler как WSGI)
-
18-09-2019 - |
Вопрос
Я хочу заменить сервер разработчика AppEngine на нерест.Spawning обрабатывает стандартные обработчики wsgi, как и appengine, поэтому запустить приложение на нем легко.
Но сервер разработчика учитывает ваш файл app.yaml, в котором есть перенаправление URL-адресов и т. д.Я просматривал код devserver, и получить BaseHTTPRequestHandler довольно легко:
from google.appengine.tools.dev_appserver import CreateRequestHandler
dev = CreateRequestHandler(os.path.dirname(__file__), '', require_indexes=False, static_caching=True)
Но BaseHTTPRequestHandler не является приложением WSGI, поэтому я предполагаю, что мне нужно что-то добавить, чтобы оно заработало.Есть какие-нибудь подсказки?
Решение
Я не думаю, что вы сможете так легко вытащить часть dev_appserver и использовать ее на собственном WSGI-сервере.dev_appserver творит много «магии», и на самом деле он не структурирован для того, чтобы его можно было извлечь и использовать в качестве оболочки WSGI на другом сервере (еще жаль).
Вы можете проверить TвистедАЭ, который работает над созданием альтернативной среды обслуживания;если вы действительно хотите использовать нерест, вы, вероятно, можете взять за основу работу TwistedAE.
Тем не менее, если вы хотите сделать это самостоятельно, есть несколько вариантов:
- Вы можете написать свою собственную оболочку для взаимодействия WSGI с классом, возвращаемым CreateRequestHandler.В этом случае вам необходимо реплицировать интерфейс в БазовыйHTTPсервер.BaseHTTPRequestHandler из Python SDK.Однако преобразование WSGI в него только для того, чтобы код dev_appserver мог преобразовать его обратно, кажется немного извращенным.
- Вы можете вырвать код из метода _HandleRequest DevAppServerRequestHandler, изменить его для работы с WSGI и создать на его основе приложение WSGI (вероятно, это лучший вариант, если вы хотите заняться своими руками).
- Вы можете начать с нуля, и я считаю, что именно такой подход использует TwistedAE.
Что бы вы ни делали, следует помнить одну вещь:App Engine явно ожидает однопоточную среду для своих приложений.Не используйте многопоточный подход, если вы хотите, чтобы приложения работали локально так же, как в рабочей среде или на сервере dev_appserver!