Cet article est le 23e jour du Calendrier de l'Avent 2016 sans serveur (2).
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.
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