webapp2+restfulapi

2024-04-20 00:29:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在googleappengine+Python+webapp2上构建。构建现代web应用程序的一部分需要restfulapi。我知道我可以用Flask来实现这一点,但是我想探索在webapp2上构建restapi的可能性。你知道吗

在webapp2上,请求的处理方式如下:

app = webapp2.WSGIApplication([
    ('/post/new', CreatePost),
    ('/post/([a-z0-9]+)', ViewPost),
    ('/post/([a-z0-9]+)/edit', EditPost),
    ('/post/([a-z0-9]+)/delete', DeletePost)
])

注意:([a-z0-9]+)是表示post_id的正则表达式

上面的请求处理程序不遵循RESTful模式,因为请求methods是在路径(/delete,/edit,/new)中指定的,而不是在请求头中指定的。你知道吗

解决方案是创建一个接收所有请求类型的处理程序类吗?例如:

class PostHandler(webapp2.RequestHandler):
    def get(self):
        # handle GET requests

    def post(self):
        # handle POST requests

    def put(self):
        # handle PUT requests

    def delete(self):
        # handle DELETE requests


app = webapp2.WSGIApplication([
    ('/post/?', PostHandler)
])

在本例中,所有/post路径都由PostHandler处理。post_id不再用于此模式,因为它将在请求主体中提交。你知道吗

这是用webapp2构建restapi的正确方法吗?你知道吗


Tags: selfrestapiidappnewdefdeletepost
2条回答

您的路径是正确的,但是您应该继续处理url中的post_id,并按如下方式操作:

class PostHandler(webapp2.RequestHandler):
    def get(self, post_id=None):
        if post_id:
            # handle Fetching a single post object
        else:
            # handle Queries

    def post(self, post_id=None):
        if post_id:
            self.abort(405)
        # handle creating a single post object

    def put(self, post_id=None):
        if post_id:
            # handle updating a single post object
        else:
            self.abort(405)


    def delete(self, post_id=None):
        if post_id:
            # handle deleting a single post object
        else:
            self.abort(405)


app = webapp2.WSGIApplication([
    ('/post/<post_id>/', PostHandler),
    ('/post/', PostHandler),
])

此外,将HTTP动词放在请求负载中(如voscausa)并不符合restfulapi设计。你知道吗

我们应该扩展webapp2.RequestHandler,并将该扩展用作RESTfulHandler的新基类,然后还可以出于特定目的将RESTfulHandler扩展到RESTfulPostHandler。通过这种方式,我们还可以处理新的方法或工作,例如头中的jwt(jsonwebtoken)、授权和希望在头中处理的其他属性。你知道吗

顺便说一句,“post”可能不是项目/对象的最佳名称,因为它很容易与http动词“post”混淆。如果我是您,我会将其重命名为“item”或类似名称,并使用RESTfulItemHandler扩展webapp2请求处理程序。有很多东西你想在处理程序之间共享,比如在基类中共享功能很方便。你知道吗

相关问题 更多 >