¿QUÉ ES SANIC? Sanic es un marco web asíncrono y un servidor web para Python 3.5+ que está escrito para funcionar rápido. Sanic se desarrolló en MagicStack y se basa en su bucle de eventos uvloop, que es un reemplazo del bucle de eventos predeterminado de Python asyncio, lo que hace que Sanic sea increíblemente rápido. Sintácticamente, Sanic se parece a Flask. Sanic puede usarse como reemplazo de Django o Flask para crear aplicaciones web altamente escalables, eficientes y con un rendimiento ultrarrápido. ¡CONSTRUYENDO NUESTRA PRIMERA APLICACIÓN DE SANIC! Paso 1: es preferible usar entornos virtuales en Python para crear entornos aislados con dependencias específicas del proyecto. Dado que las versiones Sanic 19.6+ no son compatibles con Python 3.5, trabajaremos con Python 3.6+. Para instalar sanic en nuestro entorno virtual Python ejecutaremos el siguiente comando –pip3 install sanic Paso 2: Vamos a crear un directorio llamado sanic_demo y dentro de él un archivo llamado main.py con las siguientes líneas de código:
Python3
from sanic import Sanic from sanic import response app = Sanic("My First Sanic App") # webapp path defined used route decorator @app.route("/") def run(request): return response.text("Hello World !") # debug logs enabled with debug = True app.run(host ="0.0.0.0", port = 8000, debug = True)
Paso 3: Podemos ejecutar main.py desde un IDE o ejecutar el archivo desde la Terminal ejecutando el siguiente comando: python3 main.py El servidor web de Sanic está en el puerto 8000 de nuestro ‘localhost’. Paso 4: Navegar a http://0.0.0.0:8000/ desde nuestro navegador web muestra “Hello World!”. CONFIGURACIÓN El atributo de configuración del objeto de la aplicación Sanic se utiliza para configurar parámetros. Al objeto de configuración de la aplicación se le pueden asignar pares clave-valor de la siguiente manera:
Python3
from sanic import Sanic from sanic import response app = Sanic("My First Sanic App") app.config["SECURITY_TOKEN"] = [{"ApiKeyAuth": []}]
La lista completa de parámetros de configuración está disponible en la página de documentación oficial: Sanic Config ENRUTAMIENTO Y PLANOS Sanic admite el decorador de rutas para asignar funciones de controlador a requests HTTP. Podemos usar un parámetro opcional llamado métodos en el decorador de ‘ruta’ para trabajar con cualquiera de los métodos HTTP en la lista. Blueprints es un concepto utilizado para conectar subrutas a la aplicación Sanic desde submódulos de una aplicación grande. Los planos deben registrarse en el objeto de la aplicación Sanic. El uso de planos también evita pasar el objeto de la aplicación Sanic por toda la aplicación. Modifiquemos nuestro archivo main.py original para demostrar el uso de rutas y planos:
Python3
# this is our 'main.py' file from sanic import Sanic from sanic import response from sanic.log import logger from controller import my_bp app = Sanic("My First Sanic App") # registering route defined by blueprint app.blueprint(my_bp) # webapp path defined used 'route' decorator @app.route("/") def run(request): return response.text("Hello World !") @app.route("/post", methods =['POST']) def on_post(request): try: return response.json({"content": request.json}) except Exception as ex: import traceback logger.error(f"{traceback.format_exc()}") app.run(host ="0.0.0.0", port = 8000, debug = True)
Vamos a crear un nuevo archivo llamado controlador.py para declarar nuestros planos:
Python3
# this is our 'controller.py' file from sanic import response from sanic import Blueprint my_bp = Blueprint('my_blueprint') @my_bp.route('/my_bp') def my_bp_func(request): return response.text('My First Blueprint')
Ejecutemos main.py y verifiquemos los resultados cuando se acceda al punto final /my_bp . Hemos utilizado un cliente web llamado ‘ Insomnia ‘ para demostrar nuestra solicitud POST . servir contenido estático como imágenes, pdf, archivos html estáticos, etc. Necesitamos usar el método app.static() que asigna la ruta de un archivo estático a un punto final especificado por una ‘ruta’. Modifiquemos nuestro archivo main.py para demostrar esto:
Python3
# this is our 'main.py' file from sanic import Sanic from sanic import response from sanic.log import logger from controller import my_bp app = Sanic("My First Sanic App") # registering route defined by blueprint app.blueprint(my_bp) # configuring endpoint to serve an image downloaded from the web app.static('/floral_image.jpg', '/sanic_demo / ws_Beautiful_flowers_1920x1080.jpg') # webapp path defined used 'route' decorator @app.route("/") def run(request): return response.text("Hello World !") @app.route("/post", methods =['POST']) def on_post(request): try: return response.json({"content": request.json}) except Exception as ex: import traceback logger.error(f"{traceback.format_exc()}") app.run(host ="0.0.0.0", port = 8000, debug = True)
Ejecutar main.py y acceder a http://0.0.0.0:8000/floral_image.jpg muestra la imagen en el navegador. Modifiquemos aún más main.py para acceder a algún contenido html. Vamos a crear un archivo index.html de muestra.
html
<html> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Render HTML on Sanic</title> </head> <body> Gotta go fast! </body> </html>
Python3
# this is our 'main.py' file from sanic import Sanic from sanic import response from sanic.log import logger from controller import my_bp app = Sanic("My First Sanic App") app.blueprint(my_bp) # registering route defined by blueprint app.static('/floral_image.jpg', '/sanic_demo / ws_Beautiful_flowers_1920x1080.jpg') # webapp path defined used 'route' decorator @app.route("/") def run(request): return response.text("Hello World !") @app.route("/post", methods =['POST']) def on_post(request): try: return response.json({"content": request.json}) except Exception as ex: import traceback logger.error(f"{traceback.format_exc()}") @app.route("/display") def display(request): return response.file('/sanic_demo / index.html') app.run(host ="0.0.0.0", port = 8000, debug = True)
Ejecutar main.py y acceder a http://0.0.0.0:8000/display genera lo siguiente en el navegador: MANEJO DE EXCEPCIONES Las excepciones se pueden generar explícitamente dentro de los controladores de requests de Sanic. Las Excepciones toman un mensaje como primer argumento y también pueden incluir un código de estado. El decorador @app.exception se puede usar para manejar las excepciones de Sanic. Hagamos una demostración modificando nuestro archivo main.py :
Python3
# this is our 'main.py' file from sanic import Sanic from sanic import response from sanic.log import logger from controller import my_bp from sanic.exceptions import ServerError, NotFound app = Sanic("My First Sanic App") app.blueprint(my_bp) # registering route defined by blueprint app.static('/floral_image.jpg', '/sanic_demo / ws_Beautiful_flowers_1920x1080.jpg') # raise Exception @app.route('/timeout') async def terminate(request): raise ServerError("Gateway Timeout error", status_code = 504) @app.exception(NotFound) async def ignore_5xx(request, exception): return response.text(f"Gateway is always up: {request.url}") # webapp path defined used 'route' decorator @app.route("/") def run(request): return response.text("Hello World !") @app.route("/post", methods =['POST']) def on_post(request): try: return response.json({"content": request.json}) except Exception as ex: import traceback logger.error(f"{traceback.format_exc()}") @app.route("/display") def display(request): return response.file('/sanic_demo / index.html') app.run(host ="0.0.0.0", port = 8000, debug = True)
Excepción representada en el navegador: NotFound (lanzado cuando no se encuentra el controlador de requests para la ruta) y ServerError (arrojado debido a problemas con el código de servicio) son los más utilizados. SOPORTE ASYNC Las aplicaciones web se comunican de forma característica con recursos externos, como bases de datos, colas, API externas, etc. para recuperar la información necesaria para procesar las requests. Sanic, un marco web de Python que tiene la sintaxis async/await de la biblioteca asyncio de Python 3.5+ preconfigurada, es el candidato ideal para diseñar proyectos enlazados de E/S a gran escala que funcionan con muchas conexiones. Esto permite que las requests de la aplicación web se procesen de forma concurrente y sin bloqueos. Python 3.5 introdujo asyncio, que es una biblioteca para escribir código concurrente usando la sintaxis async/await (fuente:https://docs.python.org/3/library/asyncio.html ). La biblioteca asyncio proporciona un bucle de eventos que ejecuta funciones de E/S asíncronas. Sanic brinda soporte para la sintaxis async/await , lo que hace que el manejo de requests no bloquee y sea súper rápido. Agregar la palabra clave async a las funciones del controlador de requests hace que la función maneje el código de forma asíncrona, aprovechando así los beneficios de rendimiento de Sanic. En lugar del bucle de eventos de asyncio, Sanic utiliza el uvloop patentado de MagicStack , que es más rápido que el bucle de eventos de asyncio, lo que lleva a velocidades ultrarrápidas. Sin embargo, en el sistema operativo Windows, Sanic vuelve al bucle de eventos de asyncio bajo el capó, debido a problemas con uvloop en Windows. Referencia: Documentos oficiales de Sanic .
Publicación traducida automáticamente
Artículo escrito por devina_bhattacharyya y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA