Кэш приложений 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() функция. Если вы вошли в систему, она не распознает, что вы сделали это, пока каждая вкладка не будет закрыта. У меня есть две возможные причины для этого:

  1. isLoggedIn() использует os.environ['HTTP_COOKIE'] для извлечения файлов cookie и проверки входа пользователя в систему, а затем проверяет данные файлов cookie в базе данных, чтобы убедиться, что они являются действительными файлами cookie. Возможно, это может привести к ошибке, когда куки на стороне сервера не обновляются, когда страница находится? Может быть, потому что я не получаю печенье от self.request,

  2. Возможно ли, чтобы сэкономить часы внешнего интерфейса или что-то такое, что движок 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 определяется при запуске этого процесса и не изменяется до тех пор, пока процесс не будет возобновлен. Вы не должны пытаться делать что-то динамическое или зависящее от запроса в этот момент.

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