User Tools

Site Tools


apuntes:aplicaciones_web

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Last revisionBoth sides next revision
apuntes:aplicaciones_web [2018/01/26 08:50] – [Utilizando WSGI] Santiago Faciapuntes:aplicaciones_web [2019/06/12 16:07] – [Añadir aplicaciones a un proyecto] Santiago Faci
Line 43: Line 43:
  
 <code bash> <code bash>
-santi@zenbook:$ pip install django+santi@zenbook:$ pip install django==1.11.8
 </code> </code>
  
Line 183: Line 183:
     'django.contrib.messages',     'django.contrib.messages',
     'django.contrib.staticfiles',     'django.contrib.staticfiles',
 +    'mis_peliculas',
 ] ]
  
Line 991: Line 992:
 username = request.POST['username'] username = request.POST['username']
     password = request.POST['password']     password = request.POST['password']
-    user = authenticate(username=username, password=password)+    user = authenticate(request, username=username, password=password)
     if user is not None:     if user is not None:
         login(request, user)         login(request, user)
Line 1055: Line 1056:
 ---- ----
  
 +===== Informes =====
  
 +Para la creación de informes con Django utilizaremos la librería [[http://www.reportlab.com|reportlab]] que permite generar ficheros PDF con lenguaje Python.
 +
 +El primer paso será instalar el paquete ''reportlab'' con la herramienta de instalación de paquetes de Python o bien desde el IDE PyCharm directamente.
 +
 +<code bash>
 +santi@zenbook:$ pip3 install reportlab
 +</code>
 +
 +A continuación se muestran algunos ejemplos de uso de esta librería para la generación de informes. Conviene tener en cuenta que en éstos, se muestra solamente el código corresponde a la función que permite crear la ''view'' que lanzará el informe al usuario. Faltaría registrar la correspondiente url en el fichero ''urls.py'' de nuestra aplicación web y también añadir un enlace o botón en la plantilla donde queramos que el usuario tenga que pinchar para visualizar este informe.
 +
 +En este primer ejemplo se creará un informe (en PDF) donde se mostrará un título y a continuación un listado con los títulos de todas las películas de la Base de Datos. En este caso utilizaremos el objeto ''Canvas'' que nos permite ubicar los elementos del informe utilizando las coordenadas x e y para situarlos. Hay que tener en cuenta que la esquina inferior izquierda se corresponde con los valores ''x=0'' e ''y=0''.
 +
 +<code python views.py>
 +. . .
 +def informe_peliculas(request):
 +    response = HttpResponse(content_type='application/pdf')
 +    response['Content-Disposition'] = 'attachment; filename="peliculas.pdf"'
 +
 +    buffer = BytesIO()
 +
 +    can = canvas.Canvas(buffer)
 +    can.drawString(200, 800, "Peliculas")
 +
 +    peliculas = Pelicula.objects.all()
 +    y = 700
 +    for pelicula in peliculas:
 +        can.drawString(50, y, pelicula.titulo)
 +        y -= 20
 +
 +    can.showPage()
 +    can.save()
 +
 +    pdf = buffer.getvalue()
 +    buffer.close()
 +    response.write(pdf)
 +
 +    return response
 +. . .
 +</code>
 +
 +En este segundo ejemplo, utilizando en este caso el objeto ''SimpleDocTemplate'', que permite añadir contenido al documento del informe si necesidad de indicar las coordenadas explicitamente. En este caso se genera una tabla (con borde) con el listado de las películas y cierta información sobre las mismas.
 +
 +<code python views.py>
 +. . .
 +def informe_peliculas(request):
 +    response = HttpResponse(content_type='application/pdf')
 +    response['Content-Disposition'] = 'attachment; filename="peliculas.pdf"'
 +
 +    buffer = BytesIO()
 +
 +    documento = SimpleDocTemplate(buffer, pagesize=A4, rigthMargin=40, leftMargin=40, topMargin=60, bootomMargin=18)
 +    contenido = []
 +    estilos = getSampleStyleSheet()
 +    cabecera = Paragraph("Listado de Películas", estilos['Heading1'])
 +    contenido.append(cabecera)
 +
 +    cabecera_tabla = ('Título', 'Género', 'Director')
 +    datos = [(pelicula.titulo, pelicula.genero, pelicula.director) for pelicula in Pelicula.objects.all()]
 +    tabla = Table([cabecera_tabla] + datos)
 +    tabla.setStyle(TableStyle([('GRID', (0, 0), (-1, -1), 1, colors.black),]))
 +
 +    contenido.append(tabla)
 +    documento.build(contenido)
 +    response.write(buffer.getvalue())
 +    buffer.close()
 +    return response
 +. . .
 +</code>
 +
 +Podéis encontrar más información en esta [[https://www.reportlab.com/docs/reportlab-userguide.pdf|Guía de reportlab]]
 ===== Internacionalización ====== ===== Internacionalización ======
  
Line 1116: Line 1188:
  
  
-==== Utilizando WSGI ====+==== Utilizando WSGI con Apache ====
  
 En este apartado veremos como desplegar una aplicación web Django con Apache usando el módulo WSGI. Para ello tendremos que realizar una serie de ajustes, instalación y configuraciones: En este apartado veremos como desplegar una aplicación web Django con Apache usando el módulo WSGI. Para ello tendremos que realizar una serie de ajustes, instalación y configuraciones:
Line 1124: Line 1196:
  
 === Ajustar parámetros en el proyecto Django === === Ajustar parámetros en el proyecto Django ===
 +
 +Antes de comenzar, tenemos que comprobar que tenemos instalado el intérprete de Python y todos los paquetes necesarios en la máquina servidor. En nuestro caso al menos los paquetes ''django'' (en nuestro caso la versión 1.11.8), ''django-widget-tweaks'' y ''Pillow'' a través del comando ''pip3 install''
 +
 +<code bash>
 +santi@zenbook:$ sudo apt-get install python3
 +. . .
 +santi@zenbook:$ sudo pip3 install django==1.11.8
 +. . .
 +santi@zenbook:$ sudo pip3 install django-widget-tweaks
 +. . .
 +santi@zenbook:$ sudo pip3 install Pillow
 +. . .
 +</code>
  
 Lo primero que haremos será reunir todos los ficheros estáticos de la aplicación con ayuda del siguiente comando, lo que generará una carpeta ''static'' en el directorio raíz de nuestro proyecto con todo el contenido estático del mismo. Lo primero que haremos será reunir todos los ficheros estáticos de la aplicación con ayuda del siguiente comando, lo que generará una carpeta ''static'' en el directorio raíz de nuestro proyecto con todo el contenido estático del mismo.
Line 1131: Line 1216:
 . . . . . .
 . . . . . .
-543 static files copied to '/home/santi/peliculas/static'+543 static files copied to '/home/santi/mispeliculas.com/static'
 </code> </code>
  
Line 1145: Line 1230:
 STATIC_ROOT = os.path.join(BASE_DIR, 'static/') STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
 # Directorio a partir del cual se almacenarán los ficheros que se suban con algún modelo (en ''items'' en este caso) # Directorio a partir del cual se almacenarán los ficheros que se suban con algún modelo (en ''items'' en este caso)
-MEDIA_ROOT = '/home/santi/peliculas/static/mispeliculas'+MEDIA_ROOT = '/home/santi/mispeliculas.com/static/mispeliculas'
 # Define los hosts que tienen permitido acceder a la aplicación web # Define los hosts que tienen permitido acceder a la aplicación web
 ALLOWED_HOSTS = ['mispeliculas.com'] ALLOWED_HOSTS = ['mispeliculas.com']
Line 1152: Line 1237:
 . . . . . .
 </file> </file>
 +
 +En el fichero ''/home/santi/mispeliculas.com/peliculas/urls.py'' podemos modificar la url raíz para acceder directamente sobre el dominio de la aplicación web, dejando el fichero asi:
 +
 +<file python peliculas/urls.py>
 +. . .
 +    url(r'^', include('mispeliculas.urls')
 +. . .
 +</file>
 +
 +De esta manera, una vez desplegada correctamente la aplicación, podremos acceder directamente a través de la url ''http://mispeliculas.com'' en vez de ''http://mispeliculas.com/peliculas'' o algo similar como teníamos desde un principio.
  
 === Instalación y configuración de Apache === === Instalación y configuración de Apache ===
Line 1172: Line 1267:
 Finalmente tendremos que crear un host virtual con las directivas habituales para un sitio alojado por Apache, al que añadiremos algunas específicas por tratarse de una aplicación web hecha con Python Finalmente tendremos que crear un host virtual con las directivas habituales para un sitio alojado por Apache, al que añadiremos algunas específicas por tratarse de una aplicación web hecha con Python
  
-<file apache /etc/apache2/sites-available/miwebapp.com.conf>+<file apache /etc/apache2/sites-available/mispeliculas.com.conf>
 <VirtualHost *:80> <VirtualHost *:80>
     ServerName mispeliculas.com     ServerName mispeliculas.com
     ServerAdmin santi@codeandcoke.com     ServerAdmin santi@codeandcoke.com
  
-    Alias /static /home/santi/peliculas/static +    Alias /static /home/santi/mispeliculas.com/static 
-    <Directory /home/santi/peliculas/static>+    <Directory /home/santi/mispeliculas.com/static>
         Require all granted         Require all granted
     </Directory>     </Directory>
  
-    <Directory /home/santi/peliculas/peliculas>+    <Directory /home/santi/mispeliculas.com/peliculas>
         <Files wsgi.py>         <Files wsgi.py>
             Require all granted             Require all granted
Line 1188: Line 1283:
     </Directory>     </Directory>
  
-    WSGIDaemonProcess peliculas python-path=/home/santi/peliculas+    WSGIDaemonProcess peliculas python-path=/home/santi/mispeliculas.com
     WSGIProcessGroup peliculas     WSGIProcessGroup peliculas
-    WSGIScriptAlias / /home/santi/peliculas/peliculas/wsgi.py+    WSGIScriptAlias / /home/santi/mispeliculas.com/peliculas/wsgi.py
  
-    ErrorLog ${APACHE_LOG_DIR}/error.log +    ErrorLog ${APACHE_LOG_DIR}/mispeliculas-error.log 
-    CustomLog ${APACHE_LOG_DIR}/access.log combined+    CustomLog ${APACHE_LOG_DIR}/mispeliculas-access.log combined
 </VirtualHost> </VirtualHost>
 </file> </file>
Line 1208: Line 1303:
  
 <code bash> <code bash>
-santi@zenbook:chmod 644 /home/santi/peliculas/db.sqlite3 +santi@zenbook:chown :www-data /home/santi/mispeliculas.com/db.sqlite3 
-santi@zenbook:chown :www-data /home/santi/peliculas/db.sqlite3 +santi@zenbook:chmod 664 /home/santi/mispeliculas.com/db.sqlite3 
-santi@zenbook:$ chown :www-data /home/santi/peliculas +santi@zenbook:$ chown :www-data /home/santi/mispeliculas.com 
-santi@zenbook:$ chmod g+w /home/santi/peliculas+santi@zenbook:$ chmod g+w /home/santi/mispeliculas.com
 </code> </code>
  
-Y ahora podrás visitar tu aplicación web Django accediendo directamente a ''http://mispeliculas.com/peliculas''+También es posible que necesitemos asignar permisos de escritura en la carpeta donde se sube el contenido través de los formularios (donde indica la variable ''MEDIA_ROOT'')
  
 +<code bash>
 +santi@zenbook:$ chown -R :www-data /home/santi/mispeliculas.com/static
 +santi@zenbook:$ chmod -R g+w /home/santi/mispeliculas.com/static
 +</code>
  
 +Y ahora podrás visitar tu aplicación web Django accediendo directamente a ''http://mispeliculas.com''
 +
 +==== Desplegar la aplicación utilizando entornos virtuales ====
 +
 +
 +<code bash>
 +santi@zenbook:$ pip3 install virtualenv
 +santi@zenbook:$ virtualenv env
 +santi@zenbook:$ source env/bin/activate
 +. . .
 +santi@zenbook:$ pip install django
 +santi@zenbook:$ pip install Pillow
 +. . .
 +santi@zenbook:$ deactivate
 +</code>
 +
 +<file apache /etc/apache2/sites-available/mispeliculas.com.conf>
 +. . .
 +    WSGIDaemonProcess peliculas python-path=/home/santi/mispeliculas.com:/home/santi/mispeliculas.com/env/lib/python3.5/site-packages
 +. . .
 +</file>
 ===== Ejercicios ===== ===== Ejercicios =====
    
Line 1246: Line 1366:
 ---- ----
  
-(c) 2017 Santiago Faci+(c) 2018 Santiago Faci
apuntes/aplicaciones_web.txt · Last modified: 2019/06/12 16:08 by Santiago Faci