MyTetra Share
Делитесь знаниями!
Создание RESTful API на Flask
Время создания: 11.01.2018 10:11
Автор: br0ke
Текстовые метки: python, flask, rest, api, restful, flask-restful, http
Раздел: Информационные технологии - Python - Библиотеки - Flask

Flask-RESTful -- небольшая библиотека, которая позволяет быстро написать REST API на основе Flask.


Все примеры взяты отсюда: https://flask-restful.readthedocs.io/en/latest/quickstart.html


Установка:

pip install flask-restful


Минимальный пример:

from flask import Flask

from flask_restful import Resource, Api


app = Flask(__name__)

api = Api(app)


class HelloWorld(Resource):

def get(self):

return {'hello': 'world'}


api.add_resource(HelloWorld, '/')


if __name__ == '__main__':

app.run(debug=True)


Библиотека позволяет выполнять гибкую маршрутизацию с извлечением аргументов из адреса запроса. Пример:

from flask import Flask, request

from flask_restful import Resource, Api


app = Flask(__name__)

api = Api(app)


todos = {}


class TodoSimple(Resource):

def get(self, todo_id):

return {todo_id: todos[todo_id]}


def put(self, todo_id):

todos[todo_id] = request.form['data']

return {todo_id: todos[todo_id]}


api.add_resource(TodoSimple, '/<string:todo_id>')


if __name__ == '__main__':

app.run(debug=True)


Также библиотека поддерживает парсинг переданных аргументов и проверку их на соответствие заданной модели (список полей). Если какое-то поле отсутствует, то библиотека сгенерирует ошибку. Если присутствует лишнее поле, то библиотека также может сгенерировать ошибку (strict режим).
Большой пример:

from flask import Flask

from flask_restful import reqparse, abort, Api, Resource


app = Flask(__name__)

api = Api(app)


TODOS = {

'todo1': {'task': 'build an API'},

'todo2': {'task': '?????'},

'todo3': {'task': 'profit!'},

}



def abort_if_todo_doesnt_exist(todo_id):

if todo_id not in TODOS:

abort(404, message="Todo {} doesn't exist".format(todo_id))


parser = reqparse.RequestParser()

parser.add_argument('task')



# Todo

# shows a single todo item and lets you delete a todo item

class Todo(Resource):

def get(self, todo_id):

abort_if_todo_doesnt_exist(todo_id)

return TODOS[todo_id]


def delete(self, todo_id):

abort_if_todo_doesnt_exist(todo_id)

del TODOS[todo_id]

return '', 204


def put(self, todo_id):

args = parser.parse_args()

task = {'task': args['task']}

TODOS[todo_id] = task

return task, 201



# TodoList

# shows a list of all todos, and lets you POST to add new tasks

class TodoList(Resource):

def get(self):

return TODOS


def post(self):

args = parser.parse_args()

todo_id = int(max(TODOS.keys()).lstrip('todo')) + 1

todo_id = 'todo%i' % todo_id

TODOS[todo_id] = {'task': args['task']}

return TODOS[todo_id], 201


##

## Actually setup the Api resource routing here

##

api.add_resource(TodoList, '/todos')

api.add_resource(Todo, '/todos/<todo_id>')



if __name__ == '__main__':

app.run(debug=True)

 
MyTetra Share v.0.53
Яндекс индекс цитирования