Salta el contingut

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ó

pip install django

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

django-admin startproject mysite
cd mysite
python manage.py startapp polls

Executar el servidor de desenvolupament

python manage.py runserver
# Disponible a http://127.0.0.1:8000/

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:

python manage.py makemigrations
python manage.py migrate

Admin — interfície d'administració automàtica:

python manage.py createsuperuser
# Accedeix a http://127.0.0.1:8000/admin/

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

pip install 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)
python app.py
# Disponible a http://127.0.0.1:5000/

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)

Recursos