- Preparar el entorno de desarrollo
- Creación del proyecto y aplicaciones web
- Configuración de las url en apache2
- Configuración de los proyectos en Django
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 aplicacionesCreació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 webpython manage.py startapp web
Y la APIpython manage.py startapp api
Quedaría mas o menos así: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 apache2Instalar 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
Y la estructura del proyecto quedaría asi:
Y ... siguiendo estos mismos pasos se pueden ir añadiendo mas aplicaciones web o APIs.
Y esto es todo, feliz programming
Saludos
Alex.
/