Desenvolupament Web amb Python¶
Python ofereix diversos frameworks per construir aplicacions web. Els dos més populars són Django i Flask, amb filosofies molt diferents.
| Django | Flask | |
|---|---|---|
| Tipus | Full-stack (bateries incloses) | Microframework |
| Corba d'aprenentatge | Més pronunciada | Més suau |
| ORM | Inclòs | No inclòs (cal SQLAlchemy o similar) |
| Admin | Inclòs automàticament | No inclòs |
| Ideal per | Aplicacions complexes i grans | APIs lleugeres i prototips ràpids |
Django¶
Django és un framework web d'alt nivell que fomenta un desenvolupament ràpid i un disseny net i pragmàtic. Segueix el patró MVT (Model - View - Template) i el principi "Don't Repeat Yourself" (DRY).
Instal·lació¶
Estructura d'un projecte Django¶
mysite/
├── manage.py # Utilitat de línia de comandes del projecte
└── mysite/
├── __init__.py
├── settings.py # Configuració del projecte
├── urls.py # Enrutament principal
├── asgi.py # Punt d'entrada ASGI
└── wsgi.py # Punt d'entrada WSGI
Quan s'afegeix una aplicació (p. ex. polls):
mysite/
└── polls/
├── __init__.py
├── admin.py # Registre de models a l'admin
├── apps.py # Configuració de l'app
├── models.py # Models de la base de dades
├── tests.py # Tests
├── urls.py # Enrutament de l'app
└── views.py # Lògica de les vistes
Crear un projecte nou¶
Executar el servidor de desenvolupament¶
Exemple inclòs: mysite/¶
El projecte mysite és el tutorial oficial de Django amb una aplicació de votacions (polls).
mysite/urls.py — enrutament principal:
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls),
]
polls/urls.py — enrutament de l'app:
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
polls/views.py — vista senzilla:
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")
Un cop en marxa el servidor, visita http://127.0.0.1:8000/polls/ per veure la resposta.
Conceptes clau de Django¶
Models — defineixen l'estructura de la base de dades:
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
Migracions — sincronitzen els models amb la base de dades:
Admin — interfície d'administració automàtica:
Templates — fitxers HTML amb sintaxi de Django:
{% if latest_question_list %}
<ul>
{% for question in latest_question_list %}
<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}
Comandaments habituals de manage.py¶
| Comandament | Descripció |
|---|---|
runserver |
Arrenca el servidor de desenvolupament |
startapp <nom> |
Crea una nova aplicació |
makemigrations |
Genera els fitxers de migració |
migrate |
Aplica les migracions a la base de dades |
createsuperuser |
Crea un usuari administrador |
shell |
Obre una shell interactiva de Django |
test |
Executa els tests |
Flask¶
Flask és un microframework lleuger i flexible. No imposa cap estructura ni components — tu tries les eines que necessites. Ideal per a APIs REST, serveis petits i prototips.
Instal·lació de Flask¶
Hola món amb Flask¶
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Hola, món!'
if __name__ == '__main__':
app.run(debug=True)
Rutes i paràmetres¶
@app.route('/usuari/<nom>')
def saluda(nom):
return f'Hola, {nom}!'
@app.route('/suma/<int:a>/<int:b>')
def suma(a, b):
return f'{a} + {b} = {a + b}'
Mètodes HTTP¶
from flask import request
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
usuari = request.form['usuari']
return f'Benvingut, {usuari}!'
return '''
<form method="post">
<input name="usuari">
<input type="submit" value="Entra">
</form>
'''
Retornar JSON (API REST)¶
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/api/productes')
def productes():
data = [
{'id': 1, 'nom': 'Ordinador', 'preu': 999},
{'id': 2, 'nom': 'Ratolí', 'preu': 25},
]
return jsonify(data)
Templates amb Jinja2¶
Flask usa Jinja2 com a motor de templates (el mateix que Django):
from flask import render_template
@app.route('/salutacio/<nom>')
def salutacio(nom):
return render_template('salutacio.html', nom=nom)
<!-- templates/salutacio.html -->
<!DOCTYPE html>
<html>
<body>
<h1>Hola, {{ nom }}!</h1>
{% if nom == 'admin' %}
<p>Tens accés d'administrador.</p>
{% endif %}
</body>
</html>
Comparació de rutes: Django vs Flask¶
| Concepte | Django | Flask |
|---|---|---|
| Definir una ruta | path('ruta/', views.func) a urls.py |
@app.route('/ruta/') al fitxer principal |
| Paràmetre de ruta | path('item/<int:pk>/', ...) |
@app.route('/item/<int:pk>') |
| Vista | Funció o classe a views.py |
Funció decorada |
| Template | render(request, 'tmpl.html', ctx) |
render_template('tmpl.html', **ctx) |
| JSON | JsonResponse(data) |
jsonify(data) |