Tutorial de la serie avanzada de Python: protocolo HTTP y desarrollo de servidor web estático

objetivo de aprendizaje

1. Comprender los conceptos básicos del protocolo HTTP

2. Domine el mensaje de solicitud HTTP y el mensaje de respuesta

3. Aprenda a usar las herramientas de desarrollo para ver el proceso de comunicación del protocolo HTTP

4. Cree un servidor web estático que venga con Python

5. Domina el desarrollo de un servidor web estático Python

1. Descripción general del protocolo HTTP

1. URL del sitio web

La URL también se denomina URL, y la ortografía completa en inglés de URL es (Uniform Resoure Locator), que significa Localizador uniforme de recursos, y la comprensión popular es la dirección de los recursos de red. Dirección URL: https://www.itcast.com/18/1122/10/E178J2O4000189FH.html

2. Composición de la URL

3. Protocolo HTTP

☆ importación de escena

Primero veamos un escenario:

Durante el proceso de comunicación entre el navegador y el servidor web, ¿existen reglas para su formato de datos y se puede configurar arbitrariamente? Respuesta: No, la comunicación entre el navegador y el servidor web debe utilizar el protocolo HTTP para especificar el formato de los datos comunicados entre el navegador y el servidor web.

☆ ¿Qué es el protocolo HTTP?

El nombre completo del protocolo HTTP es (Protocolo de transferencia de hipertexto), que se traduce como Protocolo de transferencia de hipertexto. El hipertexto se refiere a datos que no son de texto sobre la base de datos de texto. Los datos que no son de texto incluyen imágenes, música, videos, etc., y estos datos que no son de texto se cargarán y mostrarán mediante enlaces. En términos generales, el hipertexto se refiere a enlaces. Los datos de texto de también son lo que solemos llamar datos de páginas web, como se muestra en la siguiente figura:

☆ El concepto y función del protocolo HTTP

El productor del protocolo HTTP es Tim Berners-Lee, y fue diseñado en 1991. El protocolo HTTP fue diseñado para transmitir datos de páginas web y ahora permite la transmisión de cualquier tipo de datos. La transmisión de datos en formato de protocolo HTTP se basa en el protocolo de transmisión TCP, y se debe establecer una conexión antes de enviar datos. El protocolo de transmisión TCP se usa para garantizar la seguridad de los datos transmitidos en la red, y el protocolo HTTP se usa para especificar el formato específico de estos datos.

Nota: El formato de datos estipulado por el protocolo HTTP es el formato de los datos de comunicación entre el navegador y el servidor web, lo que significa que la comunicación entre el navegador y el servidor web debe utilizar el protocolo HTTP.

☆ El proceso del navegador accediendo al servidor web

Dos, mensaje de solicitud HTTP y mensaje de respuesta

1. Mensaje de solicitud HTTP

Hay dos mensajes de solicitud HTTP más comunes: ① Mensaje de solicitud GET ② Mensaje de solicitud POST GET: Obtener datos del servidor web POST: Enviar datos al servidor web

2. Formato de mensaje de solicitud GET

 
 
 
 

---- línea de solicitud ----
GET /wp-content/uploads/2020/12/zm.svg HTTP/1.1 # GET método de solicitud ruta de recurso de solicitud Versión de protocolo HTTP
---- encabezado de solicitud -----
Host : www.itcast.cn # La dirección de host y el número de puerto del servidor, el valor predeterminado es 80
Conexión: keep-alive # Mantener una conexión larga con el servidor
Upgrade-Insecure-Requests: 1 # Permitir que el navegador actualice la solicitud insegura, use https para solicitar
Usuario -Agente: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, como Gecko) Chrome/69.0.3497.100 Safari/537.36 # Agente de usuario, que es el nombre del cliente Aceptar: text/html,application/
xhtml +xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 # tipo de datos aceptable Aceptar-Codificación: gzip, deflate # formato de compresión aceptable Aceptar- Idioma
:
zh -CN,zh;q=0.9 #Idioma aceptable
Cookie: pgv_pvi=1246921728; #Identificación del usuario conectado
---- Línea vacía----

3. Análisis del mensaje de solicitud GET

 
 
 
 

GET / HTTP/1.1\r\n

