Flask-RESTful указывает методы HTTP, разрешенные для определенных конечных точек.

Учтите, что у меня есть два класса Resource:

class UserView(Resource):
    def get(self, id):
        ...
    def post(self):
        ...
    def put(self, id):
        ...
    def delete(self, id):
        ...


class AnotherUserView(Resource):
    def get(self):
        ...
    def put(self):
        ...
    def delete(self):
        ...


api.add_resource(UserView, '/user/<int:id>')
api.add_resource(AnotherUserView, '/user')

Учитывая приведенный выше код, для всех методов GET, PUT и DELETE UserView требуется параметр пути id. Поэтому UserView сопоставляется с маршрутом /user/<int:id>. Однако методу POST не нужен параметр пути id, но он включен в маршрут, предоставляющий параметр id, что может привести к путанице.

Итак, теперь я думаю, есть ли способ указать, какие методы разрешены для определенного маршрута (или конечной точки), например, что мы можем сделать с Flask: @app.route('/user/<int:id>', methods=['GET', 'PUT', 'DELETE'].

Ожидается, что я могу сделать:

api.add_resource(UserView, '/user/<int:id>', methods=['GET', 'PUT', 'DELETE'])
api.add_resource(UserView, '/user', methods=['POST'])
api.add_resource(AnotherUserView, '/user', methods=['GET', 'PUT', 'DELETE'])

Но на самом деле это не сработает, так как компилятор говорит мне, что я перезаписываю функцию просмотра UserView.

Я прочитал документ Flask-RESTful и обнаружил, что api.add_resource не имеет аргумента methods, который можно использовать для указания разрешенных методов HTTP, как это делает app.route. Есть ли способ добиться этого?


person Natarich J    schedule 14.05.2020    source источник


Ответы (1)


В Flask-Restful функции класса get, post и т. д. соответствуют методам http. Если вам не нужен конкретный метод для ресурса, просто оставьте его.

Лично меня не смущает наличие метода POST без id в классе.

Чтобы получить ожидаемый результат, попробуйте добавить нужные маршруты для каждого ресурса. Например.

from flask_restful import Api, Resource

class User(Resource):
    def get(self, id=None):
        if id:
            return "specific user"
        else:
            return "list of users"

    def post(self):
        return "post with no id!"

    def delete(self, id=None):
        if id:
            return "deleting user"
        else:
            return "need to specify a user"

api.add_resource(User, '/user', '/user/<int:id>')
person PGHE    schedule 14.05.2020