Esta pagina se ve mejor con JavaScript habilitado

Django Venv bajo FreeBSD

 ·  🎃 kr0m

Django es un framework de desarrollo web escrito en Python, este sigue el patrón de diseño modelo–vista–template (MVT), sus principales características son simplicidad, flexibilidad, fiabilidad y escalabilidad. Django proporciona todos los mecanismos necesarios para la programación web de un sitio, acceso a bases de datos, traducciones, lenguaje de templates entre otras características. Además este proporciona de forma automática un interrfaz de administración de contenidos, esta permite la creación, actualización y eliminación de objetos, llevando un registro de todas las acciones realizadas y proporciona una interfaz para administrar los usuarios y los grupos de usuarios.

Para ilustrar todo el proceso de desarrollo web en Django vamos a crear un proyecto llamado rxWodProject, se trata de una aplicación de planificación de rutinas de entrenamiento.

Esta utilizará PostgreSQL como base de datos, podríamos empezar utilizando SQLite si lo deseamos pero la posterior migración de datos puede llegar a resultar traumática.

Consultamos las versiones disponibles en los repositorios de FreeBSD:

pkg search postgresql|grep '\-server'

postgresql10-server-10.15 PostgreSQL is the most advanced open-source database available anywhere  
postgresql11-server-11.10 PostgreSQL is the most advanced open-source database available anywhere  
postgresql12-server-12.5 PostgreSQL is the most advanced open-source database available anywhere  
postgresql13-server-13.1_1 PostgreSQL is the most advanced open-source database available anywhere  
postgresql95-server-9.5.24 PostgreSQL is the most advanced open-source database available anywhere  
postgresql96-server-9.6.20 PostgreSQL is the most advanced open-source database available anywhere

Instalamos la versión deseada:

pkg install postgresql13-server

Añadimos PostgreSQL al arranque:

sysrc postgresql_enable="YES"

Inicializamos la base de datos:

/usr/local/etc/rc.d/postgresql initdb

Arrancamos el servicio:

service postgresql start

Por defecto PostgreSQL utiliza el esquema de autenticación “peer authentication” para las conexiones locales, basicamente significa que si el nombre de un usuario del SO coincide con el nombre de un usuario de PostgreSQL este usuario puede acceder a la cli de PostgreSQL sin autenticación.

su - postgres
psql

Creamos el usuario de acceso de la aplicación web:

CREATE USER rxwod_user WITH PASSWORD 'PASSWORD';  
ALTER ROLE rxwod_user SET client_encoding TO 'utf8';  
ALTER ROLE rxwod_user SET default_transaction_isolation TO 'read committed';  
ALTER ROLE rxwod_user SET timezone TO 'UTC+1';

Creamos la base de datos indicando el propietario:

CREATE DATABASE rxwod WITH OWNER rxwod_user;

Listamos las bases de datos:

\l
                               List of databases
   Name    |   Owner    | Encoding | Collate |  Ctype  |   Access privileges   
-----------+------------+----------+---------+---------+-----------------------
 postgres  | postgres   | UTF8     | C       | C.UTF-8 | 
 rxwod     | rxwod_user | UTF8     | C       | C.UTF-8 | 
 template0 | postgres   | UTF8     | C       | C.UTF-8 | =c/postgres          +
           |            |          |         |         | postgres=CTc/postgres
 template1 | postgres   | UTF8     | C       | C.UTF-8 | =c/postgres          +
           |            |          |         |         | postgres=CTc/postgres
(4 rows)

Asignamos los permisos necesarios y salimos:

GRANT ALL PRIVILEGES ON DATABASE rxwod TO rxwod_user;  
\q  
exit

Comprobamos el acceso:

psql -U rxwod_user rxwod

rxwod=> \conninfo  
You are connected to database "rxwod" as user "rxwod_user" via socket in "/tmp" at port "5432".

Instalamos Python y las dependencias básicas:

pkg install python37 py37-sqlite3 py37-pip py37-virtualenv

Generamos el entorno virtual desde la cuenta de un usuario regular, si no estás familiarizado con los entornos virtuales de Python te recomiendo este artículo :

python3.7 -m venv rxWod

Activamos el entorno virtual:

cd rxWod
source bin/activate

Mientras permanezcamos en el Venv aparecerá un prompt diferente:

(rxWod) Garrus $ ~/rxWod>

Voy a omitir dicho prompt para que sea mas sencillo copiar y pegar los comandos del manual.

Instalamos Django, SQLite y psycopg2 dentro del entorno virtual:

pip install Django pysqlite3 psycopg2

Si tenemos una versión desactualizada de pip puede que nos pida actualizarla:

WARNING: You are using pip version 20.1.1; however, version 21.0.1 is available.
You should consider upgrading via the ‘/usr/home/kr0m/rxWod/bin/python3.7 -m pip install –upgrade pip’ command.

Actualizamos:

/usr/home/kr0m/rxWod/bin/python3.7 -m pip install –upgrade pip

El comando pip freeze nos muestra las versiones de las librerias instaladas actualmente:

pip freeze

asgiref==3.3.1  
Django==3.1.7  
psycopg2==2.8.6  
pytz==2021.1  
sqlite3==0.0.0  
sqlparse==0.4.1  
Tkinter==0.0.0

Comprobamos que tengamos Django instalado:

python

>>> import django
>>> print(django.get_version())
3.1.7
>>> quit()

Creamos el proyecto:

django-admin startproject rxWodProject

Nos habrá generado la siguiente estructura de directorios:

tree rxWodProject

|-- manage.py  
`-- rxWodProject  
    |-- __init__.py  
    |-- asgi.py  
    |-- settings.py  
    |-- urls.py  
    `-- wsgi.py

Generamos el fichero requirements en base a las versiones instaladas de este modo si alguien clona nuestro repositorio tan solo deberá instalar las dependencias con: pip install -r requirements.txt

cd rxWodProject/
pip freeze > requirements.txt

Comprobamos que funcione el proyecto:

python manage.py runserver

Watching for file changes with StatReloader  
Performing system checks...  
System check identified no issues (0 silenced).  
You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.  
Run 'python manage.py migrate' to apply them.  
February 28, 2021 - 12:27:04  
Django version 3.1.7, using settings 'rxWodProject.settings'  
Starting development server at http://127.0.0.1:8000/  
Quit the server with CONTROL-C.

Por ahora podemos ignorar la advertencia sobre migraciones pendientes en la base de datos.

Debemos tener en cuenta que este servidor es solo para uso en fase de pruebas, en la web de Django insisten e insisten en que no se utilice como servidor en producción:

Don’t use this server in anything resembling a production environment. It’s intended only for use while developing. (We’re in the business of making Web frameworks, not Web servers.)

Accedemos a la app vía web:
http://127.0.0.1:8000/

En este artículo tan solo hemos arañado la superficie ya que solo hemos dejado preparada la base de datos para su posterior uso, creado en entorno virtual y creado el proyecto de Django, en posteriores artículos crearemos una app dentro del proyecto e indagaremos sobre la gestión de la base de datos.

Si te ha gustado el artículo puedes invitarme a un RedBull aquí