部署含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
相关产品推荐
相关产品推荐

