Publicidad

Como tener múltiples webs con un solo proyecto de Django


Por Alex el 23/01/2024, Comentar el artículo

Comparte este artículo:      




Con un solo proyecto de Django podemos tener diferentes dominios enlazados cada uno a su proyecto, a su url, podemos tener una web y una API en el mismo proyecto y compartir código y versión de framework, por ejemplo ...


Los pasos a seguir son muy sencillos de implementar:



Preparar el entorno de desarrollo

Bueno, aquí poco tengo que contar que cada uno trabaje con el entorno que mas le guste:

  • Entornos virtuales con Python
  • Con docker
  • Con vagrant

Esta última va a ser mi elección, un entorno virtual con vagrant donde instalare todos los requisitos para que funcione correctamente Python y Django.

A nivel de servidor instalaremos los paquetes

sudo apt-get install python3-venv python3-dev apache2-dev libmysqlclient-dev libapache2-mod-wsgi-py3 libpq-dev

Y a nivel de entorno de Python, si utilizais docker o vagrant no es necesario usar entornos virtuales.

pip install django ConfigParser dj-database-url mysqlclient mod_wsgi psycopg2

Y una vez instalados los requerimientos creamos el proyecto y las aplicaciones


Creación del proyecto y aplicaciones web

Y esto lo hacemos dentro de un directorio que nos creemos, por ejemplo, blogs, dentro de este directorio creamos el proyecto llamado mainp:

django-admin startproject mainp .

Y creamos las dos aplicaciones, la aplicación web

python manage.py startapp web

Y la API

python manage.py startapp api

Quedaría mas o menos así:

Estructura de los directorios de los proyectos en Django

Y ahora lo que toca es configurarlas primero en apache y después en Django


Configuración de las url en apache2

Voy a suponer que ya tenéis instalado y configurado apache2 y sino lo tenéis o sabéis como hacer os dejo unos vídeos para instalar un entorno LAMP donde encontrareis la instalación y configuración de apache2

Instalar un servidor LAMP
Listado de artículos sobre apache2

Dicho esto os dejo la configuración de los virtualhosts de Apache2 para el Web


# Virtualhosts para el web

<VirtualHost *:80>

  ServerName blog-web.local

  DocumentRoot /home/vagrant/netveloper/blogs

  WSGIDaemonProcess app_web python-path=/home/vagrant/netveloper/blogs
  WSGIProcessGroup app_web
  WSGIScriptAlias / /home/vagrant/netveloper/blogs/mainp/wsgi.py

 <Directory /home/vagrant/netveloper/blogs>
     <Files wsgi.py>
        WSGIScriptReloading On
        Require all granted
     </Files>
 </Directory>

  Alias /static /home/vagrant/netveloper/blogs/web/static
  <Directory //home/vagrant/netveloper/blogs/web/static>
      Require all granted
  </Directory>

  ErrorLog ${APACHE_LOG_DIR}/error_web.log
  CustomLog ${APACHE_LOG_DIR}/access_web.log combined
</VirtualHost>

# Virtualhosts para la API

<VirtualHost *:80>

  ServerName blog-api.local

  DocumentRoot /home/vagrant/netveloper/blogs

  WSGIDaemonProcess app_api python-path=/home/vagrant/netveloper/blogs
  WSGIProcessGroup app_api
  WSGIScriptAlias / /home/vagrant/netveloper/blogs/mainp/wsgi.py

 <Directory /home/vagrant/netveloper/blogs>
     <Files wsgi.py>
        WSGIScriptReloading On
        Require all granted
     </Files>
 </Directory>

  Alias /static /home/vagrant/netveloper/blogs/api/static
  <Directory //home/vagrant/netveloper/blogs/api/static>
      Require all granted
  </Directory>

  ErrorLog ${APACHE_LOG_DIR}/error_api.log
  CustomLog ${APACHE_LOG_DIR}/access_api.log combined
</VirtualHost>


Una vez puesto este código en un fichero y enlazado en el directorio de Apache2 /etc/apache2/sites-enabled/ vamos a configurar los proyectos de django, tanto el Web como la API para que respondan a sus respectivas urls.


Configuración de los proyectos en Django

Seguidos estos pasos que no es mas que crear un proyecto normal en Django ahora vamos a crear los ficheros y configurar lo necesario para que responda cada proyecto a su url correspondiente.

Lo primero que haremos es crearnos un nuevo fichero, un middleware en el proyecto princiapl (mainp) que será quien redirija nuestro trafico a los diferentes proyectos, diferentes si, porque en el ejemplo son dos proyectos pero podéis tener n.

El fichero middleware.py

def domain_routing_middleware(get_response):
    
  def middleware(request):
    
    host = request.get_host()
    if host == 'blog-web.local':
        request.urlconf = 'web.urls'
    elif host == 'blog-api.local':
        request.urlconf = 'api.urls'

    response = get_response(request)
    return response

  return middleware



En este archivo, dependiendo de la url con la que se este entrando, cargará el fichero urls.py correspondiente a cada proyecto, que previamente nosotros hemos seteado en el código.

El fichero de urls del proyecto principal lo dejamos como esta, no lo tocamos.

Ahora toca configurar el proyecto desde el fichero settings.py, primero añadimos los hosts permitidos a acceder al proyecto.

ALLOWED_HOSTS = [ '*']


He puesto un * porque esta en desarrollo y asi me facilita la vida pero en producción solo poner las urls permitidas, por ejemplo, en este caso serian 'blog-web.local' y 'blog-api.local'

También añandimos las dos aplicaciones que forman el proyecto

INSTALLED_APPS = [
   # Other apps
    'web',
    'api',
]


Y añadimos el middleware recien creado, domain_routing_middleware

MIDDLEWARE = [
    # Other middleware
    'mainp.middleware.domain_routing_middleware'
]


Ahora en cada una de las aplicaciones, en el web y en la API creamos el fichero urls.py, uno en cada proyecto con el siguiente contenido:

from django.urls import path
from .views import index

urlpatterns = [
    path('', index, name="index"),
]


Y en el fichero views.py poneis este código:
En el proyecto web:

from django.shortcuts import render
from django.core.serializers import serialize
from django.http import HttpResponse, JsonResponse

def index(request):
  return JsonResponse({'mensaje': 'Hola Mundo desde el WEB'})


Y en el proyecto API, ponemos el mismo pero Hola desde API

from django.shortcuts import render
from django.core.serializers import serialize
from django.http import HttpResponse, JsonResponse

def index(request):
  return JsonResponse({'mensaje': 'Hola Mundo desde el API'})


Y con esto ya estaría todo y podríamos probar las urls en el navegador

Resultado final de los proyectos Django en el navegador

Y la estructura del proyecto quedaría asi:

Estructura del proyecto Django con dos aplicaciones

Y ... siguiendo estos mismos pasos se pueden ir añadiendo mas aplicaciones web o APIs.

Y esto es todo, feliz programming
Saludos
Alex.
/


Si te ha gustado el artículo compartelo en:      




Añadir un comentarios:

Nombre:
Email: (no se publica el email)




SIGUENOS EN

ARCHIVO

Publicidad

.