Instalar entorno de producción de python

Una vez hemos desarrollado una aplicación con django nos interesará ponerla en producción. La forma correcta de hacerlo es usando uwsgi + nginx. Así que vamos a ello.

Mi aplicación corre sobre postgresql así que instalaremos los siguientes paquetes

# apt -y install nginx uwsgi uwsgi-plugin-python3 postgresql python3-psycopg2 libpq-dev git virtualenv memcached

Creamos el usuario y la base de datos postgresql

# su - postgres
$ createuser colibri_user
$ createdb -O colibri_user colibri_db
$ psql colibri_db
colibri_db=# alter user colibri_user with encrypted password 'XXXXXXXX';
colibri_db=# grant all privileges on database colibri_db to colibri_user;

Ahora clonamos el código del programa en /var/www

# cd /var/www/
# git clone git@git.capa8.net:blackhold/colibri.git

Creo el entorno virtual

# cd colibri
# virtualenv -p python3 venv

Entro en el entorno virtual y ejecuto los comandos necesarios para iniciar la aplicación

# source venv/bin/activate
# pip install -r requirements.txt
# ./clean.sh
# python manage.py runserver 0.0.0.0:5001

Ahora configuramos uwsgi para que apunte donde está nuestra aplicación de django

# cd /etc/uwsgi/apps-available
# vi colibri.ini
[uwsgi]
master = true
processes = 10
socket = /tmp/uwsgi-colibri.sock
uid = www-data
gid = www-data

;# with appropriate permissions - *may* be needed
;chmod-socket    = 664

chdir = /var/www/colibri
module = colibri.wsgi
home = /var/www/colibri/venv/
vacuum = true
env = DJANGO_SETTINGS_MODULE=colibri.settings
safe-pidfile = /tmp/uwsgi-colibri.pid
;harakiri = 20 # respawn processes taking more than 20 seconds
;limit-as = 128 # limit the project to 128 MB
max-requests = 5000
daemonize = /var/log/uwsgi/colibri.log
;callable = application
plugin = python37

Guardamos y lo activamos en …

Pyocclient: Apuntes

Abro éste post para ampliar un poco como se usa pyoocclient, una librería de python para gestionar un nextcloud. En éste post voy a mostrar como he solucionado el tema de crear directorios, subir ficheros, compartir ficheros, descargar un fichero (binario) y eliminar ficheros, pero la librería permite incluso hacer gestión de usuarios y algunas cosas mas, realmente da para seguir jugando :) En página podéis ver el código de la librería.…

Enviar correos electrónicos por SMTP+TLS con python

Pues otra espinita que llevaba unos días clavada sacada! :)

Con uno de los programas que estoy haciendo necesitaba mandar un correo electrónico para hacer la verificación de correo electrónico y activación posterior del usuario. Me puse con ello pero los ejemplos que encontraba requería poner la configuración del correo electrónico en el código en lugar de cogerlo de la base de datos, además estaba dando problemas de autenticación con el servidor, cosa que entre que mi código estaba mal y la configuración con el servidor era errónea no se mandaban los mensajes, en el servidor salía el error feúcho:

Error: dict-client: server returned failure:

Así que para implementar ésto sólo vamos a tocar los ficheros de mi proyecto almacenado en ~/dev/ (mi entorno de desarrollo, en producción lo suelo dejar bajo /var/www/ o /var/www/html/).

en ~/dev/capa8/ es donde almaceno los settings.py y las url.py
en ~/dev/web/ es donde almaceno el código de mi programa
~/dev/ es pues donde está mi manage.py de django

Vamos a ver pues el código de urls.py almacenado en capa8, vamos a ver la página de registro de usuario y de validación del correo electrónico:

# vi capa8/urls.py
############
# /account/
# account patterns
urlpatterns += [
    ...
    path('create', views_account.create, name='create'),
    path('verify/<str:token>', views_account.verify_mail, name='verify'),
    ...
]

Ambas funciones las vamos a buscar en el fichero que está en web/views_account.py, pero primero editaremos el web/views.py que es donde voy a crear la función a la que le pasaremos la dirección donde queremos enviar el correo, el …

Arreglando modelos con django sobre postgresql

Éstos días estaba atascada con los modelos, como soy novata con todo ésto y para ponerlo mas difícil todavía sobre postgresql! así que una chuletilla por cuando se me de por empezar a toquetear los modelos y empiecen a salir errores raros que te joden por todos lados. Por supuesto en el entorno en el que estoy trabajando es de desarrollo y estas burradas en entornos de producción es necesario exportar los datos y luego importarlos.

Primero de todo, para cualquier instancia de python que esté usando la base de datos postgresql y reinicia postgresql.

# service postgresql restart
# su - postgres

Ahora nos podemos encontrar con dos cosas, primero, que queramos reconstruir la base de datos o que simplemente queramos eliminar el contenido relacionado con un modelo.

Recrear base de datos

postgres@server:~$ dropdb wcli_db
postgres@server:~$ createdb wcli_db

Eliminar contenido referente a un modelo

postgres@server:~$ psql wcli_db
psql (9.6.10)
Type "help" for help.

wcli_db=# DROP TABLE web_voucher CASCADE;
NOTICE:  drop cascades to constraint web_payment_id_voucher_id_c75a11d9_fk_web_voucher_id on table web_payment
DROP TABLE

Con el CASCADE le indicamos que borre todas las vistas y constraints vinculadas a la tabla.…

Crear entorno virtualenv de python3.5

Si usamos virtualenv a secas nos creará un entorno virtual de python2 y python3, pero en mi caso me interesa usar python3.5 para una aplicación que estoy haciendo. Así que hoy veremos como instalar y entrar en un entorno virtual de python.

Primero de todo, python es fácilmente extendible con módulos, los módulos son librerías que han programado otros y que hacen cosas, yo los llamo chinos, porque una vez compiladas, las librerías son binarios y si los editas con un editor de textos lo que ves es un galimatías de carácteres, lo comúnmente llamado “chinos”.
Ésta forma de programar nos permite avanzar mucho mas rápido en el desarrollo de nuestra aplicación, destinando nuestro tiempo a programar lo que hace realmente nuestra aplicación y facilitar el trabajo a la creación de por ejemplo la estructura de la página web con Flask y Bootstrap o un framework como django.

Los módulos las instalamos mediante un gestor de paquetes, como en cualquier distribución de gnu/linux, podemos especificar pip para python2 y pip3 para python3 o python3.5, ésto lo que hace es descargarte el módulo en el directorio /usr/local/lib/python3.5/dist-packages, con pip3 show podemos ver información del módulo:

laura@melatonina:/usr/src$ pip3 show flask
Name: Flask
Version: 1.0.2
Summary: A simple framework for building complex web applications.
Home-page: https://www.palletsprojects.com/p/flask/
Author: Armin Ronacher
Author-email: armin.ronacher@active-4.com
License: BSD
Location: /usr/local/lib/python3.5/dist-packages
Requires: Jinja2, click, itsdangerous, Werkzeug

Si necesitas saber qué hace el módulo, es tan simple como ir al directorio correspondiente y editar el fichero .py correspondiente al módulo.…