处理api网关请求的简单aws lambda代理
lambda-prox的Python项目详细描述
lambda代理
连接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 .
用法
使用GET请求
fromlambda_proxy.proxyimportAPIAPP=API(name="app")@APP.route('/test/tests/<id>',methods=['GET'],cors=True)defprint_id(id):return('OK','plain/text',id)
有POST请求
fromlambda_proxy.proxyimportAPIAPP=API(name="app")@APP.route('/test/tests/<id>',methods=['POST'],cors=True)defprint_id(id,body):return('OK','plain/text',id)
路线
路由模式与Flask中使用的路由模式类似
Variable parts in the route can be specified with angular brackets
/user/<username>
. By default a variable part in the URL accepts any string without a slash however a different converter can be specified as well by using<converter:name>
.
转换器:
int
:整数string
:字符串float
:浮点数uuid
:uuid
示例:
/app/<user>/<id>
(user
和id
是变量)/app/<string:value>/<float:num>
(value
将是一个字符串,而num
将是一个浮点数)
正则表达式
您还可以使用特殊转换器添加regex参数描述regex()
示例:
@APP.route("/app/<regex([a-z]+):regularuser>",methods=['GET'])defprint_user(regularuser):return('OK','plain/text',f"regular {regularuser}")@APP.route("/app/<regex([A-Z]+):capitaluser>",methods=['GET'])defprint_user(capitaluser):return('OK','plain/text',f"CAPITAL {capitaluser}")
警告
使用regex()时,必须使用不同的变量名,否则路由可能不会显示在文档中。
@APP.route("/app/<regex([a-z]+):user>",methods=['GET'])defprint_user(user):return('OK','plain/text',f"regular {user}")@APP.route("/app/<regex([A-Z]+):user>",methods=['GET'])defprint_user(user):return('OK','plain/text',f"CAPITAL {user}")
此应用程序将工作,但文档将只显示第二条路由,因为在openapi.json
中,两条路由的路由名称都是/app/{user}
。
路线选项
- path:url规则为字符串
- 方法:允许的http方法列表,默认值:[“get”]
- cors:允许cors,默认值:
False
- token:设置
access_token
验证 - payload_compression_方法:启用并选择输出正文压缩
- binary_b64encode:base64编码输出主体(api网关)
- ttl:缓存控制设置(生存时间)
- description:路由描述(用于文档)
- tag:标记列表(用于文档)
缓存控制
添加一个缓存控制头,以秒为单位显示生存时间(TTL)。
fromlambda_proxy.proxyimportAPIAPP=API(app_name="app")@APP.route('/test/tests/<id>',methods=['GET'],cors=True,ttl=3600)defprint_id(id):return('OK','plain/text',id)
二进制响应
在API网关上使用二进制文件时,必须返回base64编码的字符串
fromlambda_proxy.proxyimportAPIAPP=API(name="app")@APP.route('/test/tests/<filename>.jpg',methods=['GET'],cors=True,binary_b64encode=True)defprint_id(filename):withopen(f"{filename}.jpg","rb")asf:return('OK','image/jpeg',f.read())
压缩
如果在标题中找到“接受编码”,则启用压缩。
fromlambda_proxy.proxyimportAPIAPP=API(name="app")@APP.route('/test/tests/<filename>.jpg',methods=['GET'],cors=True,binary_b64encode=True,payload_compression_method="gzip")defprint_id(filename):withopen(f"{filename}.jpg","rb")asf:return('OK','image/jpeg',f.read())
简单身份验证令牌
lambda代理提供了一个简单的令牌验证系统。
- 必须在环境中设置“token”变量
- 每个请求必须提供一个“访问令牌”参数(例如curl http://myurl/test/tests/myid?access_token=blabla)
fromlambda_proxy.proxyimportAPIAPP=API(name="app")@APP.route('/test/tests/<id>',methods=['GET'],cors=True,token=True)defprint_id(id):return('OK','plain/text',id)
URL架构和请求参数
querystring参数作为函数的选项传递。
fromlambda_proxy.proxyimportAPIAPP=API(name="app")@APP.route('/<id>',methods=['GET'],cors=True)defprint_id(id,name=None):return('OK','plain/text',f"{id}{name}")
请求:
$ curl /000001 0001 $ curl /000001?name=vincent 0001vincent
多条路线
fromlambda_proxy.proxyimportAPIAPP=API(name="app")@APP.route('/<id>',methods=['GET'],cors=True)@APP.route('/<id>/<int:number>',methods=['GET'],cors=True)defprint_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
高级功能
上下文和事件传递
将事件和上下文传递给处理程序函数。
fromlambda_proxy.proxyimportAPIAPP=API(name="app")@APP.route("/<id>",methods=["GET"],cors=True)@APP.pass_event@APP.pass_contextdefprint_id(ctx,evt,id):print(ctx)print(evt)return('OK','plain/text',f"{id}")
自动OpenAPI文档
默认情况下,应用程序(lambda_proxy.proxy.API
)提供三(3)条路由:
/openapi.json
:打印openapi json定义/docs
:大摇大摆的html用户界面/redoc
:重做html用户界面
函数注释
为了能够呈现完整而精确的api文档,lambda_proxy使用python类型提示和注释link。
fromlambda_proxy.proxyimportAPIAPP=API(name="app")@APP.route('/test/<int:id>',methods=['GET'],cors=True)defprint_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代理支持自定义域和路径映射(请参见https://github.com/vincentsarago/lambda-proxy/issues/16)。
注意:当使用root
(/
)以外的路径映射时,/
路由将不可用。
fromlambda_proxy.proxyimportAPIapi=API(name="api",debug=True)# This route won't work when using path mapping@api.route("/",methods=["GET"],cors=True)# This route will work only if the path mapping is set to /api@api.route("/api",methods=["GET"],cors=True)defindex():html="""<!DOCTYPE html> <html> <header><title>This is title</title></header> <body> Hello world </body> </html>"""return("OK","text/html",html)@api.route("/yo",methods=["GET"],cors=True)defyo():return("OK","text/plain","YOOOOO")
插件
示例
- https://github.com/vincentsarago/lambda-proxy/tree/master/example
- https://github.com/RemotePixel/remotepixel-tiler
贡献与发展
问题和拉取请求非常受欢迎。
dev安装和拉取请求强>
$ git clone https://github.com/vincentsarago/lambda-proxy.git $ cd lambda-proxy $ pip install -e .[dev]
此repo设置为在提交新代码时使用pre-commit运行flake8、pydocstring和black(“不妥协的python代码格式化程序”)。
$ pre-commit install
$ git add .
$ git commit -m'my change'
black.........................Passed
Flake8........................Passed
Verifying PEP257 Compliance...Passed
$ git push origin