30、利用 Zappa 部署应用及相关配置优化

利用 Zappa 部署 Flask 应用及配置优化

利用 Zappa 部署应用及相关配置优化

1. 使用 Zappa 部署 Flask 应用

Zappa 是一个用 Python 开发的工具,能轻松构建和部署无服务器 Python 应用。以下是使用 Zappa 部署 Flask 应用的详细步骤:
- 安装 Zappa :在项目开发使用的虚拟环境中,运行 pipenv install zappa 命令进行安装。
- 配置 Zappa
1. 确保拥有有效的 AWS 账户,且 AWS 凭证文件已就位。
2. 运行 zappa init 命令开始配置。过程中会有一系列询问:
- 询问环境名称,默认按回车键选择 dev
- 询问 AWS S3 存储桶名称,可指定现有存储桶或创建新的。
- Zappa 会自动检测要部署的应用,通常可按回车键使用默认值。
- 询问是否全局部署应用,开发环境选 n 即可。
3. 配置完成后,会在应用根目录生成 zappa_settings.json 文件,示例内容如下:

{
    "dev": {
        "app_function": "notify-service.app",
        "aws_region": "eu-west-2",
        "project_name": "notifier",
        "runtime": "python3.6",
        "s3_bucket": "zappa-43ivixfl0"
    }
}
  • 部署应用 :在终端运行 zappa deploy dev 命令,部署完成后会显示应用部署的 URL。例如: https://rpa5v43ey1.execute-api.eu-west-2.amazonaws.com/dev
  • 查看部署信息 :使用 zappa status 命令可查看更多部署信息。
2. 限制 API 端点访问

Flask 应用部署后,任何人都可向 AWS API Gateway 上配置的端点发出请求。为限制只有包含访问密钥的请求才能访问,可按以下步骤操作:
1. 登录 AWS 控制台,在服务菜单中搜索并选择 Amazon API Gateway。
2. 定义使用计划:
- 点击 Usage Plans ,再点击 Create 按钮,创建新的使用计划。
- 输入名称 up-blueprints ,取消勾选 Enable throttling Enable Quota 复选框,点击 Next
3. 关联 API 阶段:
- 点击 Add API Stage 按钮,在下拉列表中选择 notifier-dev 和阶段 dev
- 确保点击下拉菜单同一行的复选框,否则 Next 按钮无法启用。
4. 添加 API 密钥:
- 点击 Create API Key and add to Usage Plan 按钮,创建新的 API 密钥。
- 输入名称 notifiers-devs 并保存。
5. 修改 API 方法请求:
- 在左侧菜单中选择 APIs -> notifier-dev -> Resources ,在 Resources 选项卡中选择根路由 /
- 点击 ANY ,再点击 Method Request
- 点击 API Key Required 旁边的笔图标,在下拉菜单中选择 true
6. 获取 API 密钥:点击 API Keys 中的 notifier-keys ,在右侧面板点击 show 链接,复制显示的 API 密钥。

3. 修改订单服务

为使订单微服务能利用通知应用,在新订单到达和订单状态变为已发货时发送通知,需进行以下修改:
1. 添加配置信息 :在 order 目录的 settings.py 文件末尾添加以下内容:

NOTIFIER_BASEURL = 'https://rpa5v43ey1.execute-api.eu-west-2.amazonaws.com/dev'
NOTIFIER_API_KEY = 'WQk********P7JR2******kI1K*****r'

若没有 NOTIFIER_BASEURL 的值,可运行 zappa status 命令获取。
2. 创建 notification_type.py 文件 :在 order/main 目录创建该文件,定义通知类型枚举:

from enum import Enum, auto

class NotificationType(Enum):
    ORDER_RECEIVED = auto()
    ORDER_SHIPPED = auto()
  1. 创建 notifier.py 文件 :在 order/main 目录创建该文件,定义调用通知服务的辅助函数:
import requests
import json
from order import settings
from .notification_type import NotificationType

def notify(order, notification_type):
    endpoint = ('notify/order-received/'
                if notification_type is NotificationType.ORDER_RECEIVED
                else 'notify/order-shipped/')
    header = {
        'X-API-Key': settings.NOTIFIER_API_KEY
    }
    response = requests.post(
        f'{settings.NOTIFIER_BASEURL}/{endpoint}',
        json.dumps(order.data),
        headers=header
    )
    return response
  1. 修改 view.py 文件 :在 order/main 目录的 view.py 文件中添加以下导入语句:
from .notifier import notify
from .notification_type import NotificationType

CreateOrderView 类的 post 方法中,在返回 201 响应之前添加以下代码:

notify(OrderSerializer(order),
       NotificationType.ORDER_RECEIVED)
  1. 修改 admin.py 文件 :在 order/main 目录的 admin.py 文件中添加以下导入语句:
from .notifier import notify
from .notification_type import NotificationType
from .serializers import OrderSerializer
from .status import Status

添加 OrderAdmin 类:

class OrderAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        order_current_status = Status(obj.status)
        status_changed = 'status' in form.changed_data
        if (status_changed and order_current_status is 
           Status.Shipping):
            notify(OrderSerializer(obj), 
            NotificationType.ORDER_SHIPPED)
        super(OrderAdmin, self).save_model(request, obj, form,  
        change)

admin.site.register(Order) 替换为 admin.site.register(Order, OrderAdmin)

4. 测试所有组件

