在Jelastic PaaS用mod_wsgi部署FastAPI应用遇TypeError错误求助
部署FastAPI到Jelastic PaaS(mod_wsgi)的报错解决
问题背景
我计划在Python项目中使用FastAPI并部署到Jelastic PaaS平台,由于mod_wsgi仅支持WSGI应用,因此通过a2wsgi将ASGI类型的FastAPI转换为WSGI应用,编写了wsgi.py文件:
import os, sys virtenv = os.path.expanduser('~') + '/virtenv/' virtualenv = os.path.join(virtenv, 'bin/activate_this.py') try: if sys.version.split(' ')[0].split('.')[0] == '3': exec(compile(open(virtualenv, "rb").read(), virtualenv, 'exec'), dict(__file__=virtualenv)) else: execfile(virtualenv, dict(__file__=virtualenv)) except IOError: pass sys.path.append(os.path.expanduser('~')) sys.path.append(os.path.expanduser('~') + '/ROOT/') from fastapi import FastAPI app = FastAPI() @app.get("/") async def root(): return {"message": "Hello World"} from a2wsgi import ASGIMiddleware application = ASGIMiddleware(app)
同时针对虚拟环境执行了以下命令:
virtualenv virtenv source virtenv/bin/activate pip install a2wsgi pip install fastapi deactivate
部署后无法正常运行,出现报错。
报错信息
mod_wsgi (pid=14438): Failed to exec Python script file '/var/www/webroot/ROOT/wsgi.py'. mod_wsgi (pid=14438): Exception occurred processing WSGI script '/var/www/webroot/ROOT/wsgi.py'. Traceback (most recent call last): File "/var/www/webroot/ROOT/wsgi.py", line 24, in <module> from fastapi import FastAPI File "/var/www/webroot/virtenv/lib/python3.12/site-packages/fastapi/__init__.py", line 7, in <module> from .applications import FastAPI as FastAPI File "/var/www/webroot/virtenv/lib/python3.12/site-packages/fastapi/applications.py", line 16, in <module> from fastapi import routing File "/var/www/webroot/virtenv/lib/python3.12/site-packages/fastapi/routing.py", line 22, in <module> from fastapi import params File "/var/www/webroot/virtenv/lib/python3.12/site-packages/fastapi/params.py", line 5, in <module> from fastapi.openapi.models import Example File "/var/www/webroot/virtenv/lib/python3.12/site-packages/fastapi/openapi/models.py", line 4, in <module> from fastapi._compat import ( File "/var/www/webroot/virtenv/lib/python3.12/site-packages/fastapi/_compat.py", line 20, in <module> from fastapi.exceptions import RequestErrorModel File "/var/www/webroot/virtenv/lib/python3.12/site-packages/fastapi/exceptions.py", line 3, in <module> from pydantic import BaseModel, create_model File "/var/www/webroot/virtenv/lib/python3.12/site-packages/pydantic/__init__.py", line 12, in <module> from . import dataclasses File "/var/www/webroot/virtenv/lib/python3.12/site-packages/pydantic/dataclasses.py", line 11, in <module> from ._internal import _config, _decorators, _typing_extra File "/var/www/webroot/virtenv/lib/python3.12/site-packages/pydantic/_internal/_decorators.py", line 15, in <module> from ..fields import ComputedFieldInfo File "/var/www/webroot/virtenv/lib/python3.12/site-packages/pydantic/fields.py", line 19, in <module> import annotated_types File "/var/www/webroot/virtenv/lib/python3.12/site-packages/annotated_types/__init__.py", line 361, in <module> IsNotFinite = Annotated[_NumericType, Predicate(Not(math.isfinite))] ^^^^^^^^^^^^^^^^^^ TypeError: Not() takes no arguments
环境信息
APACHE_VERSION=2.4.57 DOCKER_EXPOSED_PORT=21,22,25,443,7979,80 MOD_WSGI_VERSION=4.9.4 OWASP_MODSECURITY_CRS_VERSION=3.3.2 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PYTHON_VERSION=3.12.0 STACK_VERSION=2.4.57 VERSION=3.12.0 WEBROOT=/var/www/webroot WSGI_SCRIPT=/var/www/webroot/ROOT/wsgi.py
解决方法
错误原因
报错TypeError: Not() takes no arguments是因为annotated-types包的新版本(0.6.0及以上)使用了Python 3.13才支持的typing.Not参数语法,而当前环境是Python 3.12,该版本的typing.Not不接受参数,导致兼容性问题。
修复步骤
- 固定
annotated-types版本
重新安装依赖时指定兼容Python 3.12的版本:
virtualenv virtenv source virtenv/bin/activate pip install a2wsgi pip install fastapi annotated-types==0.5.0 deactivate
这个版本的annotated-types不会使用Python 3.13的新语法,能和Python 3.12兼容。
- 验证虚拟环境激活
确保wsgi.py中的虚拟环境激活逻辑正确,mod_wsgi确实使用了虚拟环境内的依赖。可以在wsgi.py开头添加调试代码(部署后查看日志确认):
print(f"Python executable path: {sys.executable}") print(f"Virtualenv site-packages: {os.path.join(virtenv, 'lib', 'python3.12', 'site-packages')}")
确认输出路径指向你的虚拟环境目录,而非系统Python路径。
- 重新部署
将更新后的虚拟环境和wsgi.py重新部署到Jelastic PaaS,即可解决报错问题。
内容的提问来源于stack exchange,提问作者madx
相关产品推荐
相关产品推荐

