Übung 1: Todo-API mit Flask
Erstellen Sie eine REST-API für eine Todo-Liste mit folgenden Endpunkten:
GET /api/todos– Alle Todos abrufenGET /api/todos/{id}– Ein bestimmtes Todo abrufenPOST /api/todos– Neues Todo erstellenPUT /api/todos/{id}– Todo aktualisierenDELETE /api/todos/{id}– Todo löschen
Vorgaben
Jedes Todo sollte folgende Felder haben:
id– automatisch vergebentitle– Pflichtfelddescription– optionaldone–trueoderfalse
Beispielcode
from flask import Flask, jsonify, request
app = Flask(__name__)
todos = [
{"id": 1, "title": "Flask API lernen", "description": "REST API mit Flask erstellen", "done": False},
{"id": 2, "title": "Einkaufen gehen", "description": "Milch, Brot und Eier kaufen", "done": True}
]
next_id = len(todos) + 1
@app.route('/api/todos', methods=['GET'])
def get_todos():
return jsonify(todos)
@app.route('/api/todos/<int:todo_id>', methods=['GET'])
def get_todo(todo_id):
todo = next((item for item in todos if item['id'] == todo_id), None)
return jsonify(todo) if todo else (jsonify({'error': 'Todo nicht gefunden'}), 404)
@app.route('/api/todos', methods=['POST'])
def create_todo():
global next_id
if not request.json or 'title' not in request.json:
return jsonify({'error': 'Titel ist erforderlich'}), 400
todo = {
'id': next_id,
'title': request.json['title'],
'description': request.json.get('description', ''),
'done': request.json.get('done', False)
}
todos.append(todo)
next_id += 1
return jsonify(todo), 201
@app.route('/api/todos/<int:todo_id>', methods=['PUT'])
def update_todo(todo_id):
todo = next((item for item in todos if item['id'] == todo_id), None)
if not todo:
return jsonify({'error': 'Todo nicht gefunden'}), 404
if not request.json:
return jsonify({'error': 'Daten müssen im JSON-Format sein'}), 400
todo['title'] = request.json.get('title', todo['title'])
todo['description'] = request.json.get('description', todo['description'])
todo['done'] = request.json.get('done', todo['done'])
return jsonify(todo)
@app.route('/api/todos/<int:todo_id>', methods=['DELETE'])
def delete_todo(todo_id):
todo = next((item for item in todos if item['id'] == todo_id), None)
if not todo:
return jsonify({'error': 'Todo nicht gefunden'}), 404
todos.remove(todo)
return jsonify({'result': True})
if __name__ == '__main__':
app.run(debug=True)
Erklärung
- Verwendung einer einfachen In-Memory-Datenbank (Liste)
- Jede Route entspricht einer CRUD-Operation
- Eingabedaten werden validiert
- Statuscodes wie 201 (Created), 400 (Bad Request), 404 (Not Found)
Tipp: Probiere die API mit curl oder einem Tool wie Postman aus!
Zurück zum Blog