Flask ist ein Microframework für Python, das sich ideal für die Erstellung von Webanwendungen und APIs eignet. Seine Einfachheit und Flexibilität machen es zu einer ausgezeichneten Wahl für Anfänger und erfahrene Entwickler. In diesem Artikel werden wir uns ansehen, wie man mit Flask eine einfache, aber voll funktionsfähige API erstellt.
Was ist eine API und warum braucht man sie?
Eine API (Application Programming Interface) ist eine Reihe von Regeln und Tools, die es verschiedenen Programmen ermöglichen, miteinander zu interagieren. Die RESTful-API verwendet HTTP-Anfragen, um CRUD-Operationen (Create, Read, Update, Delete) an Daten durchzuführen. Moderne Webanwendungen werden oft in Frontend und Backend unterteilt, wobei die API als Brücke zwischen ihnen dient.
Vorbereitung der Umgebung
Bevor wir beginnen, müssen wir Flask installieren. Es wird empfohlen, eine virtuelle Umgebung zu verwenden, um Projektabhängigkeiten zu isolieren:
python -m venv venv
source venv/bin/activate # für Linux/Mac
venv\Scripts\activate # für Windows
pip install flaskErstellen einer grundlegenden API
Beginnen wir mit der Erstellung der einfachsten Flask-Anwendung. Erstellen Sie die Datei app.py:
from flask import Flask, jsonify, request
app = Flask(__name__)
# Temporärer Datenspeicher
books = [
{'id': 1, 'title': 'Clean code', 'author': 'Robert Martin'},
{'id': 2, 'title': 'Python. To the heights of mastery', 'author': 'Luciano Ramallo'}
]
@app.route('/')
def home():
return jsonify({'message': 'Welcome to the API library!'})
if __name__ == '__main__':
app.run(debug=True)Starten Sie die Anwendung mit dem Befehl python app.py, und der Server wird unter http://127.0.0.1:5000/ verfügbar.
Implementierung von CRUD-Operationen
Fügen wir nun Endpunkte für die Arbeit mit Büchern hinzu.
Alle Bücher erhalten (GET)
@app.route('/api/books', methods=['GET'])
def get_books():
return jsonify({'books': books, 'count': len(books)})Buch per ID erhalten (GET)
@app.route('/api/books/<int:book_id>', methods=['GET'])
def get_book(book_id):
book = next((book for book in books if book['id'] == book_id), None)
if book:
return jsonify(book)
return jsonify({'error': 'Book not found'}), 404Erstellen eines neuen Buches (POST)
@app.route('/api/books', methods=['POST'])
def create_book():
if not request.json or 'title' not in request.json:
return jsonify({'error': 'You must specify the name of the book'}), 400
new_book = {
'id': books[-1]['id'] + 1 if books else 1,
'title': request.json['title'],
'author': request.json.get('author', 'Unknown author')
}
books.append(new_book)
return jsonify(new_book), 201Buch aktualisieren (PUT)
@app.route('/api/books/<int:book_id>', methods=['PUT'])
def update_book(book_id):
book = next((book for book in books if book['id'] == book_id), None)
if not book:
return jsonify({'error': 'Book not found'}), 404
book['title'] = request.json.get('title', book['title'])
book['author'] = request.json.get('author', book['author'])
return jsonify(book)Buch löschen (DELETE)
@app.route('/api/books/<int:book_id>', methods=['DELETE'])
def delete_book(book_id):
global books
books = [book for book in books if book['id'] != book_id]
return jsonify({'message': 'Book deleted successfully'})Fehlerbehandlung
Fügen Sie Fehlerhandler für aussagekräftigere Antworten hinzu:
@app.errorhandler(404)
def not_found(error):
return jsonify({'error': 'Resource not found'}), 404
@app.errorhandler(500)
def internal_error(error):
return jsonify({'error': 'Internal server error'}), 500API-Test
Zum Testen können Sie curl, Postman oder die Python-Bibliothek requests verwenden:
# Alle Bücher erhalten
curl http://127.0.0.1:5000/api/books
# Neues Buch erstellen
curl -X POST http://127.0.0.1:5000/api/books \
-H "Content-Type: application/json" \
-d '{"title":"Perfect Code","author":"Steve McConnell"}' Buch aktualisieren
curl -X PUT http://127.0.0.1:5000/api/books/1 \
-H "Content-Type: application/json" \
-d '{"title":"Clean Code (new edition)"}'# Buch löschen
curl -X DELETE http://127.0.0.1:5000/api/books/2Hinzufügen einer Validierung
Für eine zuverlässigere Datenvalidierung können Sie die Bibliothek flask-marshmallow verwenden:
from flask_marshmallow import Marshmallow
ma = Marshmallow(app)
class BookSchema(ma.Schema):
class Meta:
fields = ('id', 'title', 'author')
book_schema = BookSchema()
books_schema = BookSchema(many=True)Datenbankverbindung
Für echte Anwendungen lohnt es sich, eine Datenbank zu verwenden. Installieren wir Flask-SQLAlchemy:
pip install flask-sqlalchemyBeispiel für ein Buchmodell mit SQLAlchemy:
from flask_sqlalchemy import SQLAlchemy
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///books.db'
db = SQLAlchemy(app)
class Book(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(200), nullable=False)
author = db.Column(db.String(100))
def to_dict(self):
return {
'id': self.id,
'title': self.title,
'author': self.author
}CORS hinzufügen
Wenn Ihre API von einer Frontend-Anwendung verwendet wird, müssen Sie CORS konfigurieren:
pip install flask-corsfrom flask_cors import CORS
CORS(app)
Sicherheit und Best Practices
Bei der Entwicklung einer API ist es wichtig, die Sicherheit im Auge zu behalten. Verwenden Sie Umgebungsvariablen zum Speichern vertraulicher Daten, implementieren Sie die Authentifizierung über JWT-Token, begrenzen Sie die Anzahl der Anfragen (Ratenbegrenzung), validieren Sie alle eingehenden Daten und verwenden Sie HTTPS in der Produktion.
Es wird auch empfohlen, die Projektstruktur zu organisieren, indem der Code in Module unterteilt wird: Erstellen Sie separate Dateien für Modelle, Routen und Konfigurationen. Verwenden Sie Blueprint, um verwandte Endpunkte zu gruppieren, wodurch der Code wartbarer und skalierbarer wird.
API-Bereitstellung
Verwenden Sie zum Bereitstellen einer Flask-Anwendung in der Produktion einen WSGI-Server wie Gunicorn:
pip install gunicorn
gunicorn -w 4 app:appBeliebte Plattformen für den Einsatz: Heroku, DigitalOcean, AWS oder traditionelles VPS mit nginx als Reverse-Proxy.
Befund
Wir haben eine vollständige RESTful-API mit Flask erstellt, die alle wichtigen CRUD-Operationen, Fehlerbehandlung und Datenvalidierung umfasst. Flask bietet eine minimale, aber leistungsstarke Grundlage für die Erstellung von APIs beliebiger Komplexität. Die nächsten Schritte könnten das Hinzufügen einer Authentifizierung, das Dokumentieren der API mit Swagger, das Schreiben von Unit-Tests und die Leistungsoptimierung sein.
Möchten Sie Python und Webentwicklung besser verstehen?
Anlage Kodik bietet strukturierte Kurse in Python, JavaScript, API und vielen anderen Technologien. Die Schulung basiert auf praktischen Beispielen mit Schritt-für-Schritt-Erklärungen.
Schließen Sie sich unserem Telegram-Kanal, wo Sie nützliche Materialien, Programmierhinweise und Unterstützung von einer aktiven Entwickler-Community finden, die bereit ist, Ihnen in jeder Phase Ihres Lernprozesses zu helfen!
