python - 通过邮箱查询端点用户

标签 python google-app-engine google-cloud-endpoints endpoints-proto-datastore

我正在尝试创建一种方法,允许我通过用户电子邮件查询端点。还有比我下面所做的更好的方法吗?可能只返回一条或零条记录。

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

最佳答案

我假设User是一些继承自EndpointsModel的自定义模型。如果没有,这将会失败。换句话说,您已经做了这样的事情:

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

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

有两种主要方法可以解决此问题,您可以使用电子邮件作为实体的键,或者滚动您自己的查询并尝试获取两个实体以查看您的结果是否唯一并且存在。

选项 1:使用电子邮件作为 key

您可以执行simple 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

使用电子邮件作为每个实体的数据存储键,如 custom alias properties sample 中所做的那样。例如:

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]

关于python - 通过邮箱查询端点用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15508970/

相关文章:

eclipse - 无法将外部库用于 google app engine java 项目

java - 如何在localhost上运行ESP(Extensible Service Proxy)在本地模拟认证?

java - 来自 GoogleJsonResponseException 的 Cloud Endpoint 异常映射器

python - 在Python中计算每行中特定列的接下来3行的最大值

python - 如何绘制数组或替代函数的函数?

google-app-engine - 如何允许移动应用程序使用 Facebook 和 Google 登录以访问 GAE 上的 Web 服务?

google-app-engine - 使用 Firebase 或 Cloud Endpoints 身份验证和 Google App Engine 后端的移动应用程序

python - 以编程方式在蚊子中设置访问控制限制

python - 如何在 Python 中有效地解析大型 JSON 文件?

java - Tomcat HtmlUnit 过滤器看不到请求的 URL