Vergleich von Python Serverless Frameworks-Zappa mit Chalice

Einführung

Dieser Artikel ist der 23. Tag des Serverlosen (2) Adventskalenders 2016.

Python Serverless Framework

Die folgenden beiden scheinen als Frameworks für die Entwicklung serverloser Anwendungen mit Python beliebt zu sein.

Vergleichen wir diesmal diese beiden grob.

Wenn Sie Node.js verwenden, sind übrigens Serverless Framework und Apex berühmt. Die folgenden Folien helfen Ihnen herauszufinden, welche anderen serverlosen Frameworks verfügbar sind. Unlimited Frameworks

chalice Python Serverless Microframework for AWS

Dies ist der einzige Befehl, der vorbereitet wird.

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

Schauen wir uns den Quellcode anhand des eigentlichen Kelches an, indem wir auf So erstellen Sie einen Miniaturbild-API-Service mit AWS Lambda verweisen.

App.py übernimmt den Empfang von Fotos per POST und das Generieren von Miniaturansichten.

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

Dann ist die Anwendung, die wie Kelch Miniaturansichten der von POST empfangenen Fotos generiert, Erstellen von Serverless Microservices mit Zappa und Flask --Gun.io Verweisen wir auf -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')

Im Gegensatz zu Kelch können Sie die WSGI-Anwendung bereitstellen, um gemeinsam einen Bildschirm zum Hochladen von Fotos usw. vorzubereiten.

Sie können auch die AWS-Ereignisquelle verwenden, um eine nicht blockierende Miniaturbildverarbeitung mit dem Hochladen auf S3 als Hook durchzuführen.

# 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')

Weitere Informationen finden Sie unter Serverloser Framework-Vergleich - Zappa versus Kelch.

Referenziert

abschließend

Zappa scheint die Nummer eins in [Top 10 Python-Bibliotheken des Jahres 2016 - Tryolabs Blog] zu sein (https://tryolabs.com/blog/2016/12/20/top-10-python-libraries-of-2016) Darüber hinaus scheint Zappa ab Dezember 2016 beliebter zu sein als Charice.

Aber wie wir hier gesehen haben, sind die beiden Frameworks unterschiedlich und unterschiedlich. Ich hoffe, dass der serverlose Python-Framework-Bereich spannender wird, wenn er entsprechend dem Zweck richtig verwendet wird.

Recommended Posts

Vergleich von Python Serverless Frameworks-Zappa mit Chalice
Mit Python mit Kelch ganz einfach ohne Server
Vergleich von 4 Arten von Python-Webframeworks
Geschwindigkeitsvergleich der Python-XML-Perspektive
Vergleich der Matrixtranspositionsgeschwindigkeit durch Python
Erster Python 3 ~ Erster Vergleich ~
Leistungsvergleich des Gesichtsdetektors mit Python + OpenCV
Python Geschwindigkeitsvergleich Regex vs Startwith vs Str [: word_length]
[Python3] Geschwindigkeitsvergleich usw. über den Entzug von numpy.ndarray
Python-Grundlagen ①
Grundlagen von Python ①
Gründlicher Vergleich von drei morphologischen Python-Analysebibliotheken
Kopie von Python
Einfacher Vergleich von Python-Bibliotheken, die Excel betreiben
R- und Python-Schreibvergleich (euklidische Methode der gegenseitigen Teilung)
Vergleich von Python und Ruby (Environment / Grammar / Literal Edition)
Einführung von Python
[Ruby vs Python] Benchmark-Vergleich zwischen Rails und Flask
Vergleich der Implementierung mehrerer exponentieller gleitender Durchschnitte (DEMA, TEMA) in Python
Verstehen Sie den Status des Datenverlusts - Python vs. R.
Vergleich von CoffeeScript mit JavaScript-, Python- und Ruby-Grammatik
[Python] Operation der Aufzählung
Vergleich der Ausführungszeit von Python SDP
Vereinheitlichung der Python-Umgebung
Kopie der Python-Einstellungen
Grundlagen der Python-Scraping-Grundlagen
[Python] Verhalten von Argmax
Vergleich von LDA-Implementierungen
Vergleich von Online-Klassifikatoren
Verwendung von Python-Einheimischen ()
der Zen von Python
Installieren von Python 3.3 rc1
Vergleich der Anpassungsprogramme
# 4 [Python] Grundlagen der Funktionen
Grundkenntnisse in Python
Nüchterne Trivia von Python3
Python Package Manager-Vergleich
Grundlagen von Python: Ausgabe
Installation von matplotlib (Python 3.3.2)
Anwendung von Python 3 vars
Verschiedene Verarbeitung von Python
Vergleich des in Python geschriebenen EMA-Codes (Exponential Moving Average)
Vergleich der Datenrahmenbehandlung in Python (Pandas), R, Pig