Запрос конечного пользователя по электронной почте

Я пытаюсь создать метод, который позволит мне запрашивать конечную точку по электронной почте пользователя. Есть ли лучший способ сделать это, чем то, что я делаю ниже? Тот, который возвращает только одну или ноль записей, возможно.

    @User.query_method(query_fields=('email',),
                       path='get_by_mail',
                       name='user.get_by_email')
    def get_by_email(self, query):
        return query

1 ответ

Решение

Я предполагаю, что User некоторая пользовательская модель, которая наследуется от EndpointsModel, Если нет, это не удастся. Другими словами, вы сделали что-то вроде этого:

from google.appengine.ext import ndb
from endpoints_proto_datastore.ndb import EndpointsModel

class User(EndpointsModel):
    email = ndb.StringProperty()
    ...

Есть два основных подхода к решению этой проблемы, вы можете использовать email в качестве ключа для объекта или накатить свой собственный запрос и попытаться получить два объекта, чтобы увидеть, если ваш результат уникален и существует.

ВАРИАНТ 1: Используйте email как ключ

Вместо того, чтобы делать полный запрос, вы могли бы сделать простой get.

from google.appengine.ext import endpoints

@endpoints.api(...)
class SomeClass(...):

    @User.method(request_fields=('email',),
                 path='get_by_mail/{email}',
                 http_method='GET', name='user.get_by_email')
    def get_by_email(self, user):
        if not user.from_datastore:
            raise endpoints.NotFoundException('User not found.')
        return user

используя электронную почту в качестве ключа хранилища данных для каждой сущности, как это делается в образце пользовательских свойств псевдонима. Например:

from endpoints_proto_datastore.ndb import EndpointsAliasProperty

class User(EndpointsModel):
    # remove email here, as it will be an alias property 
    ...

    def EmailSet(self, value):
        # Validate the value any way you like
        self.UpdateFromKey(ndb.Key(User, value))

    @EndpointsAliasProperty(setter=IdSet, required=True)
    def email(self):
        if self.key is not None: return self.key.string_id()

ВАРИАНТ 2: накатить свой запрос

    @User.method(request_fields=('email',),
                 path='get_by_mail/{email}',
                 http_method='GET', name='user.get_by_email')
    def get_by_email(self, user):
        query = User.query(User.email == user.email)
        # We fetch 2 to make sure we have
        matched_users = query.fetch(2)
        if len(matched_users == 0):
            raise endpoints.NotFoundException('User not found.')
        elif len(matched_users == 2):
            raise endpoints.BadRequestException('User not unique.')
        else:
            return matched_users[0]
Другие вопросы по тегам