Кэш приложений Google App Engine
В google app engine я создал свой собственный пользовательский API, соответствующим образом называемый user, чтобы он не мешал пользователям API google app engine. Как и большинство многопользовательских сайтов, пользователю доступны две "версии" сайта в зависимости от того, вошли они или нет. Таким образом, создается файл router.py со следующим кодом
import webapp2
from lib import user
import guest
import authorized
if user.isLoggedIn():
app = webapp2.WSGIApplication(authorized.WSGIHandler,debug=True)
else:
app = webapp2.WSGIApplication(guest.WSGIHandler,debug=True)
guest
а также authorized
модули отформатированы как ваш обычный скрипт приложения, например:
import webapp2
import os
class MainPage(webapp2.RequestHandler):
def get(self,_random):
self.response.out.write('authorized: '+_random)
WSGIHandler = [('/(.*)', MainPage)]
Таким образом, файл маршрутизатора легко выбирает, какой директор URL WSGIApplication использовать, получая переменную WSGIHandler из гостевого или авторизованного модуля. Однако пользователь должен закрыть все вкладки, чтобы маршрутизатор обнаружил изменение в isLoggedIn()
функция. Если вы вошли в систему, она не распознает, что вы сделали это, пока каждая вкладка не будет закрыта. У меня есть две возможные причины для этого:
isLoggedIn()
использует os.environ['HTTP_COOKIE'] для извлечения файлов cookie и проверки входа пользователя в систему, а затем проверяет данные файлов cookie в базе данных, чтобы убедиться, что они являются действительными файлами cookie. Возможно, это может привести к ошибке, когда куки на стороне сервера не обновляются, когда страница находится? Может быть, потому что я не получаю печенье отself.request
,Возможно ли, чтобы сэкономить часы внешнего интерфейса или что-то такое, что движок Google google кэширует скрипты с сервера в memcache сервера? Я сомневаюсь в этом, но я в растерянности по причине такого поведения.
Заранее спасибо за помощь
редактировать
После дополнительного тестирования я обнаружил, что, как и предполагалось, файл router.py правильно ответил и направил пользователя, вошедшего в систему, когда к нему был добавлен комментарий. Кажется, это указывает на кеширование.
Редактировать 2
Я обнаружил еще немного информации о приложении WSHI:
Среда выполнения Python кэширует импортированные модули между запросами на одном веб-сервере, подобно тому, как автономное приложение Python загружает модуль только один раз, даже если модуль импортируется несколькими файлами. Поскольку обработчики WSGI являются модулями, они кэшируются между запросами. Сценарии обработчика CGI кэшируются, только если они предоставляют подпрограмму main(); в противном случае скрипт-обработчик CGI загружается для каждого запроса.
Интересно, насколько эффективно как-то обновить модуль WSGI. Это, несомненно, будет задачей сервера, но решит мою проблему. Опять же, это кажется частичным решением.
Редактировать 3
Опять же, любая попытка рандомизировать комментарий в файле router.py неэффективна. Оператор id, ищущий имя пользователя для входа, полностью игнорируется, и WSGIApplication устанавливается в исходное состояние. Я еще не уверен, связано ли это с кешем модуля в модуле webapp2 или с кешем модуля в пользовательском API. Я подозреваю последнее.
2 ответа
Замените router.py на:
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from lib import user
import guest
import authorized
def main():
if user.isLoggedIn():
run_wsgi_app(authorized.application)
else:
run_wsgi_app(guest.application)
if __name__ == "__main__":
main()
Переход к старому веб-приложению позволяет динамически изменять приложение wsgi. это проверено и работает отлично! CGI адаптер run_wsgi_app
позволяет веб-приложению изменять свой каталог без кэширования.
Проблема не в "кешировании", а в том, как работают приложения WSGI. Процесс WSGI остается живым в течение достаточно длительного периода времени и обслуживает несколько запросов в течение этого периода. app
определяется при запуске этого процесса и не изменяется до тех пор, пока процесс не будет возобновлен. Вы не должны пытаться делать что-то динамическое или зависящее от запроса в этот момент.