Introducción a Sanic Web Framework – Python

¿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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *