webapp2 + RESTful API - PullRequest
       61

webapp2 + RESTful API

0 голосов
/ 23 сентября 2019

Я строю на Google App Engine + Python + webapp2.Часть создания современного веб-приложения требует полноценного API.Я знаю, что могу сделать это с Flask, однако я хочу изучить возможность создания REST API на webapp2.

В 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 больше не используется в этом шаблоне, поскольку вместо этого он будет представлен в теле запроса.

Это правильный подход к созданию REST API с помощью webapp2?

Ответы [ 2 ]

0 голосов
/ 26 сентября 2019

Следует расширить webapp2.RequestHandler и использовать расширение в качестве нового базового класса для RESTfulHandler, а затем, возможно, также для вашей конкретной цели расширить RESTfulHandler до RESTfulPostHandler.Таким образом, мы могли бы также иметь дело с новыми способами или работой, такими как jwt (веб-токен JSON) в заголовке, авторизация и другие свойства, которые вы хотите обработать в заголовке.

Кстати, «post» может быть не лучшим названием для вашего элемента / объекта, поскольку его можно легко перепутать с глаголом http «post».Если бы я был вами, я бы переименовал его в «item» или аналогичный, и использовал бы RESTfulItemHandler, который расширяет обработчик запросов webapp2.Есть много вещей, которыми вы хотели бы поделиться с вашим обработчиком, и поэтому удобно делиться функциональностью в базовом классе.

0 голосов
/ 24 сентября 2019

Вы находитесь на правильном пути, но вы должны продолжать обрабатывать post_id в URL и делать это так:

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предлагается не соответствует RESTful API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...