简单的AWS Lambda代理,用于处理API网关请求
项目描述
lambda-proxy
一个零要求代理,将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>
(user
和id
是变量)/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提供了一个简单的令牌验证系统。
- 必须在环境中设置一个“TOKEN”变量
- 每个请求都必须提供“access_token”参数(例如 curl http://myurl/test/tests/myid?access_token=blabla)
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 -
/redoc
:Redoc html UI
函数注解
为了能够渲染完整且精确的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")
插件
- 添加缓存层:链接
示例
- https://github.com/vincentsarago/lambda-proxy/tree/master/example
- https://github.com/RemotePixel/remotepixel-tiler
贡献与发展
欢迎提交问题和pull请求。
开发安装与Pull-Request
$ git clone https://github.com/vincentsarago/lambda-proxy.git
$ cd lambda-proxy
$ pip install -e .[dev]
仅支持Python3.7
此存储库设置为在提交新代码时使用pre-commit运行 mypy、flake8、pydocstring 和 black(“无妥协的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的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 6d4a1323c2fdd59d97a57338efe8b9db4283ac7c51d295c9b4f55cfe1b055634 |
|
MD5 | ad05428e3cce7620ddeb24f4b1f57099 |
|
BLAKE2b-256 | 577958a6927147afd1ce541c0c4ea950479cbb4224624ee2b641990a90f01359 |