Host: www.itcast.cn\r\n
Conexión: keep-alive\r\n
Upgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, como Gecko) Chrome/69.0.3497.100 Safari/537.36\r\n
Aceptar: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp ,image/apng,*/*;q=0.8\r\n
Aceptar codificación: gzip, deflate\r\n
Aceptar idioma: zh-CN,zh;q=0.9\r\n
Cookie: pgv_pvi=1246921728; \r\n

\r\n (Hay un '\r\n' separado después de la información del encabezado de la solicitud que no se puede omitir) => línea en blanco

Nota: Use \r\n entre cada elemento de datos. En la solicitud HTTP, después de que finalice cada opción, se debe agregar una etiqueta \r\n (que representa el final de una línea) después de ella.

En los sistemas Windows, los saltos de línea se implementan mediante \n. Pero en los sistemas Linux y Unix, los saltos de línea deben implementarse usando \r\n.

4. Formato de mensaje de solicitud POST

 
 
 
 

---- Línea de solicitud ----
POST /xmweb?host=mail.itcast.cn&_t=1542884567319 HTTP/1.1 # Método de solicitud POST ruta de recurso de solicitud Versión de protocolo HTTP
---- encabezado de solicitud ----
Host: correo. itcast.cn # La dirección de host y el número de puerto del servidor, el valor predeterminado es 80
Connection: keep-alive # Mantener una conexión larga con el servidor
Content-Type: application/x-www-form-urlencoded # Decir al servidor lo solicitado tipo de datos
Agente de usuario: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, como Gecko) Chrome/69.0.3497.100 Safari/537.36 # Nombre del cliente ---- línea vacía ----
-- --
Cuerpo de solicitud ----
nombre de usuario=hola&contraseña=hola # parámetro de solicitud

5. Análisis del mensaje de solicitud POST

 
 
 
 

POST /xmweb?host=mail.itcast.cn&_t=1542884567319 HTTP/1.1\r\n
Host: mail.itcast.cn\r\n
Conexión: keep-alive\r\n
Content-Type: application/x-www- form-urlencoded\r\n
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, como Gecko) Chrome/69.0.3497.100 Safari/537.36\r\n \r\n(
solicitud También hay un único '\r\n' después de la información del encabezado que no se puede omitir)
nombredeusuario=hola&contraseña=hola

Nota: use \r\n entre cada dato para finalizar

6. Resumen de los mensajes de solicitud GET y POST

① Un mensaje de solicitud HTTP puede estar compuesto por cuatro partes: línea de solicitud, encabezado de solicitud, línea en blanco y cuerpo de solicitud

② La línea de solicitud se compone de tres partes: método de solicitud, ruta de recurso de solicitud, versión del protocolo HTTP (1.1 o 2.0)

③ El mensaje de solicitud en modo GET no tiene cuerpo de solicitud, solo la línea de solicitud, el encabezado de solicitud y la línea en blanco

④ Un mensaje de solicitud POST puede constar de cuatro partes: línea de solicitud, encabezado de solicitud, línea en blanco y cuerpo de solicitud. Nota: El método POST no puede permitir ningún cuerpo de solicitud, pero este formato es raro.

7. Análisis del mensaje de respuesta HTTP (énfasis)

 
 
 
 

--- Línea de respuesta/línea de estado ---
HTTP/1.1 200 OK # Descripción del estado del código de estado de la versión del protocolo HTTP
--- Encabezado de respuesta ---
Servidor: Tengine # Nombre del servidor
Content-Type: text/html; charset=UTF- 8 # Tipo de contenido (tipo de datos de respuesta, imagen/png)
Conexión: keep-alive # Mantener una conexión larga con el cliente
Fecha: viernes, 23 de noviembre de 2018 02:01:05 GMT # Tiempo de respuesta del servidor
---línea en blanco - --
-- Cuerpo de la respuesta ---
<!DOCTYPE html><html lang="es"> …</html> # Responder a los datos del cliente (página html)

La información del encabezado de respuesta le dice principalmente al cliente del navegador cómo procesar los datos que devolvemos.

8. Código de estado de respuesta HTTP

es un código de 3 dígitos que se utiliza para indicar el estado de la respuesta del servidor web

código de estado

ilustrar

200

El servidor ha procesado con éxito la solicitud.

400

Solicitud incorrecta, la dirección de la solicitud o los parámetros son incorrectos

404

El recurso solicitado no existe en el servidor

500 (excepción del lado del servidor)

Ocurrió un error en el código fuente interno del servidor

3. Ver el proceso de comunicación del protocolo HTTP

1. Herramientas para desarrolladores de Google Chrome

Instale el navegador Google Chrome, presione F12 o Ctrl+Shift+I en plataformas Windows y Linux para abrir las herramientas de desarrollo, seleccione "Ver->Desarrollador->" herramientas de desarrollo en Mac o use directamente la tecla de acceso directo de alt+comando+ i , hay otra operación común multiplataforma que es hacer clic con el botón derecho en la página web y seleccionar marcar.

Sugerencia: la herramienta para desarrolladores también es una herramienta poderosa para ver el diseño de la página web y la depuración del código JS.

2. Proceso de comunicación del protocolo HTTP

 

Nota: Toda comunicación de datos entre el navegador y el servidor ocurre en pares, es decir, solicitudes y respuestas, y cada solicitud y respuesta debe ajustarse al formato del protocolo HTTP.

3. Uso de las herramientas para desarrolladores de Google Chrome

Paso 1: comprender las funciones de cada pestaña

Paso 2: use la red para enviar solicitudes HTTP

 

Paso 3: Ver el encabezado de la solicitud y la información del encabezado de la solicitud del proceso de comunicación del protocolo HTTP

Encabezado de respuesta, información del cuerpo de respuesta

4. Resumen

La herramienta para desarrolladores de Google Chrome es una herramienta poderosa para ver el proceso de comunicación del protocolo http. A través de la opción de la pestaña Red, puede ver el proceso de comunicación de cada solicitud y respuesta. El método general para llamar a la herramienta para desarrolladores es a la derecha -haga clic en la página web y seleccione comprobar. La opción Encabezados consta de tres partes:

① General: Información principal

② Encabezados de respuesta: encabezado de respuesta

③ Encabezados de solicitud: la opción Respuesta del encabezado de solicitud es para ver la información del cuerpo de respuesta

4. Cree un servidor web estático que venga con Python

1. ¿Qué es un servidor web estático?

Un programa que puede servir documentos estáticos (html/css/js/pictures/audio/video) a los navegadores que lo soliciten. Por lo general, cuando navegamos por los datos de noticias de Baidu, los datos de noticias cambiarán todos los días, por lo que la página que visitamos es dinámica, pero lo que desarrollamos es estático, y visitamos nuestro propio servidor web estático todos los días, y los datos en la página no cambiar

2. Cree un servidor web estático que venga con Python

Método de creación de Linux:

Método de creación de Windows:

① Cree una carpeta y coloque todos los archivos de recursos en esta carpeta

② Use el comando cd en la ventana de DOS para cambiar a este directorio

③ Use el comando python -m para crear un servidor web estático

 
 
 
 

python -m http.servidor 9000

-m significa ejecutar los módulos en el paquete.Al ejecutar este comando, debe ingresar al directorio donde especifica los archivos estáticos, y luego puede acceder a los archivos html correspondientes a través del navegador, para que se configure un servidor web estático arriba.

④ Acceder al servidor web estático:

Ver el proceso de comunicación HTTP:

3. Resumen

El servidor web estático es un programa que proporciona documentos estáticos para el navegador que envía la solicitud. Para construir el servidor web que viene con Python, use el comando python –m http.número de puerto del servidor. Si no se especifica el número de puerto, el el valor predeterminado es 8000

¡enfatizar! : Los datos incluidos en el cuerpo de la respuesta se envían al navegador, y el navegador genera una página específica después de la representación.

5. Usa Python para desarrollar tu propio servidor web

Servidor web = servidor TCP (siete pasos) + protocolo HTTP (solicitud, respuesta)

1. Pasos de desarrollo

2. Devolver los datos de la página fija

import socket


if __name__ == '__main__':
# 1. Crear socket
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 2. Vincular IP y puerto
tcp_server_socket.bind((", 8080))
# 3. Configure la escucha
tcp_server_socket.listen(128)

while True:
# 4. Establezca la conexión
client_socket, client_addr = tcp_server_socket.accept()
client_request_data = client_socket.recv(1024).decode ()
print(client_request_data)

with open("html/index.html", "rb") como f:
file_data = f.read()

# respuesta línea
respuesta_línea = "HTTP/1.1 200 OK\r\n"
# encabezado de respuesta
encabezado_respuesta = "Servidor: pwb\r\n"
# Cuerpo de respuesta
response_body = file_data

# Respuesta de datos
response_data = (response_line + response_header + "\r\n").encode() + response_body

# 5. Envíe datos
client_socket.send(response_data)
# 6. Cierre la conexión de socket del cliente
client_socket. cerca()

3. Devolver los datos de la página especificada

Pasos del análisis: ① Obtener la ruta del recurso solicitado por el usuario

② Según la ruta del recurso solicitado, lea los datos del archivo especificado

③ Reúna el mensaje de respuesta de los datos del archivo especificado y envíelo al navegador

④ Determinar que el archivo solicitado no existe en el servidor, ensamblar un mensaje de respuesta de estado 404 y enviarlo al navegador para obtener la ruta del recurso solicitado por el usuario:

 
 
 
 

request_list = client_request_data.split(" ", maxsplit=2)
request_path = request_list[1] # /gdp.html
if request_path == "/":
# Si el usuario no especifica una ruta de recursos, los datos a los que se accede por defecto son los datos de la página de inicio
request_path = "/index.html"

Obtener los datos de la página especificada:

 
 
 
 

# Leer datos de archivos especificados
# La razón para usar rb es que el navegador también puede solicitar imágenes
con open("html/" + request_path, "rb") como archivo:
# Leer datos de archivos
file_data = file.read()

Ensamble el mensaje de respuesta de los datos de la página especificada:

 
 
 
 

# Respuesta línea
response_line = "HTTP/1.1 200 OK\r\n"
# Respuesta encabezado
response_header = "Servidor: PWS1.0\r\nContent-Type: text/html;charset=utf-8\r\n" #
Respuesta Body
response_body = file_data
# Concatenar los datos del mensaje de respuesta
response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body #
Enviar los datos del mensaje de respuesta
client_socket.send(response_data)
client_socket.close ()

Ensamble el mensaje de respuesta de los datos de la página 404:

 
 
 
 

intente:
# Abra el archivo especificado, se omite el código...
excepto Excepción como e:
response_line = 'HTTP/1.1 404 Not Found\r\n'
response_header = 'Server: PWS1.0\r\nContent-Type: text /html; charset=utf-8\r\n'
response_body = '<h1>Lo sentimos, la página web que está visitando ya no existe</h1>'.encode('utf-8')
response_data = (response_line + response_header + ' \r\n').encode('utf-8') + response_body
# Enviar datos del mensaje de respuesta 404
client_socket.send(response_data)
else:
# Enviar los datos del mensaje de respuesta de la página especificada, el código se omite...
finalmente:
client_socket .close()

6. Marco FastAPI

objetivo de aprendizaje

  • Puede saber qué es FastAPI

  • Puede saber cómo instalar FastAPI

  • Ser capaz de dominar el uso básico de FastAPI

  • Ser capaz de dominar FastAPI para acceder a múltiples páginas web específicas


1. ¿Qué es FastAPI?

FastAPI es un marco web de python moderno, rápido (de alto rendimiento). Basado en las sugerencias de tipo estándar de python, un marco web para crear API usando python3.6+.

En pocas palabras, FastAPI es para simplificar todos los códigos relevantes necesarios para el desarrollo web. No necesitamos implementar varios códigos complejos por nosotros mismos, como multitarea, decoradores de enrutamiento, etc. Solo necesitamos llamar a las funciones proporcionadas por FastAPI. Puede realizar funciones que anteriormente requerían una gran cantidad de código complicado para realizar.

Características de FastAPI

  • Rendimiento rápido: alto rendimiento, comparable a NodeJS y Go

  • Desarrollo rápido: el desarrollo de funciones es aproximadamente entre un 200 % y un 300 % más rápido

  • Menos errores:

  • Menos errores: Reduzca el 40% de los errores que los desarrolladores tienden a causar

  • Intuitivo: soporte de edición perfecto

  • Simple: fácil de usar y aprender, menos tiempo dedicado a leer la documentación

  • Código conciso: reduce en gran medida la duplicación de código. Cada parámetro puede declarar múltiples funciones para reducir la aparición de errores.

  • Estandarización: estándares de desarrollo totalmente compatibles y basados ​​en API: OpenAPI (anteriormente conocido como Swagger) y JSON Schema

entorno de construcción

  • Entorno de Python: Python 3.6+

instalar fastapi

☆ Método de instalación 1:

  • instalar fastapi

  • pip instalar fastapi

  • Si se usa para producción, también necesitará un servidor ASGI como Uvicorn o Hypercorn

  • pip instalar uvicornio

☆ Método de instalación 2: 1) Seleccione Archivo->Configuración

2) Seleccione el Intérprete del proyecto del proyecto correspondiente -> seleccione pygame (puede ingresar pygame para buscar, ahorrando tiempo) -> botón de instalación del paquete -> espere a que el proyecto instale el paquete pygame (puede tomar de unos minutos a diez minutos) -> volver si Si hay información del paquete pygame, significa que la configuración del proyecto es exitosa

2. Uso básico de FastAPI

Requerimientos funcionales:

  • construir servidor

  • volver página html

Los pasos básicos:

  1. módulo de importación

  2. Crear objeto de marco FastAPI

  3. Envíe y reciba datos a través del decorador de enrutamiento @app

  4. ejecutar servidor

Código:

 
 
 
 

# Importar módulo FastAPI
desde fastapi import FastAPI
# Importar mensaje de respuesta Módulo de respuesta
desde fastapi import Response
# Importar servidor módulo uvicorn
importar uvicorn

# Crear objeto de marco FastAPI
app = FastAPI()


# Enviar y recibir datos a través del decorador de enrutamiento @app
# @app.get (parámetro): acepta los datos de la solicitud de acuerdo con el método get
# La ruta de la URL del recurso solicitado
@app.get("/index.html")
def main():
with open("source/html/index.html" ) como f:
datos = f.read()
# devolver datos de respuesta de retorno
# Respuesta(contenido=datos, tipo_medios="texto/html"
# parámetro 1: datos de respuesta
# parámetro 2: formato de datos
retorno Respuesta(contenido=datos, tipo_medios ="text/html ")


# Ejecutar servidor
# Parámetro 1: Objeto de marco
# Parámetro 2: Dirección IP
# Parámetro 3: Número de puerto
uvicorn.run(aplicación, anfitrión="127.0.0.1", puerto=8000)

3. Acceda a múltiples páginas web específicas a través de FastAPI

  • El papel de los decoradores de rutas:

  • De hecho, a través del decorador de rutas, podemos hacer que una página web se corresponda con una función, y luego podemos acceder a la página web especificada.

 
 
 
 

# Importar módulo FastAPI
desde fastapi import FastAPI
# Importar mensaje de respuesta Módulo de respuesta
desde fastapi import Response
# Importar servidor módulo uvicorn
importar uvicorn

# Crear objeto de marco FastAPI
app = FastAPI()


# Enviar y recibir datos a través del decorador de enrutamiento @app
# @app.get (parámetro): acepta los datos de la solicitud de acuerdo con el método get
# La ruta de la URL del recurso solicitado
@app.get("/index1.html")
def main():
with open("source/html/index1.html" ) como f:
datos = f.read()
# devolver datos de respuesta de retorno
# Respuesta(contenido=datos, tipo_medios="texto/html"
# parámetro 1: datos de respuesta
# parámetro 2: formato de datos
retorno Respuesta(contenido=datos, tipo_medios ="text/html ")


@app.get("/index2.html")
def main():
with open("source/html/index2.html") como f:
datos = f.read()
# devolver datos de respuesta de retorno
# Respuesta(contenido=datos, tipo_medios="texto/html"
# parámetro 1: datos de respuesta
# parámetro 2: formato de datos
retorno Respuesta(contenido=datos, tipo_medios="texto/ html")


# Ejecutar servidor
# Parámetro 1: Objeto marco
# Parámetro 2: Dirección IP
# Parámetro 3: Número de puerto
uvicorn.run(app, host="127.0.0.1", port=8000)

4. Resumen

  • Los pasos básicos:

  • módulo de importación

  • Crear objeto de marco FastAPI

  • Envíe y reciba datos a través del decorador de enrutamiento @app

  • ejecutar servidor

Supongo que te gusta

Origin blog.csdn.net/Blue92120/article/details/131223545
Recomendado
Clasificación