グーグルアプリエンジンでは、グーグルアプリエンジンAPIユーザーに干渉しないように、適切にユーザーと呼ばれる独自のユーザーAPIを作成しました。ほとんどのマルチユーザーWebサイトと同様に、ユーザーはログインしているかどうかに応じて、サイトの2つの「バージョン」を利用できます。したがって、次のコードを使用して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)]
したがって、ルータファイルは、ゲストモジュールまたは許可されたモジュールのいずれかからWSGIHandler変数を取得することにより、使用するWSGIApplicationURLダイレクタを簡単に選択します。ただし、ユーザーは、機能の変更を検出するために、ルーターのすべてのタブを閉じる必要がありますisLoggedIn()
。ログインしても、すべてのタブが閉じられるまで、ログインしたことは認識されません。これには2つの理由が考えられます。
isLoggedIn()
os.environ ['HTTP_COOKIE']を使用してCookieを取得し、ユーザーがログインしているかどうかを確認します。次に、Cookieデータをデータベースと照合して、有効なCookieであることを確認します。おそらくこれは、ページが更新されているときにサーバー側のCookieが更新されていないというエラーが発生する可能性がありますか?たぶん、からCookieを取得していないためですself.request
。フロントエンドの時間などを節約するために、Google App Engineがサーバーのスクリプトをサーバーのmemcacheにキャッシュすることは可能ですか?私はそれを疑うが、私はこの振る舞いの理由で途方に暮れている。
助けてくれてありがとう
編集
さらにテストを行ったところ、疑わしいと思われるように、router.pyファイルが正しく応答し、コメントが追加されたときにログインに基づいてユーザーに指示したことがわかりました。これはキャッシュを示しているようです。
編集2
WSHIアプリケーションに関するいくつかの詳細情報を発見しました。
Pythonランタイム環境は、モジュールが複数のファイルによってインポートされた場合でも、スタンドアロンのPythonアプリケーションがモジュールを1回だけロードするのと同様に、単一のWebサーバー上のリクエスト間でインポートされたモジュールをキャッシュします。WSGIハンドラーはモジュールであるため、リクエスト間でキャッシュされます。CGIハンドラスクリプトは、main()ルーチンを提供する場合にのみキャッシュされます。それ以外の場合、CGIハンドラスクリプトはすべての要求に対してロードされます。
どういうわけか、WSGIモジュールを更新するのがどれほど効率的か疑問に思います。これは間違いなくサーバーにタスクを課しますが、私の問題は解決します。繰り返しますが、これは部分的な解決策のようです。
編集3
繰り返しますが、router.pyファイルのコメントをランダム化しようとしても効果がありません。ユーザーログインを検索するidステートメントは完全に見落とされ、WSGIApplicationは元の状態に設定されます。これがwebapp2モジュールのモジュールキャッシュによるものなのか、ユーザーAPIのモジュールキャッシュによるものなのかはまだわかりません。後者だと思います。