完成上述操作后,可按以下步骤测试所有应用是否协同工作:
1. 启动 Django 开发服务器:打开终端,切换到在线游戏商店项目目录,运行 python manage.py runserver 命令,服务器将在默认端口 8000 运行。
2. 启动订单微服务:打开另一个终端窗口,切换到订单微服务项目目录,运行 python manage.py runserver 127.0.0.1:8001 命令。
3. 测试订单发送:
- 浏览到 http://127.0.0.1:8000 ,登录应用并添加商品到购物车。
- 点击 SEND ORDER 按钮,页面应显示订单已发送的通知。
- 检查用户邮箱,确认是否收到订单确认邮件。
4. 测试订单发货通知:
- 浏览到 http://localhost:8001/admin/ ,使用管理员凭据登录。
- 点击 Orders ,选择刚提交的订单,将 Status 改为 Shipping 并点击 SAVE 按钮。
- 再次检查用户邮箱,确认是否收到订单已发货的确认邮件。

通过以上步骤,我们成功使用 Zappa 部署了 Flask 应用,限制了 API 端点访问,修改了订单服务以集成通知功能,并进行了全面测试,确保各组件协同工作。

利用 Zappa 部署应用及相关配置优化

5. 总结与拓展

在整个过程中,我们完成了多个关键步骤,下面通过表格来总结这些步骤及其作用:
|步骤|描述|作用|
| ---- | ---- | ---- |
|使用 Zappa 部署 Flask 应用|安装 Zappa、配置并部署应用|将 Flask 应用轻松部署到 AWS Lambda 上,实现无服务器架构|
|限制 API 端点访问|定义使用计划、关联 API 阶段、添加 API 密钥等|确保只有包含访问密钥的请求才能访问 API 端点,增强安全性|
|修改订单服务|添加配置信息、创建相关文件、修改视图和管理文件|使订单微服务能与通知应用集成,在订单不同状态时发送通知|
|测试所有组件|启动服务器、测试订单发送和发货通知|验证各个组件是否能协同工作,确保系统正常运行|

为了更清晰地展示各个步骤之间的关系,下面是一个 mermaid 格式的流程图:

graph LR
    A[使用 Zappa 部署 Flask 应用] --> B[限制 API 端点访问]
    B --> C[修改订单服务]
    C --> D[测试所有组件]
6. 其他相关拓展

除了上述操作,我们还可以进一步拓展和优化系统。例如,可以考虑对使用计划进行更细致的配置,设置不同的限流和配额规则,以满足不同用户的需求。另外,对于通知服务,可以添加更多的通知类型,如订单取消通知、退款通知等。

在代码方面,我们可以对 notifier.py 文件中的 notify 函数进行优化,添加错误处理机制,以提高系统的健壮性。以下是优化后的代码:

import requests
import json
from order import settings
from .notification_type import NotificationType

def notify(order, notification_type):
    try:
        endpoint = ('notify/order-received/'
                    if notification_type is NotificationType.ORDER_RECEIVED
                    else 'notify/order-shipped/')
        header = {
            'X-API-Key': settings.NOTIFIER_API_KEY
        }
        response = requests.post(
            f'{settings.NOTIFIER_BASEURL}/{endpoint}',
            json.dumps(order.data),
            headers=header
        )
        response.raise_for_status()  # 检查响应状态码
        return response
    except requests.exceptions.RequestException as e:
        print(f"通知发送失败: {e}")
        return None
7. 总结

通过一系列的操作,我们成功地将 Flask 应用部署到 AWS Lambda 上,实现了无服务器架构。同时,我们限制了 API 端点的访问,增强了系统的安全性。通过修改订单服务,使订单微服务与通知应用集成,实现了订单状态变化时的通知功能。最后,通过测试确保了各个组件能够协同工作,保证了系统的正常运行。

在实际应用中,我们可以根据具体需求对系统进行进一步的拓展和优化,如添加更多的通知类型、优化使用计划配置等。同时,要注意代码的健壮性,添加错误处理机制,以提高系统的稳定性。希望这些内容能帮助你更好地构建和部署自己的应用。

随着信息技术在管理上越来越深入而广泛的应用,作为学校以及一些培训机构,都在用信息化战术来部署线上学习以及线上考试,可以与线下的考试有机的结合在一起,实现基于SSM的小码创客教育教学资源库的设计与实现在技术上已成熟。本文介绍了基于SSM的小码创客教育教学资源库的设计与实现的开发全过程。通过分析企业对于基于SSM的小码创客教育教学资源库的设计与实现的需求,创建了一个计算机管理基于SSM的小码创客教育教学资源库的设计与实现的方案。文章介绍了基于SSM的小码创客教育教学资源库的设计与实现的系统分析部分,包括可行性分析等,系统设计部分主要介绍了系统功能设计和数据库设计。 本基于SSM的小码创客教育教学资源库的设计与实现有管理员,校长,教师,学员四个角色。管理员可以管理校长,教师,学员等基本信息,校长角色除了校长管理之外,其他管理员可以操作的校长角色都可以操作。教师可以发布论坛,课件,视频,作业,学员可以查看和下载所有发布的信息,还可以上传作业。因而具有一定的实用性。 本站是一个B/S模式系统,采用Java的SSM框架作为开发技术,MYSQL数据库设计开发,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得基于SSM的小码创客教育教学资源库的设计与实现管理工作系统化、规范化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值