Instalar Django
pip3 install django==2.2.2
Crear proyecto contenedor
django-admin startproject mi_proyecto
mi_proyecto es el proyecto contenedor **init**.py convierte una carpeta en un módulo Python, cada paquete en Python contiene un archivo \_\_init\_\_.py settings.py es el archivo de configuración principle del framework Django urls.py es el archivo de configuración de rutas de Django manage.py es una herramienta de gestión de comandos para administrar el proyecto Django y sus operaciones como inicio, cierre y migración de datos Para iniciar Django con python3, modifique el archivo manage.py ```
#!/usr/bin/env python
"""Herramienta de línea de comandos de Django para tareas administrativas."""
import os
import sys
# Nuevo contenido
import pymysql
pymysql.install_as_MySQLdb()
# Nuevo contenido
def main():
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mi_proyecto.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"No se pudo importar Django. ¿Está instalado y "
"disponible en la variable de entorno PYTHONPATH? ¿Olvidó "
"activar un entorno virtual?"
) from exc
execute_from_command_line(sys.argv)
if __name__ == '__main__':
main()
### Crear aplicación Modificar el archivo mi_proyecto/settings.py ```
Contenido comentado
Base de Datos
https://docs.djangoproject.com/en/2.2/ref/settings/#databases
#DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
#}
Contenido comentado
Nuevo contenido
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mi_base_datos', 'USER': 'usuario', 'PASSWORD': 'contraseña', 'HOST': '127.0.0.1', 'PORT': '', 'OPTIONS': { "init_command": "SET sql_mode='STRICT_TRANS_TABLES'", # Modo estricto }, 'init_command': 'SET storage_engine=INNODB,' 'SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED, autocommit=1, names "utf8";', } }
Nuevo contenido
Crear aplicación proyecto ```
python3 ./manage.py startapp escanear_red
models.py archivo modelo, usado para operaciones en la base de datos views.py archivo de vistas, que actúa como controlador para procesamiento lógico migrations directorio, guarda archivos temporales para migraciones Construcción de modelos ---------- ### Configuración del archivo settings Ver ruta base ```
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(file))) print("...........................{}".format(BASE_DIR))
Agregar aplicación escanear_red al archivo de configuración ```
# Definición de Aplicaciones
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'escanear_red', # Nueva configuración de aplicación
]
### Modelado de modelos Enlace de referencia #### Edición del archivo models.py ```
#codificación=utf-8
from django.db import models
Crear tus modelos aquí.
class DireccionIP(models.Model): ip = models.CharField(max_length=40, default='',verbose_name=u'dirección IP',null=True) tiempo = models.DateTimeField(verbose_name=u'fecha actualización', auto_now=True)
class Meta:
verbose_name =u'tabla información dirección IP usuario'
verbose_name_plural = verbose_name
db_table = 'direccionip'
class InfoNavegador(models.Model): navegador = models.CharField(max_length=255,default='',verbose_name=u'información agente navegador usuario',null=True) models.CharField(max_length=256,verbose_name=u'ID dispositivo único',default=u'') direccion_ip = models.ForeignKey(to='DireccionIP',related_name='direccion_ip',on_delete=models.CASCADE)
class Meta:
verbose_name =u'tabla información navegador usuario'
verbose_name_plural = verbose_name
db_table = 'infonavegador'
\#### Crear base de datos ```
mysql -uroot -proot -e "create database mi_base_datos;"
# Permitir acceso desde 127.0.0.1
mysql -uroot -proot -e "grant all on mi_base_datos.* to usuario@'127.0.0.1' identified by 'contraseña';"
# Permitir acceso externo
mysql -uroot -proot -e "grant all on mi_base_datos.* to usuario@'%' identified by 'contraseña';"
mysql -h127.0.0.1 -uusuario -pcontraseña -e "show databases;"
#### Tipos de campos: CharField: campo de cadena IntegerField: campo de tipo entero DateTimeField: campo de fecha y hora ForeignKey: define relación uno a muchos #### Migraciones Comando de migración ```
python3 ./manage.py makemigrations python3 ./manage.py migrate
Consultar en la base de datos ```
MariaDB [mi_base_datos]> show create table infonavegador\G;
*************************** 1. row ***************************
Table: infonavegador
Create Table: CREATE TABLE `infonavegador` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`navegador` varchar(255) DEFAULT NULL,
`direccion_ip_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `infonavegador_direccion_ip_id_f280e3ca_fk_direccionip_id` (`direccion_ip_id`),
CONSTRAINT `infonavegador_direccion_ip_id_f280e3ca_fk_direccionip_id` FOREIGN KEY (`direccion_ip_id`) REFERENCES `direccionip` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
ERROR: No query specified
MariaDB [mi_base_datos]> show create table direccionip\G;
*************************** 1. row ***************************
Table: direccionip
Create Table: CREATE TABLE `direccionip` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ip` varchar(40) DEFAULT NULL,
`tiempo` datetime(6) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
### Diseño del proyecto ### Desarrollo del proyecto #### Interfaz de recolección No. | url | Vista | - | :-: | :-: | 1 | http://127.0.0.01/enviar_info | info_usuario | Sugerencia: En el archivo settings, permitir que todos los hosts accedan al servicio debe estar habilitado ```
ALLOWED_HOSTS = ['*']
mi_proyecto/urls.py ```
from django.contrib import admin
from django.urls import path
from escanear_red.views import *
urlpatterns = [
path('admin/', admin.site.urls),
path('enviar_info/',info_usuario),
]
escanear_red/views.py ```
from django.shortcuts import render from django.http import JsonResponse, HttpResponse from escanear_red.models import * import json
Crear tus vistas aquí.
def info_usuario(request): ip_dir = request.META['REMOTE_ADDR'] ua_usuario = request.META['HTTP_USER_AGENT']
obj_usuario = DireccionIP.objects.filter(ip = ip_dir)
if not obj_usuario:
res = DireccionIP.objects.create(ip = ip_dir)
id_ip = res.id
else:
id_ip = obj_usuario[0].id
InfoNavegador.objects.create(navegador = ua_usuario,direccion_ip_id = id_ip )
resultado = {
"ESTADO":"éxito",
"INFO":"Información usuario",
"IP":ip_dir,
"UA":ua_usuario
}
return HttpResponse(json.dumps(resultado), content_type = "application/json")
Primer proyecto DevOPS ----------- Módulo de registro de Django ----------------- Envío de correos electrónicos con Django ---------- </div>