Comparaison des frameworks sans serveur Python-Zappa vs Chalice

introduction

Cet article est le 23e jour du Calendrier de l'Avent 2016 sans serveur (2).

Framework sans serveur Python

Les deux suivants semblent être populaires en tant que frameworks pour développer des applications sans serveur avec Python.

Cette fois, comparons approximativement ces deux.

En passant, si vous utilisez Node.js, Serverless Framework et Apex sont célèbres. Les diapositives suivantes vous aideront à découvrir les autres frameworks sans serveur disponibles. Unlimited Frameworks

chalice Python Serverless Microframework for AWS

C'est la seule commande préparée.

Commands:
  deploy
  gen-policy
  generate-sdk
  local
  logs
  new-project
  url

Jetons un coup d'œil au code source en utilisant le calice réel en nous référant à Comment créer un service d'API de vignettes avec AWS Lambda.

ʻApp.py` effectue le processus de réception de photos par POST et de génération de vignettes.

import base64
import uuid
from subprocess import Popen, PIPE

import boto3
from chalice import BadRequestError, Chalice


app = Chalice(app_name='thumbnail-service')
app.debug = True  # TODO: Disable on production

S3 = boto3.client('s3')
S3_BUCKET = ''  # TODO: Replace with valid bucket name


@app.route('/', methods=['POST'])
def index():
    body = app.current_request.json_body

    image = base64.b64decode(body['data'])
    format = {'jpg': 'jpeg', 'png': 'png'}[body.get('format', 'jpg').lower()]
    mode = {'max': '', 'min': '^', 'exact': '!'}[body.get('mode', 'max').lower()]
    width = int(body.get('width', 128))
    height = int(body.get('height', 128))

    cmd = [
        'convert',  # ImageMagick Convert
        '-',  # Read original picture from StdIn
        '-auto-orient',  # Detect picture orientation from metadata
        '-thumbnail', '{}x{}{}'.format(width, height, mode),  # Thumbnail size
        '-extent', '{}x{}'.format(width, height),  # Fill if original picture is smaller than thumbnail
        '-gravity', 'Center',  # Extend (fill) from the thumbnail middle
        '-unsharp',' 0x.5',  # Un-sharpen slightly to improve small thumbnails
        '-quality', '80%',  # Thumbnail JPG quality
        '{}:-'.format(format),  # Write thumbnail with `format` to StdOut
    ]

    p = Popen(cmd, stdout=PIPE, stdin=PIPE)
    thumbnail = p.communicate(input=image)[0]

    if not thumbnail:
        raise BadRequestError('Image format not supported')

    filename = '{}_{}x{}.{}'.format(uuid.uuid4(), width, height, format)
    S3.put_object(
        Bucket=S3_BUCKET,
        Key=filename,
        Body=thumbnail,
        ACL='public-read',
        ContentType='image/{}'.format(format),
    )

    return {
        'url': 'https://s3.amazonaws.com/{}/{}'.format(S3_BUCKET, filename)
    }

Zappa

Serverless Python Web Services

Ensuite, comme calice, l'application qui génère des vignettes des photos reçues par POST est [Building Serverless Microservices with Zappa and Flask --Gun.io](https://gun.io/blog/serverless-microservices-with-zappa-and Faisons référence à -flask /).

import base64
import boto3
import calendar
import io

from datetime import datetime, timedelta
from flask import Flask, request, render_template
from PIL import Image

s3 = boto3.resource('s3')
BUCKET_NAME = 'your_public_s3_bucket'

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        new_file_b64 = request.form['b64file']
        if new_file_b64:

            # Decode the image
            new_file = base64.b64decode(new_file_b64)

            # Crop the Image
            img = Image.open(io.BytesIO(new_file))
            img.thumbnail((200, 200))

            # Tag this filename with an expiry time
            future = datetime.utcnow() + timedelta(days=10)
            timestamp = str(calendar.timegm(future.timetuple()))
            filename = "thumb.%s.jpg " % timestamp

            # Send the Bytes to S3
            img_bytes = io.BytesIO()
            img.save(img_bytes, format='JPEG')
            s3_object = s3.Object(BUCKET_NAME, filename)
            resp = s3_object.put(
                Body=img_bytes.getvalue(),
                ContentType='image/jpeg'
                )

            if resp['ResponseMetadata']['HTTPStatusCode'] == 200:

                # Make the result public
                object_acl = s3_object.Acl()
                response = object_acl.put(
                    ACL='public-read')

                # And return the URL
                object_url = "https://{0}.s3.amazonaws.com/{1}".format(
                    BUCKET_NAME,
                    filename)
                return object_url, 200
            else:
                return "Something went wrong :(", 400

    return render_template('upload.html')

Contrairement à Calice, vous pouvez déployer une application WSGI, vous pouvez donc préparer ensemble un écran de téléchargement de photos, etc.

Vous pouvez également utiliser la source d'événements AWS pour effectuer un traitement de vignettes non bloquant avec le téléchargement vers S3 en tant que hook.

# zappa_settings.yml
---
dev:
  app_function: your_project.main.app
  events:
  - function: your_project.users.thumbnailer
    event_source:
      arn: arn:aws:s3:::your_public_s3_bucket
      events:
      - s3:ObjectCreated:*
# your_project/users.py
import Pillow

def thumbnailer(event, context):
    """ Upon PUT, thumbnail! """

    # Get the bytes from S3
    in_bucket = event['Records']['s3']['bucket']['name']
    key = event['Records']['s3']['object']['key']
    image_bytes = s3_client.download_file(in_bucket, key, '/tmp/' + key).read()

    # Thumbnail it
    size = (250, 250)
    thumb = ImageOps.fit(image_bytes, size, Image.ANTIALIAS)

    # Put it back on S3
    s3_client.put_object(
        ACL='public-read',
        Body=thumb,
        Key=key + 'thumbnail.jpg',
        Bucket='avatar-bucket')

Pour plus d'informations, consultez Comparaison des infrastructures sans serveur --Zappa Versus Chalice.

Référencé

en conclusion

Zappa semble être classé numéro un dans Top 10 des bibliothèques Python de 2016 --Tryolabs Blog De plus, en décembre 2016, Zappa semble être plus populaire que charice.

Mais comme nous l'avons vu ici, les deux cadres sont distincts et distincts. J'espère que la zone du framework sans serveur Python deviendra plus excitante en l'utilisant correctement en fonction de l'objectif.

Recommended Posts

Comparaison des frameworks sans serveur Python-Zappa vs Chalice
Facilement sans serveur avec Python en utilisant Calice
Comparaison de 4 types de frameworks Web Python
Comparaison de la vitesse de la perspective XML Python
Comparaison de la vitesse de transposition de la matrice par Python
Premier Python 3 ~ Première comparaison ~
Comparaison des performances du détecteur de visage avec Python + OpenCV
Comparaison de vitesse Python regex vs startswith vs str [: word_length]
[Python3] Comparaison de vitesse, etc. sur la privation de numpy.ndarray
Les bases de Python ①
Bases de python ①
Comparaison approfondie de trois bibliothèques d'analyse morphologique Python
Copie de python
Comparaison simple des bibliothèques Python qui exploitent Excel
Comparaison d'écriture R et Python (méthode de division mutuelle euclidienne)
Comparaison de Python et Ruby (Environment / Grammar / Literal Edition)
Introduction de Python
[Ruby vs Python] Comparaison de référence entre Rails et Flask
Comparaison de l'implémentation de plusieurs moyennes mobiles exponentielles (DEMA, TEMA) en Python
Comprendre l'état de la perte de données - Python vs R
Comparaison de CoffeeScript avec la grammaire JavaScript, Python et Ruby
[Python] Opération d'énumération
Comparaison du temps d'exécution de Python SDP
Unification de l'environnement Python
Copie des préférences python
Principes de base du grattage Python
[python] comportement d'argmax
Comparaison des implémentations LDA
Comparaison des classificateurs en ligne
Utilisation des locaux Python ()
le zen de Python
Installation de Python 3.3 rc1
Comparaison des programmes d'adaptation
# 4 [python] Bases des fonctions
Connaissance de base de Python
Anecdotes sobres de python3
Comparaison du gestionnaire de packages Python
Bases de python: sortie
Installation de matplotlib (Python 3.3.2)
Application de Python 3 vars
Divers traitements de Python
Comparaison du code de moyenne mobile exponentielle (EMA) écrit en Python
Comparaison de la gestion des trames de données en Python (pandas), R, Pig