1

グーグルアプリエンジンでは、グーグルアプリエンジン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つの理由が考えられます。

  1. isLoggedIn()os.environ ['HTTP_COOKIE']を使用してCookieを取得し、ユーザーがログインしているかどうかを確認します。次に、Cookieデータをデータベースと照合して、有効なCookieであることを確認します。おそらくこれは、ページが更新されているときにサーバー側のCookieが更新されていないというエラーが発生する可能性がありますか?たぶん、からCookieを取得していないためですself.request

  2. フロントエンドの時間などを節約するために、Google App Engineがサーバーのスクリプトをサーバーのmemcacheにキャッシュすることは可能ですか?私はそれを疑うが、私はこの振る舞いの理由で途方に暮れている。

助けてくれてありがとう

編集

さらにテストを行ったところ、疑わしいと思われるように、router.pyファイルが正しく応答し、コメントが追加されたときにログインに基づいてユーザーに指示したことがわかりました。これはキャッシュを示しているようです。

編集2

WSHIアプリケーションに関するいくつかの詳細情報を発見しました。

Pythonランタイム環境は、モジュールが複数のファイルによってインポートされた場合でも、スタンドアロンのPythonアプリケーションがモジュールを1回だけロードするのと同様に、単一のWebサーバー上のリクエスト間でインポートされたモジュールをキャッシュします。WSGIハンドラーはモジュールであるため、リクエスト間でキャッシュされます。CGIハンドラスクリプトは、main()ルーチンを提供する場合にのみキャッシュされます。それ以外の場合、CGIハンドラスクリプトはすべての要求に対してロードされます。

どういうわけか、WSGIモジュールを更新するのがどれほど効率的か疑問に思います。これは間違いなくサーバーにタスクを課しますが、私の問題は解決します。繰り返しますが、これは部分的な解決策のようです。

編集3

繰り返しますが、router.pyファイルのコメントをランダム化しようとしても効果がありません。ユーザーログインを検索するidステートメントは完全に見落とされ、WSGIApplicationは元の状態に設定されます。これがwebapp2モジュールのモジュールキャッシュによるものなのか、ユーザーAPIのモジュールキャッシュによるものなのかはまだわかりません。後者だと思います。

4

2 に答える 2

2

問題は「キャッシング」ではなく、WSGIアプリケーションがどのように機能するかです。WSGIプロセスはかなり長い期間存続し、その期間中に複数のリクエストを処理します。はapp、そのプロセスが開始されたときに定義され、プロセスが更新されるまで変更されません。その時点で、動的または要求に依存することを実行しようとしないでください。

于 2013-02-20T15:38:36.707 に答える
1

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()

古いWebアプリケーションにダウングレードすると、wsgiアプリケーションを動的に変更できます。テスト済みで、完全に機能します。CGIアダプタrun_wsgi_appを使用すると、Webアプリケーションはキャッシュせずにディレクトリリストを変更できます。

于 2013-02-20T16:35:07.027 に答える