只用 Google App Engine、webapp2 和 Python 创建 API?

3

是否可能仅使用Google App Engine上的webapp2和Python创建API?

例如,假设我的路由/post/123由此RequestHandler处理:

class ShowPosts(webapp2.RequestHandler):
    def get(self):
        posts = Post.query().fetch()
        # return the post as data (JSON) here as response 

当客户端向/post/123发起restful请求时,可以返回数据对象(而不是呈现的HTML页面)。这种做法是否可行或值得推荐?
2个回答

5

您可以通过查询构建一个 Python 列表或字典对象,然后将其作为 JSON 对象发送,并将其作为响应发送。尝试使用以下代码:

import json

posts     = Post.query()
post_json = []

for post in posts:
    post_dict = {
        'name' : post.name,
        'city' : post.city,
        'state': post.state
    }
    post_json.append( post_dict )

return json.dumps(post_json)

更新: OP 要求使用 POST 方法的示例:

import json

class ShowPosts(webapp2.RequestHandler):
    def get(self):
        posts = Post.query()
        post_json   = []

        for post in posts:
            post_dict = {
                'name' : post.name,
                'city' : post.city,
                'state': post.state
            }

            post_json.append( post_dict )

        return json.dumps(post_json) 

    def post(self):
        posts = Post.query()
        post_json   = []

        for post in posts:
            post_dict = {
                'name' : post.name,
                'city' : post.city,
                'state': post.state
            }

            post_json.append( post_dict )

        post_json.append(
            {
                'posted_name': self.request.get('name'),
                'posted_msg': self.request.get('msg')
            }
        )
        return json.dumps(post_json) 

谢谢您提供的这个示例,它演示了如何处理GET方法。API的另一部分应该能够处理其他HTTP方法;我们该如何配置它来处理POST或DELETE方法? - puoygae
我不确定我理解了。处理POST方法是基础知识。你应该阅读https://webapp2.readthedocs.io/en/latest/guide/request.html。我不想花时间做学生的家庭作业。请查看更新后的答案。 - GAEfan
需要注意的一点是,当使用webapp2处理带有参数的POST请求时,我们使用self.request.get('some_field'),而当我们的应用程序接收到restful post请求时,看起来我们使用self.request.body访问发送的数据。 - puoygae

1

你不必返回一个HTML页面。你可以返回一个JSON,甚至只是一个字符串,因为它是你托管的代码。你可以轻松地使用你的App Engine发送一个URL来响应REST调用。


如果我们要POST数据怎么办?我们该如何做呢?如果您愿意,在您的回答中能否提供一个例子? - puoygae

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接