2013-04-08 3 views
0

Эта функция отлично работает на интерактивной консоли:настройка GAE имен

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 задано на стороне сервера, как он знает, какой пост/get() принадлежит в какое пространство имен?

Пожалуйста, не указывают мне на эту ссылку: https://developers.google.com/appengine/docs/python/multitenancy/multitenancy документация очень ...

EDIT это отвечает на вопрос

«set_namespace (пространства имен) Устанавливает пространство имен для текущий HTTP запрос. "

И я догадываюсь, что ответ на вопрос «почему был гостевой пример другого» находится в appengine_config.py.

Теперь единственный вопрос - при регистрации пользователя он должен иметь возможность читать корневое пространство имен, поэтому я должен хранить данные пользователя в корневом пространстве имен, но как только он войдет в систему и его пространство имен настроено на что-то конкретное, моя функция проверки файлов cookie не может получить доступ к корневому пространству имен и вызывает ошибку.

Как мне обойти это? (чувствую, что разговариваю сам с собой)

ответ

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. 
+0

Да, это имеет смысл. Я также обнаружил, что если у вас есть модуль 'appengine_cinfig.py',' namespace_manager_default_namespace_for_request() 'вызывается каждый раз, когда вы делаете запросы (или даже запрос хранилища данных, потому что у меня был один запрос, но эта функция получила 4 раза) и что строка, которую возвращает, устанавливается как пространство имен. Это кажется еще более элегантным решением. Я преодолел проблему проверки файлов cookie с помощью 'namespace_manager.set_namespace (" ") user = Users.get_by_id (user_id) namespace_manager.set_namespace (user.namespace)' –

Смежные вопросы