11

代替

  • (A) 采用更传统的方式在 AWS 上运行 Web 应用程序(例如,在 AWS EC2 或 Beanstalk 上使用 Ruby/Sinatra 或 Python/Flask),或

  • (C) 在 S3 中创建静态 HTML 和 JavaScript 文件,在 AWS Lambda 中创建动态 API 端点(将 JSON 数据发送到那些通过 JavaScript 使用/解释该数据的静态网页),

我想达到一个中间立场:

  • (B) 在 AWS Lambda 中创建 HTTP 端点(例如,在 Python 中),这些端点读取和使用 HTML 模板来生成对客户端的完整 HTML 响应。

该设置将生成一个无服务器 Web 应用程序,其中 AWS Lambda 函数提供服务器端(讽刺的是我并没有忘记)生成的 HTML 输出。

在 AWS Lambda 函数的 Python 代码中,可以包含 HTML 代码片段,在函数中修改(填充数据),并将 HTML 作为text/html输出返回给客户端。这种方法的缺点是 HTML 模板随后被“嵌入”在 Python 代码中,而不是外部的单独文件中。

Q1:如何在代码包的某个地方引用 HTML 模板文件 - 模板应该是包的一部分 - 让 Python 函数读取它,并通过模板中的变量替换生成 HMTL 页面?

Q2:如何使用 AWS 无服务器应用程序模型 (AWS SAM) 在我的项目中指定/包含/链接到一组 HTML 模板文件?

4

1 回答 1

8

我不确定你从哪里开始,所以我从头开始。

  1. 创建引用处理程序和事件资源的 YAML 配置文件并放入deployment文件夹中。

  2. 对于模板,使用“Mustashe for Python” pystashe

  3. 在 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>
    
  4. 创建data对象以填充参数化模板:

    {
      "name": "Tom Thumb",
      "phone": "0123456789"
    }
    
  5. template从项目中的位置加载

    template = file('%s/mypath/template.html'%py_root).read()
    
  6. 从数据对象渲染页面:

    myhtml = pystache.render(template, data)
    
  7. 将渲染后的 html 返回给客户端:

    response = {
        "statusCode": 200,
        "body": myhtml,
        "headers": {
            'Content-Type': 'text/html',
        }
    }
    
  8. 压缩 python 代码、站点包和 html 文件并放入deployment文件夹中。

  9. 从该deployment文件夹中,打包准备并上传到 S3 的 SAM 项目:

    aws cloudformation package --template-file myservice.yml --output-template-file deploy-myservice.yml --s3-bucket myserverless-deploy
    
  10. 从该deployment文件夹中,将 SAM 项目部署到 AWS:

    aws cloudformation deploy --template-file deploy-myservice.yml --stack-name mycontext-myservice-dev --capabilities CAPABILITY_IAM
    

作为记录,我更喜欢选项 C,使用 NodeJS ... :)

于 2018-10-25T13:25:42.550 回答