Django+uWSGI+Nginx环境下服务器无Print输出及API调试问题
哎,这种本地跑的顺风顺水,一上服务器就翻车的情况真的太闹心了,尤其是连调试输出都拿不到,根本没法定位问题。我给你分两步来解决:先搞定日志输出,再排查API调用异常的核心原因。
第一步:搞定调试日志输出(别再用print了!)
本地开发时print能直接输出到终端,但uWSGI运行时,Python的stdout会被重定向或者缓冲,导致你看不到输出。换用Django官方的logging模块才是靠谱的方式,直接在settings.py里配置日志到文件:
# settings.py 中添加日志配置 LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'file': { 'level': 'DEBUG', 'class': 'logging.FileHandler', 'filename': '/var/log/django/debug.log', # 确保这个路径有写入权限 }, }, 'loggers': { 'django': { 'handlers': ['file'], 'level': 'DEBUG', 'propagate': True, }, # 单独记录第三方API的日志,方便排查 'third_party_api': { 'handlers': ['file'], 'level': 'DEBUG', 'propagate': False, }, }, }
然后在你的API调用代码里用这个logger代替print:
import logging logger = logging.getLogger('third_party_api') def call_third_party_api(): # 构造请求 response = requests.get('第三方API地址') # 记录请求和响应的关键信息 logger.debug(f"请求URL: {response.url}") logger.debug(f"请求头: {response.request.headers}") logger.debug(f"响应状态码: {response.status_code}") logger.debug(f"响应内容: {response.text}")
别忘了给日志目录加写入权限:sudo mkdir -p /var/log/django && sudo chown www-data:www-data /var/log/django(假设你的uWSGI运行用户是www-data)。
如果非要用print应急,可以在uWSGI的配置文件里加disable-logging=false,启动时指定日志文件:uwsgi --ini your_config.ini --logto /var/log/uwsgi/uwsgi.log,这样所有print输出都会打到uWSGI日志里。
第二步:排查第三方API调用异常的常见原因
搞定日志后就能看到具体错误了,先给你列几个最容易踩的坑:
网络/权限问题:云服务器的安全组、防火墙有没有放行第三方API的端口?比如HTTPS的443端口,服务器有没有 outbound 权限?或者第三方API有IP白名单,你没把服务器公网IP加进去?
排查方法:在服务器上直接用curl -v https://第三方API地址测试,看能不能拿到正常响应。如果curl都失败,那就是网络问题,找运维开权限或者加白名单。环境变量不一致:本地开发时你可能在.env文件里配置了API密钥、域名,部署到服务器后有没有同步这些环境变量?比如代码里用
os.getenv('THIRD_PARTY_API_KEY'),服务器上没设这个变量,调用时就会用空值,自然失败。
排查方法:在代码里加日志打印环境变量,或者在服务器上执行echo $THIRD_PARTY_API_KEY确认是否存在。SSL证书验证失败:本地系统的CA证书库比较全,但服务器可能缺少某些根证书,导致调用HTTPS API时验证失败。
排查方法:临时在requests调用里加verify=False测试(注意:线上绝对不能这么干!),如果能成功,就是证书问题,解决办法是给服务器安装缺失的CA证书,或者指定requests使用系统证书库。请求头/代理差异:本地开发时可能有代理,或者自动加了某些请求头(比如User-Agent),但服务器上的请求头比较朴素,第三方API拒绝了请求。
排查方法:在日志里对比本地和服务器的请求头,补上缺失的字段再测试。
最后总结
先把日志输出搞定,这是调试的基础;然后从网络、环境、证书这些最常见的点入手排查,基本都能找到问题。
内容的提问来源于stack exchange,提问作者Dora




