Dieser Artikel ist der 23. Tag des Serverlosen (2) Adventskalenders 2016.
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.
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