2013-05-31 2 views
1

Есть ли функция в Google App Engine для проверки, является ли строка допустимой «строковой клавишей» перед вызовом memcache.get(key) без использования db.get() или db.get_by_key_name()?Проверить, является ли строка допустимым ключом до memcache.get()

В моем случае ключ передаются из запроса GET пользователя: obj = memcache.get(self.request.get("obj"))

Как-то я хотел бы знать, если эта строка является допустимым ключом строки без вызова дб первого, который будет противоречить целям использования memcache.

+0

Что вы подразумеваете под «действительным» ключом? Вы имеете в виду «в правильном формате для ключевой строки», или вы имеете в виду «относится к фактическому объекту в хранилище данных»? –

+0

Я имею в виду правильный формат для ключевой строки, чтобы избежать ошибки 'raise datastore_errors.BadKeyError ('Недопустимый строковый ключ% s.'% Encoded)'. Спасибо за помощь. – user1961

ответ

1

Это, вероятно, самый эффективный (и практичный) способ определения правильности ключевой строки. Очевидно, что этот код выполняет этот тест, прежде чем он попытается извлечь объект из memcache/datastore. Более того, Google при необходимости обновит этот код.

try: 
    obj = memcache.get(self.request.get("obj")) 
except BadKeyError: 
    # give a friendly error message here 

Также рассмотрите возможность переключения на ndb. Выполнение get() на ключе автоматически использует два уровня кеша, локальный и memcache. Вам не нужно писать отдельный код для memcache.

0

Любой объект является допустимым ключом при условии, что объект может быть сериализован с использованием рассола. Если pickle.dumps (key) успешно завершен, тогда вы не должны получить BadKeyError.

1

Ключ модуля db, отправленный клиенту, должен пройти через str (the_key), который дает вам безопасный ключ URL. Ваша templating environment и т. Д. Сделают это для вас, просто предоставив ключ в шаблон.

При переходе ключ обратно от клиента, вы должны воссоздать ключ с key = db.Key(encoded=self.request.get("obj"))

На данный момент он может не с чем-то вроде BadKeyError: Invalid string key "thebadkeystring"=.

Если нет у вас есть действительный ключ

obj = memcache.get(self.request.get("obj")) на самом деле не поднимет BadKeyError, потому что в этот момент вы просто работаете со строкой, и получаете только None или значение.

Итак, в этот момент вы знаете, что у вас нет ключа.

Однако вам необходимо использовать memcache.get (self.request.get ("obj")), чтобы получить объект из memcache, поскольку экземпляр db.Key не является допустимым ключом memcache.

Таким образом, вы будете создавать ключ для проверки ключевой строки в этой точке. Конечно, если memcache не получается, вы можете использовать только что созданный ключ для извлечения объекта с помощью db.get(key)

+0

Спасибо за помощь. Меня беспокоит, что я не могу управлять входящей строкой, то есть пользователь может ее манипулировать. Я думаю, что повторное создание ключа будет работать для этих целей. – user1961

+0

Основные манипуляции возможны. Рамка авторизации, которая проверяет, имеет ли конкретный главный (пользователь, группа) разрешение на доступ к объекту, может быть одной из стратегий для устранения этого риска. –

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