Cómo desarrollar un marco de red Python
Por lo tanto, tenemos algunos datos sobre la solicitud, pero actualmente estos datos generalmente todavía se mantienen en el servidor front-end (proxy inverso, como nginx, el equilibrio de carga no se considera por el momento, porque El equilibrio de carga es transparente y no considera el contenedor WSGI simple que aloja la solicitud directamente), sin pasar aún al lenguaje backend (Python en este caso). Hemos establecido un mecanismo específico para cada idioma para asignar la información de la solicitud HTTP a la categoría de lenguaje de programación correspondiente, llamada interfaz del servidor web (interfaz del servidor web), que es universal como CGI/FCGI/SCGI y específica de un determinado lenguaje. como WSGI/PSGI/Rack/..., específico de un determinado sistema operativo como WSGI/PSGI/Rack/.... , específico de un sistema operativo como IOS, específico de un lenguaje como WSGI/PSGI/Rack/...., específico de un sistema operativo como IOS, específico de un lenguaje como WSGI/PSGI/Rack/.. .. .., específico de un sistema operativo como IOS, específico de un lenguaje como WSGI/PSGI/Rack/… Además, hay algunos programas que son específicos de un sistema operativo específico, como ISAPI (¿sigue vivo? ) Algunos de ellos ya no se utilizan, por lo que no los mencionaré. De todos modos, en el mundo Python, esto es WSGI (PEP 3333, Web Server Gateway Interface), que define la interfaz entre el lenguaje Python y un servidor web. En WSGI,
El procesamiento de la solicitud se asigna a una llamada a la aplicación invocable (aplicación(environ, start_response), ¿sabías que los bloques de código en línea no son compatibles?)
La información de la solicitud se asigna a las claves correspondientes en el diccionario del entorno, por ejemplo, el método de solicitud se asigna al entorno['REQUEST_METHOD'] y la "ruta relativa" de la solicitud se asigna al entorno['PATH_INFO'] (una simplificación excesiva).
La operación de envío de encabezados de respuesta se asigna a llamar a start_response(status, Response_headers) (esta es la primera vez que se llama a start_response(status, Response_headers)), independientemente del mensaje de excepción del tercer parámetro opcional);
Las operaciones que devuelven datos de respuesta se asignan a operaciones que devuelven iterables de la aplicación.
La respuesta luego se devuelve desde Python al servidor web y se envía de regreso al navegador, y una vez que el navegador genera la respuesta, la solicitud se completa.
Con base en este entendimiento, como autores del marco de desarrollo web Python, lo que tenemos que hacer es proporcionar los métodos de desarrollo más convenientes y la menor sobrecarga de marco posible según la especificación WSGI. , nuestro El código funcionará entre WSGI y la lógica empresarial. Arquitectónicamente, los marcos de desarrollo web siguen más o menos el patrón de diseño MVC (Django lo llama MTV, pero en realidad es más o menos lo mismo). Al mismo tiempo, debido a que el marco está en la posición de middleware, junto con sus características que fomentan la modularización y la reutilización del código, es natural proporcionar abstracciones para operaciones HTTP comunes. Estos son algunos de los temas:
Asignación de rutas de solicitud a vistas/controladores, análisis de parámetros de solicitud (enrutamiento).
Esquema de coincidencia regular, por ejemplo, Django tiene un componente de análisis de expresiones regulares incorporado simple, que puede analizar expresiones regulares de acuerdo con la sintaxis común habitual, analizar grupos de captura en parámetros posicionales y usar capturas con nombre para Los grupos se resuelven según argumentos de palabras clave.
También existen soluciones DSL, como el componente de enrutamiento de Werkzeug.
Manejar la entidad de solicitud. Análisis de formularios, trabajo con servidores web para procesar archivos cargados.
Formulario codificado en URL normal, formulario JSON, texto/datos sin formato, formulario de varias partes
Adjunto de varias partes, API de operación de archivos adjuntos
Carga de archivos grandes (este El servidor de aplicaciones para el usuario generalmente lo guarda en un archivo temporal en el disco (por ejemplo, nginx es nginx).
Sesión: HTTP no tiene estado, lo cual es una característica muy importante. Sin una sesión, puede realizar varias solicitudes seguidas sin poder demostrar que es la misma persona/máquina (lo más probable es que sea un servidor proxy).
Backend de sesión para almacenar datos de la sesión (estructura de datos en memoria, archivo, RDBMS, Redis, Memcache)
Mecanismo de seguridad (HMAC u otro, consulte la implementación de cookies seguras del vaso)
p>
Middleware de sesión en el flujo de procesamiento de solicitudes (extraer sesión de una cookie, extraer sesión de una cadena de consulta, extraer sesión de un encabezado personalizado, etc.)
Funciones del middleware de sesión
Middleware de sesión en el procesamiento de solicitudes (extraer sesión de la cookie, extraer sesión de la cadena de consulta, extraer sesión del encabezado personalizado, etc.)
Sesión de almacenamiento Backend de sesión para datos (¿estructura de datos en memoria? extraer sesión de las cookies , extraer sesión de encabezados personalizados, etc.)
Interfaz de vista/controlador. Utilice su creatividad y experiencia en ingeniería.
¿Vista basada en funciones o vista basada en clases? (Ver: Django, Bottle, web.py, Tornado y otros frameworks de voto único)
¿Cómo se exponen los mecanismos y servicios opcionales del framework? (Requisitos adicionales como @login_required)
¿Devolución de llamada? (Lo único que me viene a la mente 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 (sin tener en cuenta cosas como Promise)
Pasado a la aplicación (lógica empresarial ) capa ¿Cómo se diseña la estructura de datos? Equivalente a HttpRequest, es posible que se haya perdido el nombre)
¿Cómo se diseña 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 también es una parte necesaria para escribir código reutilizable. Después de todo, el entorno de producción cambiará solo para la abstracción del marco, las operaciones de la base de datos o el SQL simple (por ejemplo). ejemplo, cambiar MySQL a pgsql) ¿No sería una tontería?
Base de datos relacional.
Referencia de solución integral: Django ORM, SQLAlchemy; referencia de solución liviana para enlaces de Python para cada base de datos.
Base de datos no relacional. No existe una alternativa a los enlaces Python de cada base de datos (PYMONGO, RIAK, REDIS-PY, etc.), porque las distintas bibliotecas NoSQL originales están diseñadas para satisfacer necesidades específicas y no es necesario reemplazarlas entre sí, lo que significa que la re -selección de tecnología.
Continuar
Próximo artículo:
Ideas de diseño de framework para responder a solicitudes AJAX/API
Ideas de framework web en tiempo real en Python
Concepto de diseño del marco
Método de análisis del rendimiento del marco
No tengo un alto nivel educativo y nunca he realizado proyectos grandes o pequeños. No he realizado proyectos grandes ni pequeños, así que tengan cuidado al leer mis opiniones. Muchas gracias por leer hasta el final.