0

この関数はインタラクティブ コンソールで正常に動作します。

from google.appengine.api import namespace_manager
from google.appengine.ext import db

namespace_manager.set_namespace("some_namespace")

class Class(db.Model):
    c = db.StringProperty()

x = Class(c="text")
x.put()

ただし、ログインが実行namespace_manager.set_namespace(user.namespace)されると、データストアに取得および保存されたすべてのデータはルート (空の) 名前空間に属します。

それは疑問を投げかけます

  1. 名前空間の設定が間違っていますか?
  2. データを取得して保存する直前に毎回設定する必要がありますか (ゲストブックの例ではそうではありません)
  3. namespece がサーバー側で設定されている場合、どの post/get() がどの名前空間に属しているかをどのように知ることができますか?

このリンクを教えないでください: https://developers.google.com/appengine/docs/python/multitenancy/multitenancyドキュメントは非常に...

編集 これは質問に答えます

"set_namespace(namespace) 現在の HTTP リクエストの名前空間を設定します。"

そして、「なぜゲストブックの例が違うのか」に対する答えはappengine_config.py.

唯一の質問は、ユーザーにログインするときにルート名前空間を読み取れる必要があるため、ユーザーデータをルート名前空間に保存する必要があるように見えますが、ログインして名前空間が特定のものに設定されると、Cookie チェック機能が機能します。ルート名前空間にアクセスできず、エラーが発生します。

どうすればそれを回避できますか?(独り言みたいな感じ)

4

1 に答える 1

1

たとえば名前空間をインポートのすぐ下に設定すると、コードのその部分がキャッシュされ、リクエストごとに再実行されないため、ハンドラ関数内で名前空間を設定する必要があります。コードの動的でない部分に設定した場合も同様です。

したがって、コードが最初にロードされたときにユーザーが存在せず、名前空間が変更されないことが起こると思います。もちろん、コード全体が実行されるため、対話型コンソールで機能します。

# this will be the namespace of the user when the code loads or nothing
# and it will never change as long as the instance is up
namespace_manager.set_namespace(user.namespace)  

class YourHandler(webapp2.RequestHandler):
    def get(self):
       # get the user....
       namespace_manager.set_namespace(user.namespace)
       # setting the namespace here will change it for each request.
于 2013-04-08T21:54:08.743 に答える