代替
(A)采用更传统的方法在AWS上运行Web应用程序(例如,在AWS EC2或Beanstalk上使用Ruby / Sinatra或Python / Flask),或
(C)在S3中创建静态HTML和JavaScript文件,在AWS Lambda中创建动态API端点(将JSON数据发送到通过JavaScript使用/解释该数据的那些静态网页),
我想达到中间立场:
(B)在AWS Lambda(例如,Python)中创建HTTP端点,该端点读取并使用HTML模板以生成对客户端的完整HTML响应。
该设置将导致一个无服务器的Web应用程序,在该应用程序中,AWS Lambda函数将提供服务器端生成的HTML输出(具有讽刺意味的是,对我而言并不丢人)。
在适用于AWS Lambda函数的Python代码中,可以包括HTML代码片段,对其进行修改(用数据填充),然后将HTML作为text/html
输出返回给客户端。这种方法的缺点是HTML模板然后“嵌入”在Python代码中,而不是外部在单独的文件中。
问题1:如何在代码包中的某个位置引用HTML模板文件-模板应作为包的一部分-由Python函数读取该HTML模板文件,并通过模板中的变量替换生成HMTL页面?
问题2:如何使用AWS无服务器应用程序模型(AWS SAM)在项目中指定/包括/链接到一组HTML模板文件?
最佳答案
我不确定您从哪里开始,所以我将从头开始。
创建引用处理程序和事件资源的YAML Config文件,并将其放在deployment
文件夹中。
对于模板,请使用“ Mustashe for Python” pystashe。
在您的Python项目/ Virtualenv中创建参数化的HTML模板:
<html>
<head>
<title>Customer: {{name}}</title>
</head>
<body>
<div>
<h2>Customer Name: {{name}}</h2>
<h4>Phone Number: {{phone}}</h4>
</div>
</body>
</html>
创建
data
对象以填充参数化模板:{
"name": "Tom Thumb",
"phone": "0123456789"
}
从项目中的位置加载
template
template = file('%s/mypath/template.html'%py_root).read()
从数据对象渲染页面:
myhtml = pystache.render(template, data)
将渲染的html返回给客户端:
response = {
"statusCode": 200,
"body": myhtml,
"headers": {
'Content-Type': 'text/html',
}
}
压缩python代码,站点程序包和html文件,并将其放在
deployment
文件夹中。从
deployment
文件夹打包SAM项目,该项目准备并上传到S3:aws cloudformation package --template-file myservice.yml --output-template-file deploy-myservice.yml --s3-bucket myserverless-deploy
从
deployment
文件夹,将SAM项目部署到AWS:aws cloudformation deploy --template-file deploy-myservice.yml --stack-name mycontext-myservice-dev --capabilities CAPABILITY_IAM
作为记录,我更喜欢使用NodeJS ...的选项C :)