En aquest tema, aprendrem a crear punts finals RESTful utilitzant Flask. Els punts finals RESTful són essencials per a la creació d'APIs que permeten la comunicació entre diferents aplicacions. A través d'aquests punts finals, podem realitzar operacions CRUD (Crear, Llegir, Actualitzar, Eliminar) sobre els recursos.
Conceptes Clau
Abans de començar amb la implementació, és important entendre alguns conceptes clau:
- Punt Final (Endpoint): Una URL específica que respon a una sol·licitud HTTP.
- Recurs: Una entitat que es pot accedir i manipular a través de l'API (per exemple, usuaris, articles, etc.).
- Mètodes HTTP: Els verbs HTTP (GET, POST, PUT, DELETE) que defineixen l'acció a realitzar sobre el recurs.
Configuració Inicial
Abans de començar, assegura't de tenir Flask instal·lat. Si no ho tens, pots instal·lar-lo utilitzant pip:
Creació d'una Aplicació Flask Bàsica
Comencem creant una aplicació Flask bàsica. Crea un fitxer anomenat app.py
i afegeix el següent codi:
from flask import Flask, jsonify, request app = Flask(__name__) # Dades de mostra articles = [ {'id': 1, 'title': 'Article 1', 'content': 'Contingut de l\'article 1'}, {'id': 2, 'title': 'Article 2', 'content': 'Contingut de l\'article 2'} ] @app.route('/') def home(): return "Benvingut a l'API RESTful amb Flask!" if __name__ == '__main__': app.run(debug=True)
Creació de Punts Finals RESTful
- Obtenir Tots els Articles (GET)
Afegim un punt final per obtenir tots els articles:
- Obtenir un Article per ID (GET)
Afegim un punt final per obtenir un article específic per ID:
@app.route('/articles/<int:id>', methods=['GET']) def get_article(id): article = next((article for article in articles if article['id'] == id), None) if article: return jsonify(article) else: return jsonify({'message': 'Article no trobat'}), 404
- Crear un Nou Article (POST)
Afegim un punt final per crear un nou article:
@app.route('/articles', methods=['POST']) def create_article(): new_article = { 'id': articles[-1]['id'] + 1 if articles else 1, 'title': request.json['title'], 'content': request.json['content'] } articles.append(new_article) return jsonify(new_article), 201
- Actualitzar un Article (PUT)
Afegim un punt final per actualitzar un article existent:
@app.route('/articles/<int:id>', methods=['PUT']) def update_article(id): article = next((article for article in articles if article['id'] == id), None) if article: article['title'] = request.json.get('title', article['title']) article['content'] = request.json.get('content', article['content']) return jsonify(article) else: return jsonify({'message': 'Article no trobat'}), 404
- Eliminar un Article (DELETE)
Afegim un punt final per eliminar un article:
@app.route('/articles/<int:id>', methods=['DELETE']) def delete_article(id): global articles articles = [article for article in articles if article['id'] != id] return jsonify({'message': 'Article eliminat'}), 200
Codi Complet
Aquí tens el codi complet de l'aplicació Flask amb els punts finals RESTful:
from flask import Flask, jsonify, request app = Flask(__name__) # Dades de mostra articles = [ {'id': 1, 'title': 'Article 1', 'content': 'Contingut de l\'article 1'}, {'id': 2, 'title': 'Article 2', 'content': 'Contingut de l\'article 2'} ] @app.route('/') def home(): return "Benvingut a l'API RESTful amb Flask!" @app.route('/articles', methods=['GET']) def get_articles(): return jsonify({'articles': articles}) @app.route('/articles/<int:id>', methods=['GET']) def get_article(id): article = next((article for article in articles if article['id'] == id), None) if article: return jsonify(article) else: return jsonify({'message': 'Article no trobat'}), 404 @app.route('/articles', methods=['POST']) def create_article(): new_article = { 'id': articles[-1]['id'] + 1 if articles else 1, 'title': request.json['title'], 'content': request.json['content'] } articles.append(new_article) return jsonify(new_article), 201 @app.route('/articles/<int:id>', methods=['PUT']) def update_article(id): article = next((article for article in articles if article['id'] == id), None) if article: article['title'] = request.json.get('title', article['title']) article['content'] = request.json.get('content', article['content']) return jsonify(article) else: return jsonify({'message': 'Article no trobat'}), 404 @app.route('/articles/<int:id>', methods=['DELETE']) def delete_article(id): global articles articles = [article for article in articles if article['id'] != id] return jsonify({'message': 'Article eliminat'}), 200 if __name__ == '__main__': app.run(debug=True)
Exercicis Pràctics
-
Afegir un Punt Final per Obtenir Articles per Títol:
- Crea un punt final que permeti obtenir articles filtrats per títol.
-
Afegir Validació de Dades:
- Implementa validació per assegurar-te que els camps
title
icontent
no estiguin buits quan es creï o actualitzi un article.
- Implementa validació per assegurar-te que els camps
-
Gestió d'Errors:
- Afegeix gestió d'errors per manejar situacions com sol·licituds mal formades o errors del servidor.
Resum
En aquest tema, hem après a crear punts finals RESTful utilitzant Flask. Hem cobert les operacions bàsiques CRUD i hem vist com gestionar les sol·licituds HTTP per interactuar amb els recursos. Aquests conceptes són fonamentals per a la creació d'APIs robustes i escalables. En el següent tema, explorarem com gestionar dades JSON en les nostres APIs RESTful.
Curs de Desenvolupament Web amb Flask
Mòdul 1: Introducció a Flask
- Què és Flask?
- Configuració del Teu Entorn de Desenvolupament
- Creant la Teva Primera Aplicació Flask
- Entenent l'Estructura d'una Aplicació Flask
Mòdul 2: Conceptes Bàsics de Flask
- Enrutament i Mapeig d'URL
- Gestió de Mètodes HTTP
- Renderització de Plantilles amb Jinja2
- Treballant amb Fitxers Estàtics
Mòdul 3: Formularis i Entrada d'Usuari
Mòdul 4: Integració de Bases de Dades
- Introducció a Flask-SQLAlchemy
- Definició de Models
- Realització d'Operacions CRUD
- Migracions de Bases de Dades amb Flask-Migrate
Mòdul 5: Autenticació d'Usuaris
- Registre d'Usuaris
- Inici i Tancament de Sessió d'Usuaris
- Hashing de Contrasenyes
- Gestió de Sessions d'Usuaris
Mòdul 6: Conceptes Avançats de Flask
- Blueprints per a Aplicacions Grans
- Gestió d'Errors
- Pàgines d'Error Personalitzades
- Registre i Depuració
Mòdul 7: APIs RESTful amb Flask
- Introducció a les APIs RESTful
- Creació de Punts Finals RESTful
- Gestió de Dades JSON
- Autenticació per a APIs
Mòdul 8: Desplegament i Producció
- Configuració de Flask per a Producció
- Desplegament a Heroku
- Desplegament a AWS
- Monitorització i Optimització del Rendiment
Mòdul 9: Proves i Millors Pràctiques
- Proves Unitàries amb Flask
- Proves d'Integració
- Cobertura de Proves
- Millors Pràctiques per al Desenvolupament amb Flask