Arquivos estáticos com wsgi

Um problema que pode surgir ao publicar um site/sistema em Python/Django é a configuração dos arquivos estáticos (imagens, css, scripts, etc).

Para resolver isso o manual do Django orienta o uso das varíaveis STATIC_URL e STATIC_ROOT no settings.py. Você pode encontrar as orientações aqui: https://docs.djangoproject.com/pt-br/3.0/howto/static-files/

Além disso, vc vai precisar configurar o servidor web para servir os arquivos a partir dos paths indicados no settings.py: https://docs.djangoproject.com/pt-br/3.0/howto/deployment/wsgi/modwsgi/#serving-files

Deploy em hospedagens compartilhadas

Contudo, o cenário pode ficar um pouco mais complexo quando não temos acesso aos arquivos de configuração do servidor web, como no caso de hospedagens compartilhadas, por exemplo. Para resolver tal problema a ideia começa a orbitar o wsgi – o arquivo que configura a interfacce entre o servidor web e a aplicação Python/Django. Apesar do manual do Django informar que o framework não serve arquivos estáticos, muitos acreditam que o wsgi pode fazer isso. Para isso há dois pacotes Python que podem ser usados:

Usando o pacote dj-static

No nosso caso vamos usar o dj-static. Instale no seu projeto com:

pip install dj-static

Se vc estiver em um servidor compartilhado, talvez seja necessário instalar o pacote apenas no seu diretório /home. Para isso use a opção --user:

pip install dj-static --user

Feito isso é hora de configurar o seu arquivo wsgi. Veja o exemplo abaixo:

from django.core.wsgi import get_wsgi_application
from dj_static import Cling
(...)
application = Cling(get_wsgi_application())

Para concluir basta acessar o site/sistema para verificar se os arquivos foram estáticos foram servidos. Caso contrário, verifique as variáveis STATIC_URL e STATIC_ROOT no arquivo settings.py do seu projeto.

Você já passou por esse problema em hospedagens compartilhadas? Que solução encontrou?

Referências

WSGI: https://wsgi.readthedocs.io/en/latest/what.html
PEP333 : https://www.python.org/dev/peps/pep-3333/
WSGI no Django: https://docs.djangoproject.com/pt-br/3.0/howto/deployment/wsgi/