Taula de continguts

Django en producció a Railway.app

Railway.app és un PaaS similar a Heroku o altres que ens facilita la posada en producció d'aplicacions web.

Per posar en producció un app Django, però, el procés és un xic més complex que amb altres frameworks.

Referències:

, , , , , , , , , , , , , ,


Tutorial bàsic

Aquest tutorial de Django en Railway funciona a data de Maig de 2023 amb Django 4.2


Setup BD

A part de la pujada de codi que hem fet anteriorment, ens faltarà:

  1. Fer les migracions
  2. Recollir arxius estàtics
  3. Crear un superusuari d'inici. Aquest post ens ajudarà per integrar-ho al Build Command.
  4. Crear dades de mostra amb Faker o altres que haguem pogut fer.

Per realitzar això caldrà anar a

Settings -> Build Command

I hi posarem les instruccions per a que tot funcioni:

. /opt/venv/bin/activate && mkdir static && python3 manage.py collectstatic && python3 manage.py migrate && DJANGO_SUPERUSER_USERNAME=super DJANGO_SUPERUSER_PASSWORD=P@ssw0rd python3 manage.py createsuperuser [email protected] --noinput

Això sí, un cop posat en producció, entra i posa-hi una password més segura.

Si hem fet una comanda personalitzada per crear dades amb el Faker, es pot afegir a la comanda indicada més amunt. Per exemple, si has seguit l'exercici Django Lliga pots afegir la la comanda:

python3 manage.py crea_lliga "Lliga 1a divisió"


Servir arxius estàtics

Si encara que fem el collectstatic no ens aparèixen els static files (css, imatges, etc.) podem forçar Django a servir-los. No és el més eficient, però per fer un desplegament de prova o de mostra pot ser una solució raonable.

Aquest post explica com servir static files amb Django.

Només cal tocar l'arxiu urls.py i afegir la darrera línia d'aquest exemple (amb els imports pertinents):

urls.py
from django.contrib import admin
from django.urls import include,path
from django.conf.urls.static import static
from django.conf import settings
 
from lliga.views import profile
 
urlpatterns = [
    path('admin/', admin.site.urls),
    path('myapp/', include('myapp.urls')),
    path("accounts/", include("django.contrib.auth.urls")),
    path("accounts/profile/", profile, name="profile"),
 
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)