You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部署含pywebpush的Flask应用至App Engine时遇_constant_time导入错误求助

解决App Engine部署pywebpush时的_constant_time导入错误

嘿,这个问题我之前帮朋友排查过类似的,本质就是cryptography库的C扩展模块没在App Engine标准环境里正确构建或部署。毕竟pywebpush依赖cryptography,你本地跑正常是因为本地环境已经编译好这些底层扩展了,但App Engine标准环境对编译型依赖有特殊限制,直接部署很容易踩坑。

下面给你几个实用的解决办法,按顺序试试:

方案1:生成适配App Engine的预编译依赖包

App Engine标准环境没法在线编译C扩展,所以得提前在本地生成兼容的轮子包:

  • 先搞个虚拟环境激活(避免污染全局环境)
  • 安装pywebpush:pip install pywebpush
  • 把所有依赖打包成轮子存到wheels目录:pip wheel -w wheels/ pywebpush
  • 导出当前依赖到requirements.txt:pip freeze > requirements.txt
  • 最后把wheels文件夹和requirements.txt一起上传部署,这样App Engine会直接用你预编译好的轮子,不用在线编译了。

方案2:调整app.yaml配置,确保不丢关键文件

有时候部署时会不小心把cryptography的扩展文件给排除了,得在app.yaml里加个规则:

  • 首先确认app.yaml里的Python版本是3.9及以上(旧版本对cryptography支持不太好):
    runtime: python39
    
  • 然后修改skip_files配置,明确不忽略cryptography的扩展文件:
    skip_files:
      - ^(.*/)?#.*#$
      - ^(.*/)?.*~$
      - ^(.*/)?.*\.py[co]$
      - ^(.*/)?.*/RCS/.*$
      - ^(.*/)?\..*$
      # 特意保留_constant_time相关的扩展文件
      - !^(.*/)?cryptography/hazmat/bindings/_constant_time.*$
    

方案3:换用App Engine灵活环境(实在搞不定标准环境的话)

如果标准环境的限制太烦人,灵活环境允许你用自定义Docker镜像,完全复刻本地环境:

  • 写个Dockerfile,在里面安装对应版本的Python,然后正常pip install pywebpush(这样会在镜像里编译好所有扩展)
  • 切换到灵活环境的部署配置,这样线上环境和本地完全一致,依赖问题就不存在了。

最后再检查这几点

  • 本地和App Engine用的Python版本必须一致,版本差会导致编译的扩展不兼容
  • 看看requirements.txt里有没有不小心排除cryptography,或者指定了太旧的版本,尽量用pywebpush官方推荐的兼容版本

划重点:App Engine标准环境绝对不能在线编译C扩展,所以预编译轮子是最核心的解决思路,优先试方案1!

内容的提问来源于stack exchange,提问作者gajam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:22:03