处理api网关请求的简单aws lambda代理

lambda-prox的Python项目详细描述


lambda代理

Packaging statusCircleCIcodecov

连接aws api网关{proxy+}请求和aws lambda的零需求代理。

Capture d’écran, le 2019-05-31 à 22 56 35

安装

$ 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>userid是变量)
  • /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代理提供了一个简单的令牌验证系统。

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用户界面 swagger

  • /redoc:重做html用户界面 redoc

函数注释

为了能够呈现完整而精确的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")

插件

示例

贡献与发展

问题和拉取请求非常受欢迎。

dev安装和拉取请求

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

此repo设置为在提交新代码时使用pre-commit运行flake8pydocstringblack(“不妥协的python代码格式化程序”)。

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

许可证

LICENSE.txt

作者

AUTHORS.txt

变化

CHANGES.txt

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
JAVAexists()方法始终返回false   java SNMP4J v2c陷阱发送速度非常慢   java计算给定单词中字母的频率   在java中执行curl命令获取异常   java按下按钮时,应显示一个数字,并在日期选择器处计数   java递归将括号设置为字符串字符   节点。java中AWS IOT按钮的js Lambda函数   删除ArrayList中的所有空格。JAVA   java我可以在eclipse中定义一个显示html文件的视图吗?   java为什么RestController公开Crudepository中的所有操作?   春季3.2。使用java8的x   java迭代器如何使用构造函数   java Jersey客户端关闭InputStream响应它真的有效吗?   Java从剪贴板检索XML(Excel)电子表格   java线程被卡住,因为在运行中有一个永无止境的函数   基于Java编程的Amazon云开发