跳转到主要内容

简单的AWS Lambda代理,用于处理API网关请求

项目描述

lambda-proxy

Packaging status CircleCI codecov

一个零要求代理,将AWS API网关 {proxy+} 请求和AWS Lambda链接起来。

安装

$ pip install -U pip
$ pip install lambda-proxy

或从源安装

$ git clone https://github.com/vincentsarag/lambda-proxy.git
$ cd lambda-proxy
$ pip install -U pip
$ pip install -e .

用法

Lambda代理设计得可以很好地与API网关的REST API以及更新、更便宜的HTTP API一起使用。如果您在使用HTTP API时遇到问题,请创建一个问题。

使用GET请求

from lambda_proxy.proxy import API

APP = API(name="app")

@APP.route('/test/tests/<id>', methods=['GET'], cors=True)
def print_id(id):
    return ('OK', 'plain/text', id)

使用POST请求

from lambda_proxy.proxy import API

APP = API(name="app")

@APP.route('/test/tests/<id>', methods=['POST'], cors=True)
def print_id(id, body):
    return ('OK', 'plain/text', id)

注意

从版本5.2.0开始,用户现在可以使用 @APP.get@APP.post 添加路由,从而不再需要添加 methods=[**]

二进制主体

从版本5.0.0开始,lambda-proxy将在POST消息上解码base64编码的主体。

5.0.0之前

from lambda_proxy.proxy import API

APP = API(name="app")

@APP.route('/test', methods=['POST']e)
def print_id(body):
    body = json.loads(base64.b64decode(body).decode())

5.0.0之后

from lambda_proxy.proxy import API

APP = API(name="app")

@APP.route('/test', methods=['POST']e)
def print_id(body):
    body = json.loads(body)

路由

路由模式与Flask中使用的模式相似。

路由中的变量部分可以用尖括号 /user/<username> 指定。默认情况下,URL中的变量部分接受任何不带斜杠的字符串,但也可以使用 <converter:name> 指定不同的转换器。

转换器

  • int: 整数
  • string: 字符串
  • float: 浮点数
  • uuid: UUID

示例

  • /app/<user>/<id>userid 是变量)
  • /app/<string:value>/<float:num>value 将是一个字符串,而 num 将是一个浮点数)

正则表达式

您还可以使用特殊转换器 regex() 添加正则表达式参数描述。

示例

@APP.get("/app/<regex([a-z]+):regularuser>")
def print_user(regularuser):
    return ('OK', 'plain/text', f"regular {regularuser}")

@APP.get("/app/<regex([A-Z]+):capitaluser>")
def print_user(capitaluser):
    return ('OK', 'plain/text', f"CAPITAL {capitaluser}")

警告

当使用 regex() 时,您必须使用不同的变量名,否则路由可能不会在文档中显示。

@APP.get("/app/<regex([a-z]+):user>")
def print_user(user):
    return ('OK', 'plain/text', f"regular {user}")

@APP.get("/app/<regex([A-Z]+):user>")
def print_user(user):
    return ('OK', 'plain/text', f"CAPITAL {user}")

此应用将正常工作,但文档只会显示第二条路由,因为在 openapi.json 中,两条路由的路径名都将为 /app/{user}

路由选项

  • path:URL规则字符串
  • methods:允许的HTTP方法列表,默认:["GET"]
  • cors:允许CORS,默认:False
  • token:设置 access_token 验证
  • payload_compression_method:启用并选择输出体压缩
  • binary_b64encode:对输出体进行base64编码(API网关)
  • ttl:缓存控制设置(生存时间)(在6.0.0版本中已弃用)
  • cache_control:缓存控制设置
  • description:路由描述(用于文档)
  • tag:标签列表(用于文档)

缓存控制

添加一个缓存控制头,包含以秒为单位的生存时间(TTL)。

from lambda_proxy.proxy import API
APP = API(app_name="app")

@APP.get('/test/tests/<id>', cors=True, cache_control="public,max-age=3600")
def print_id(id):
   return ('OK', 'plain/text', id)

注意:如果函数返回的不是“OK”,则Cache-Control将被设置为 no-cache

二进制响应

当在API网关上处理二进制数据时,我们必须返回一个base64编码的字符串

from lambda_proxy.proxy import API

APP = API(name="app")

