from flask import Flask from flask_restx import Api, Resource, fields from werkzeug.middleware.proxy_fix import ProxyFix app = Flask(__name__) app.wsgi_app = ProxyFix(app.wsgi_app) api = Api( app, version="1.0", title="TodoMVC API", description="A simple TodoMVC API", ) ns = api.namespace("todos", description="TODO operations") todo = api.model( "Todo", { "id": fields.Integer(readonly=True, description="The task unique identifier"), "task": fields.String(required=True, description="The task details"), }, ) class TodoDAO(object): def __init__(self): self.counter = 0 self.todos = [] def get(self, id): for todo in self.todos: if todo["id"] == id: return todo api.abort(404, "Todo {} doesn't exist".format(id)) def create(self, data): todo = data todo["id"] = self.counter = self.counter + 1 self.todos.append(todo) return todo def update(self, id, data): todo = self.get(id) todo.update(data) return todo def delete(self, id): todo = self.get(id) self.todos.remove(todo) todo_dao = TodoDAO() todo_dao.create({"task": "Build an API"}) todo_dao.create({"task": "?????"}) todo_dao.create({"task": "profit!"}) @ns.route("/") class TodoList(Resource): """Shows a list of all todos, and lets you POST to add new tasks""" @ns.doc("list_todos") @ns.marshal_list_with(todo) def get(self): """List all tasks""" return todo_dao.todos @ns.doc("create_todo") @ns.expect(todo) @ns.marshal_with(todo, code=201) def post(self): """Create a new task""" return todo_dao.create(api.payload), 201 @ns.route("/") @ns.response(404, "Todo not found") @ns.param("id", "The task identifier") class Todo(Resource): """Show a single todo item and lets you delete them""" @ns.doc("get_todo") @ns.marshal_with(todo) def get(self, id): """Fetch a given resource""" return todo_dao.get(id) @ns.doc("delete_todo") @ns.response(204, "Todo deleted") def delete(self, id): """Delete a task given its identifier""" todo_dao.delete(id) return "", 204 @ns.expect(todo) @ns.marshal_with(todo) def put(self, id): """Update a task given its identifier""" return todo_dao.update(id, api.payload) if __name__ == "__main__": app.run(debug=True)