Python WSGI Web 服务迁移至函数计算什么是WSGI
WSGI全称: Web Server Gateway Interface,Web服务器网关接口。WSGI定义了Web服务器与Python应用程序的交互,使得使用Python写的Web应用程序可以和Web服务器对接起来。最新官方版本在Python的PEP-3333中定义。
函数计算与WSGI
用户的application函数可以完全自行实现,也可以基于WSGI的web框架进行函数开发。目前,很多Frameworks是基于WSGI协议,比较常见的如Flask、Django等,具体可参考Frameworks that run on WSGI。
函数计算Python接口支持WSGI
函数计算内置API网关触发器event到WSGI接口的转换库jdcloud_wsgi_wrapper,通过引用jdcloud_wsgi_wrapper中的wsgi_run函数将API网关的event事件转换为WSGI协议格式,并运行应用程序。
参考以下用户采用application方式或类方式编写函数入口函数:
from jdcloud_wsgi_wrapper import wsgi_rundef application(environ, start_response): print(environ['function.event']) print(environ['function.context']) status = "200 OK" path = environ["PATH_INFO"] print(path) length = int(environ["CONTENT_LENGTH"], 0) body = environ["wsgi.input"].read(length) print(body) response_headers = [('Content-type', 'text/plain')] start_response(status, response_headers) return ['Function : My Own Hello World!']class AppClass: def __init__(self, environ, start_response): self.environ = environ self.start_response = start_response def __iter__(self): self.start_response('200 OK', [('Content-type', 'txt/plain')]) yield "Hello World"def handler(event, context): result = wsgi_run(event, context, AppClass) return result
迁移 django 框架服务至函数计算step1:virtualenv开发代码迁移
在使用virtualenv的开发环境中,使用pip freeze 查看代码的依赖,将依赖包和源代码一起打包。这里使用引入beatifulsoup库的代码作为示例,具体操作如下:
? dev$ mkdir venv-test? dev$ cd venv-test? venv-test$ virtualenv --no-site-packages venv? venv-test$ . ./venv/bin/activate(venv) ? venv-test$ pip install beautifulsoup4(venv) ? venv-test$ vim test.pyfrom bs4 import BeautifulSoupsoup = BeautifulSoup("pSomebbadiHTML",features="html.parser")print(soup.prettify())(venv) ? venv-test$ pip freezebeautifulsoup4==4.7.1soupsieve==1.9.2(venv) ? venv-test$ cp -R venv/lib/python3.7/site-packages/bs4 .(venv) ? venv-test$ cp -R venv/lib/python3.7/site-packages/soupsieve .(venv) ? venv-test$ zip -r code.zip bs4 soupsieve test.py
code.zip作为程序包上传置函数计算中,其中包括:
源码:test.py
依赖库:bs4 soupsieve
step2:django代码迁移
在工程目录下执行以下文件pack.sh,其中:
1.修改project为django project名称;
2.LIBPATH为virtualenv的路径下的依赖包目录。
pack.sh完成以下工作:
1.生成index.py,作为函数计算的入口函数;
2.将代码和依赖包打包成code.zip,作为上传到函数计算的代码包。
#!/bin/bashexport PROJECT=mysiteexport LIBPATH=venv/lib/python3.7/site-packages cat EOF index.pyimport sys,ossys.path.append(os.path.dirname(os.path.abspath(__file__))+'/' + '$PROJECT')sys.path.append(os.path.dirname(os.path.abspath(__file__))+'/' + '$LIBPATH') from $PROJECT.wsgi import application as appfrom jdcloud_wsgi_wrapper import wsgi_rundef handler(event, context): result=wsgi_run(event, context, app) return resultEOF ZIPFILE="index.py "$PROJECT" "require=`pip freeze $PROJECT | awk -F'==' '{print tolower($1)}'`for i in $requiredo ZIPFILE=$ZIPFILE" "$LIBPATH"/"$i" "doneecho $ZIPFILEzip -r -q code.zip $ZIPFILE
index.py函数如下:
import sys,ossys.path.append(os.path.dirname(os.path.abspath(__file__))+'/' + 'mysite')sys.path.append(os.path.dirname(os.path.abspath(__file__))+'/' + 'venv/lib/python3.6/site-packages') from mysite.wsgi import application as appfrom jdcloud_wsgi_wrapper import wsgi_rundef handler(event, context): result=wsgi_run(event, context, app) return result
step3:购买函数并配置触发器验证
1.在阿里云函数计算控制台购买函数,上传code.zip代码包,入口函数为index.handler。
2.配置测试事件进行控制台测试,符合代码预期后,配置API网关触发器,验证触发器执行结果,配置步骤及方法请参见如何使用API网关触发器 。
在浏览器中打开链接,返回执行结果如下:
以上,快速完成代码迁移与验证。
同理,可从flask框架迁移服务代码至函数计算,只需将服务代码及依赖打包上传至函数计算,修改入口函数完成API网关的event事件转换为WSGI函数格式,参考step2中的index.py函数,即可轻松完成服务迁移。