Colección de citas famosas - Colección de consignas - ¿Es difícil escribir un marco Python?

¿Es difícil escribir un marco Python?

Primero, necesita conocer el flujo básico de procesamiento de solicitudes de una aplicación web. Tomemos como ejemplo la página web dinámica más sencilla y original. Si hace clic en el enlace (GET) y envía el formulario (POST), después de establecer una conexión con el servidor, se enviará una solicitud HTTP (RFC2616 5.1, nuevamente usando HTTP 1.1 como ejemplo). Hay al menos un método (verbo, es decir, GET POST) en él. Consulte RFC2616 Sección 9 para obtener más detalles), dirección (URL), versión HTTP y posiblemente mucha información como Cookie (mecanismo de implementación general de sesiones), información relacionada con el caché (RFC2616 Sección 9, 13), cadena de agente de usuario, etc. . Para solicitudes POST, también incluimos el contenido del formulario como entidad de solicitud (RFC2616 7.2), que es el contenido del formulario que usted completa.

Tenemos algunos datos sobre las solicitudes, pero en términos generales, estos datos todavía están en manos del servidor front-end (el proxy inverso, como nginx, ignora el equilibrio de carga por el momento, de todos modos, es transparente y no considera que en el caso de un contenedor WSGI simple que aloje la solicitud directamente), no se haya pasado al lenguaje de fondo (aquí Python). Tenemos un mecanismo específico para cada idioma para asignar información de solicitud HTTP a la categoría de lenguaje de programación correspondiente, llamada interfaz de servidor web, que es universal como CGI/FCGI/SCGI y específica para un determinado lenguaje como WSGI/PSGI/Rack. /..., y específicos de un sistema operativo, como ISAPI (¿este producto sigue vivo?), no se mencionarán algunos que ya no se utilizan. En resumen, en el mundo Python, esto es WSGI (PEP 3333, Web Server Gateway Interface), que define la interfaz entre el lenguaje Python y el servidor web. En WSGI,

El procesamiento de la solicitud se asigna a una llamada a la aplicación invocable (aplicación (Environ, start_response)). ¿Zhihu no admite bloques de código en línea? );

La información de la solicitud se asigna al valor clave correspondiente en el diccionario del entorno. Por ejemplo, el método de solicitud se asigna al entorno ['REQUEST_METHOD'] y la "ruta relativa" solicitada se asigna a. environ['PATH_INFO'] (simplificación excesiva; no mencionemos el punto de montaje de la aplicación WSGI, la capa de marco generalmente no necesita preocuparse por esto. El montaje de aplicaciones WSGI generalmente es trabajo de componentes del contenedor WSGI como gunicorn y uWSGI

La acción de enviar un encabezado de respuesta se asigna a llamar a start._respuesta (estado, respuesta_encabezados) (independientemente de la información de excepción del tercer parámetro opcional).

Los datos de respuesta devueltos se asignan; a la acción de la aplicación de devolver iterable.

Entonces, la respuesta se devuelve desde Python al servidor web y luego se envía de regreso al navegador. El navegador mostrará el contenido de la respuesta y se completará una solicitud.

Con esta comprensión perceptiva, lo que nosotros, como autores del marco de desarrollo web Python, tenemos que hacer es proporcionar los métodos de desarrollo más convenientes y la menor sobrecarga posible del marco basado en la especificación WSGI, y también Nuestro código funcionará en la capa intermedia entre WSGI y la lógica empresarial. Arquitectónicamente, el marco de desarrollo web sigue más o menos el patrón de diseño MVC (Django lo llama MTV, pero en realidad es similar). Al mismo tiempo, debido a que el marco reside en middleware y fomenta la modularidad y la reutilización de código, es natural proporcionar abstracciones para operaciones HTTP comunes. Puede comenzar algunos temas aquí:

Mapeo de rutas de solicitud a vistas/controladores, análisis de parámetros de solicitud (enrutamiento, también llamado enrutamiento).

Las soluciones de coincidencia regular, como el componente de análisis de expresiones regulares simple incorporado de Django, pueden analizar expresiones regulares en gramáticas comunes, analizar grupos de captura en parámetros posicionales y analizar grupos de captura con nombre en parámetros de palabras clave.

También existen soluciones DSL, como el componente de enrutamiento de Werkzeug.

Tramitación de entidades de solicitud. Análisis de formularios, coopera con el servidor web para cargar archivos.

Formulario normal codificado en URL, formulario JSON, texto/datos normales, formulario de varias partes.

Adjuntos de varias partes, API de operación de archivos adjuntos

Cargue un archivo grande (esto generalmente lo guarda el servidor front-end en un archivo temporal en el disco, como nginx).

Conversación. HTTP no tiene estado, lo cual es importante. Si no hay sesión, realizas varias solicitudes seguidas, pero no hay forma de demostrar que eres la misma persona/máquina (puedes ser un servidor proxy).

El backend de sesión se utiliza para almacenar datos de la sesión (¿estructura de datos de la memoria? ¿Documento? ¿RDBMS? ¿Redis? ¿Memcache?)

Mecanismo de seguridad (HMAC, etc., puede consultar la cookie segura del vaso de precipitados). implementación).

Middleware de sesión en el flujo de procesamiento de solicitudes (extracción de sesión de cookie, extracción de sesión de cadena de consulta, extracción de sesión de encabezado personalizado, etc.)

Interfaz de dispositivo de visualización/control. Utilice su creatividad y experiencia en ingeniería.

¿Vista basada en funciones o basada en clases? Referencia: Django, Bottle, web.py, Tornado y otras prácticas de marco de un voto.

¿Cómo exponer los mecanismos y servicios opcionales del framework,

el decorador? (Como requisitos adicionales para @login_required)

¿Devolución de llamada? (Lo único que se me ocurre es la forma en que los marcos asincrónicos como Tornado y Twisted hacen las cosas, y la idea de que todo el ecosistema JS son devoluciones de llamada (independientemente de las promesas).

Cómo diseñar la aplicación entrante (negocios) lógica) estructura de datos de capa? (Equivalente a HttpRequest, el nombre puede no estar claro)

¿Cómo diseñar la estructura de datos de respuesta? (Equivalente a HttpResponse, igual que el anterior)

Encapsulación de operaciones de base de datos. Las aplicaciones web se centran básicamente en datos. Este componente es muy necesario y una parte esencial de la escritura de código reutilizable. Después de todo, el marco es abstracto y las operaciones de la base de datos siguen siendo SQL desnudo. Si el entorno de producción cambia (por ejemplo, MySQL cambia a pgsql), no se quedará estupefacto.

Base de datos relacional. Referencia de solución integral: Django ORM, SQLAlchemy; las soluciones livianas se refieren a enlaces de Python para varias bases de datos.

Base de datos no relacional. Enlaces de Python para bases de datos (pymongo, riak, redis-py, etc.), que son insustituibles porque las distintas bibliotecas NoSQL se diseñaron originalmente para satisfacer una necesidad específica y no es necesario reemplazarlas entre sí, lo que significa volver a seleccionar la tecnología.

Continuará

Lo siguiente es:

Ideas de diseño de marcos que responden principalmente a solicitudes AJAX/API

Web en tiempo real framework en Python Thinking

Filosofía de diseño del framework

Método de análisis del rendimiento del framework