Documente Academic
Documente Profesional
Documente Cultură
Resumen
Este documento está basado en el paper del proyecto «MVCGI: Modelo de
Implementación Estándar para arquitecturas MVC modulares en programas de
interfaz CGI» publicado en diciembre de 2016 , en el cual se propone un modelo
arquitectónico para la implementación de arquitecturas MVC modulares en
programas CGI, centrado en la seguridad.
Contexto
CGI (Common Gateway Interfaz) es definido en la RFC3875 como una interfaz
sencilla para ejecutar programas bajo servidores HTTP de forma independiente a
la plataforma (Robinson & Coard, 2004), proponiendo un mecanismo de
comunicación entre la aplicación y el servidor que facilita la independencia de
ambos.
Procedimiento
1. Creación del File System
MVCGI propone la siguiente estructura de archivos y directorisos (file system):
rootsystem/
├── [drwxr-xr-x] application/
│ ├── [drwxr-xr-x] core/
│ │ └── [drwxr--r--] __init__.py
│ ├── [drwxr-xr-x] modules/
│ │ └── [drwxr--r--] __init__.py
│ ├── [-rw-r--r--] __init__.py
│ ├── [-rw-r--r--] config.py
│ ├── [-rwxr-xr-x] xfc.py*
│ └── [-rw-r--r--] settings.py
└── [drwxr-xr-x] static/
Directorio de aplicación:
Destinado a nuclear los archivos fuente de la aplicación y mantenerlos
separados del contenido estático.
Archivo de configuración
Variables de configuración específica de la aplicación.
Directorio estático
Destinado a nuclear archivos estáticos y binarios no ejecutables.
#!/usr/bin/env python
#-*- coding: utf-8 -*-
if isfile(MODULE_PATH):
modulo = __import__(PACKAGE, fromlist=[CONTROLLER])
controller = getattr(modulo, CONTROLLER)()
error_module = False
if error_module or error_resource:
error_header = "{}{}\n".format(HTTP_404, HTTP_HTML)
print error_header if SHOW_ERROR_404 else HTTP_REDIRECT
<VirtualHost *:80>
ServerName <hostname>.local
DocumentRoot /<project-path>/rootsystem
ErrorLog /<project-path>/logs/error.log
CustomLog /<project-path>/logs/access.log combined
<Directory "/<project-path>/rootsystem">
Options -Indexes
AllowOverride None
RewriteEngine On
RewriteRule !(^static) application/xfc.py
</Directory>
<Directory "/<project-path>/rootsystem/application">
Options +ExecCGI -Indexes
<FilesMatch "\.py$">
setHandler cgi-script
</FilesMatch>
</Directory>
<Directory "/<project-path>/rootsystem/static">
Options -Indexes
AllowOverride None
</Directory>
</VirtualHost>
class Modulo(object):
pass
class ModuloView(object):
def vista(self):
print HTTP_HTML
print ""
print "Hola Mundo"
class ModuloController(object):
def __init__(self):
self.model = Modulo()
self.view = ModuloView()
def recurso(self):
self.view.vista()
6. Prueba
Ingresar en la URL: http://<hostname>.local/modulo/recurso y comprobar que la
salida sea Hola mundo
Política de nombres
Se utiliza como nombre de módulo el nombre del modelo. Se utilizan el nombre del
modelo con los sufijos “View” y “Controller” para crear las vistas y controladores
respectivamente. Ejemplo:
Modelo: Producto
Vista: ProductoView
Controlador: ProductoController
Helper: ProductoHelper (opcional)
Módulo: application/modules/producto.py
URI: /producto/<recurso>