@APP.get('/test/tests/<filename>.jpg', cors=True, binary_b64encode=True)
def print_id(filename):
    with open(f"{filename}.jpg", "rb") as f:
        return ('OK', 'image/jpeg', f.read())

压缩

如果头部中存在“Accept-Encoding”,则启用压缩。

from lambda_proxy.proxy import API

APP = API(name="app")

@APP.get(
   '/test/tests/<filename>.jpg',
   cors=True,
   binary_b64encode=True,
   payload_compression_method="gzip"
)
def print_id(filename):
    with open(f"{filename}.jpg", "rb") as f:
       return ('OK', 'image/jpeg', f.read())

简单认证令牌

Lambda-proxy提供了一个简单的令牌验证系统。

from lambda_proxy.proxy import API

APP = API(name="app")

@APP.get('/test/tests/<id>', cors=True, token=True)
def print_id(id):
    return ('OK', 'plain/text', id)

URL模式和请求参数

查询字符串参数作为函数的选项传递。

from lambda_proxy.proxy import API

APP = API(name="app")

@APP.get('/<id>', cors=True)
def print_id(id, name=None):
    return ('OK', 'plain/text', f"{id}{name}")

请求

$ curl /000001
   0001

$ curl /000001?name=vincent
   0001vincent

多条路由

from lambda_proxy.proxy import API
APP = API(name="app")

@APP.get('/<id>', cors=True)
@APP.get('/<id>/<int:number>', cors=True)
def print_id(id, number=None, name=None):
    return ('OK', 'plain/text', f"{id}-{name}-{number}")

请求

$ curl /000001
   0001--

$ curl /000001?name=vincent
   0001-vincent-

$ curl /000001/1?name=vincent
   0001-vincent-1

高级功能

上下文和事件传递

将事件和上下文传递到处理函数。

from lambda_proxy.proxy import API

APP = API(name="app")

@APP.get("/<id>", cors=True)
@APP.pass_event
@APP.pass_context
def print_id(ctx, evt, id):
    print(ctx)
    print(evt)
    return ('OK', 'plain/text', f"{id}")

自动OpenAPI文档

默认情况下,APP(lambda_proxy.proxy.API)提供了三个(3)路由

  • /openapi.json:打印OpenAPI JSON定义

  • /docs:swagger html UI swagger

  • /redoc:Redoc html UI redoc

函数注解

为了能够渲染完整且精确的API文档,lambda_proxy使用Python类型提示和注解链接

from lambda_proxy.proxy import API

APP = API(name="app")

@APP.route('/test/<int:id>', methods=['GET'], cors=True)
def print_id(id: int, num: float = 0.2) -> Tuple(str, str, str):
    return ('OK', 'plain/text', id)

在上面的例子中,我们的路由 /test/<int:id> 定义了一个输入 id 应该是 INT,同时我们也将此提示添加到函数 print_id 中,我们还指定了 num 选项的类型(和默认值)。

自定义域名和路径映射

从版本4.1.1开始,lambda-proxy支持自定义域名和路径映射(见链接)。

注意:当使用除 root(《/》)之外的路由映射时,/ 路由将不可用。

from lambda_proxy.proxy import API

api = API(name="api", debug=True)


# This route won't work when using path mapping
@api.get("/", cors=True)
# This route will work only if the path mapping is set to /api
@api.get("/api", cors=True)
def index():
    html = """<!DOCTYPE html>
    <html>
        <header><title>This is title</title></header>
        <body>
            Hello world
        </body>
    </html>"""
    return ("OK", "text/html", html)


@api.get("/yo", cors=True)
def yo():
    return ("OK", "text/plain", "YOOOOO")

插件

示例

贡献与发展

欢迎提交问题和pull请求。

开发安装与Pull-Request

$ git clone https://github.com/vincentsarago/lambda-proxy.git
$ cd lambda-proxy
$ pip install -e .[dev]

仅支持Python3.7

此存储库设置为在提交新代码时使用pre-commit运行 mypyflake8pydocstringblack(“无妥协的Python代码格式化器”)。

$ pre-commit install
$ git add .
$ git commit -m'my change'
   black.........................Passed
   Flake8........................Passed
   Verifying PEP257 Compliance...Passed
   mypy..........................Passed
$ git push origin

许可

LICENSE.txt

作者

AUTHORS.txt

变更

CHANGES.txt

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分发

lambda-proxy-5.2.1.tar.gz (17.4 kB 查看哈希值)

上传时间

支持者