Проверьте, является ли строка допустимым ключом до memcache.get()
Есть ли в Google App Engine функция для проверки правильности строки "строковый ключ" перед вызовом memcache.get(key)
без использования db.get()
или же db.get_by_key_name()
первый?
В моем случае ключ передается из пользовательского запроса get: obj = memcache.get(self.request.get("obj"))
Каким-то образом я хотел бы знать, является ли эта строка допустимой ключевой строкой без предварительного вызова db, что противоречило бы цели использования memcache.
3 ответа
Это, вероятно, самый эффективный (и практичный) способ определения допустимости ключевой строки. Код, очевидно, выполняет этот тест для вас, прежде чем попытается извлечь объект из memcache/datastore. Еще лучше, Google обновит этот код при необходимости.
try:
obj = memcache.get(self.request.get("obj"))
except BadKeyError:
# give a friendly error message here
Также рассмотрите возможность перехода на ndb. Выполнение get() для ключа автоматически использует два уровня кеша, локальный и memcache. Вам не нужно писать отдельный код для memcache.
Ключ модуля db, отправляемый клиенту, должен проходить через str(the_key), который дает вам кодированный ключ URL-адреса. Ваша среда шаблонов и т. Д. Сделает это за вас, просто превратив ключ в шаблон.
Передав ключ от клиента, вы должны заново создать ключ с 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)
Любой объект является допустимым ключом при условии, что объект может быть сериализован с помощью pickle. Если pickle.dumps(key) завершается успешно, вы не должны получить ошибку BadKeyError.