Skip to main content

Add a new layer ("lâmina") to AWS lambda functions

Project description

Welcome to Lamina

PyPI PyPI - Python Version

This library adds a new layer ("lâmina") to AWS lambda functions, integrating synchronous and asynchronous code in a single function, which use Pydantic models to validate input and output data.


Install

$ pip install py-lamina

This library is compatible with Python 3.9, 3.10 and 3.11.


Usage

Create the models for Input and Output data:

# schemas.py

from pydantic import BaseModel

class ExampleInput(BaseModel):
    name: str
    age: int

class ExampleOutput(BaseModel):
    message: str

Create your AWS Lambda handler:

# main.py
from typing import Any, Dict, Tuple, Union
from lamina import lamina, Request
from .schemas import ExampleInput, ExampleOutput

@lamina(schema=ExampleInput, schema_out=ExampleOutput)
def handler(request: Request) -> Dict[str, Any]:
    response = {"message": f"Hello {request.data.name}, you are {request.data.age} years old!"}
    return response

You can also use an async handler:

# main.py
import asyncio

@lamina(schema=ExampleInput, schema_out=ExampleOutput)
async def handler(request: Request) -> Dict[str, Any]:
    await asyncio.sleep(1)
    response = {"message": f"Hello {request.data.name}, you are {request.data.age} years old!"}
    return response

The Response Status Code

Default value is 200. You can change it by returning a tuple with the response and the status code:

@lamina(schema=ExampleInput, schema_out=ExampleOutput)
def handler(request: Request) -> Tuple[Dict[str, Any], int]:
    response = {"message": f"Hello {request.data.name}, you are {request.data.age} years old!"}
    return response, 201

The Response Content Type

Default content type is application/json; charset=utf-8. You can change it by defining the content_type parameter:

@lamina(schema=ExampleInput, content_type=Lamina.HTML)
def handler(request: Request) -> Tuple[str, int]:
    html_404 = """
        <html>
            <head><title>404 Not Found</title></head>
            <body>
                <h1>404 Not Found</h1>
            </body>
        </html>
    """
    return html_404, 404

The Response Headers

Default header contains the Content Type defined in decorator or {"Content-Type": "application/json; charset=utf-8"} by default. You can add more headers it by returning a dict in the function return tuple:

@lamina(schema=ExampleInput, content_type=Lamina.HTML)
def handler(request: Request) -> str:
    return None, 403, {"Location": "https://www.example.com"}

This dict will be merged with the default header.

The Request object

The Request object has the following attributes:

  • data: The input data, already validated by the schema.
  • event: The original event received by the lambda function.
  • context: The original context received by the lambda function.

You can use lamina without one or both schemas, if you like:

# main.py
import json
from typing import Any, Dict

from lamina import lamina, Request


@lamina()
def handler(request: Request) -> Dict[str, Any]:
    body = request.event["body"]
    data = json.loads(body)
    response = {"message": f"Hello {data.name}, you are {data.age} years old!"}
    return response

Please note, if you do not define a SchemaIn, the data attribute will contain the original body from event. You need to validate it yourself and convert it to a dict, bytes, etc... you need before using the data received.


License

This project is licensed under the terms of the MIT license.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

py_lamina-2.3.0.tar.gz (5.0 kB view details)

Uploaded Source

Built Distribution

py_lamina-2.3.0-py3-none-any.whl (5.5 kB view details)

Uploaded Python 3

File details

Details for the file py_lamina-2.3.0.tar.gz.

File metadata

  • Download URL: py_lamina-2.3.0.tar.gz
  • Upload date:
  • Size: 5.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.11.1 readme-renderer/44.0 requests/2.32.3 requests-toolbelt/1.0.0 urllib3/2.2.3 tqdm/4.66.5 importlib-metadata/8.5.0 keyring/25.4.1 rfc3986/2.0.0 colorama/0.4.6 CPython/3.10.15

File hashes

Hashes for py_lamina-2.3.0.tar.gz
Algorithm Hash digest
SHA256 4d4887da2c1727d62c01dcc53eae5b75558b08f8a0f1a3f16f517b2712d4719c
MD5 3b09e4974f70a86117cad244d8bdccaf
BLAKE2b-256 5361fe032b0ff28baac7b478556a2fdc42eb123b9aeb1f516259a5875f3569d4

See more details on using hashes here.

File details

Details for the file py_lamina-2.3.0-py3-none-any.whl.

File metadata

  • Download URL: py_lamina-2.3.0-py3-none-any.whl
  • Upload date:
  • Size: 5.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.11.1 readme-renderer/44.0 requests/2.32.3 requests-toolbelt/1.0.0 urllib3/2.2.3 tqdm/4.66.5 importlib-metadata/8.5.0 keyring/25.4.1 rfc3986/2.0.0 colorama/0.4.6 CPython/3.10.15

File hashes

Hashes for py_lamina-2.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 51b94ef7e548b5c79dc057f7a0d022a5af53a55d7071cca383124627971c5a02
MD5 55dbc9d3417b6d03944004d75158468f
BLAKE2b-256 c80de23298b8fc985c410ef97e2ad27d964c88c17666bcb08cd4a89d3e22b696

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page