通过GitHub部署Django应用到PythonAnywhere遇301错误及日志异常
Django应用PythonAnywhere部署流水线故障排查
问题概述
- GitHub Webhook触发后返回301错误,提示:
Last delivery was not successful. Invalid HTTP Response: 301 - Postman直接访问
update_server/路由返回200 OK,但响应内容为Couldn't update the code on PythonAnywhere,且日志文件创建后始终为空 - 已完成前置配置:
update_server路由及视图开发、PythonAnywhere虚拟环境安装GitPython、部署密钥/SSH密钥配置并添加至GitHub与SSH代理
相关代码
路由配置
path('update_server/', views.update, name='update'),
Update视图代码
@csrf_exempt def update(request): if request.method == "POST": try: # Log the incoming request logger = logging.getLogger('webhook_logger') logger.info("Webhook POST request received") # Perform the code update repo = git.Repo('mayapp.pythonanywhere.com') origin = repo.remotes.origin origin.pull() # Log a success message message = "Updated code on PythonAnywhere" logger.info(message) return HttpResponse(message) except GitCommandError as e: # Log a Git error and return an error response error_message = f"Git Error: {str(e)}" logger.error(error_message) return HttpResponseServerError(error_message, status=500) else: return HttpResponse("Couldn't update the code on PythonAnywhere")
Settings.py日志配置
import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'file': { 'level': 'ERROR', 'class': 'logging.FileHandler', 'filename': os.path.join(BASE_DIR, 'logs', 'error.log'), }, 'webhook_logger_file': { 'level': 'DEBUG', 'class': 'logging.FileHandler', 'filename': os.path.join(BASE_DIR, 'logs', 'webhook.log'), }, }, 'loggers': { 'django': { 'handlers': ['file'], 'level': 'ERROR', 'propagate': True, }, 'webhook_logger': { 'handlers': ['webhook_logger_file'], 'level': 'DEBUG', 'propagate': False, }, }, }
故障修复方案
1. 解决GitHub Webhook 301重定向错误
301错误源于URL重定向,处理方式:
- 检查GitHub Webhook的Payload URL:确保末尾包含斜杠,例如
https://yourusername.pythonanywhere.com/update_server/(而非无斜杠的update_server) - 若需禁用自动补全斜杠,在
settings.py中设置APPEND_SLASH = False,同时确保路由同时匹配有无斜杠的请求(可使用re_path或添加两条路径)
2. 修复Postman响应异常及日志为空问题
(1)请求方法不匹配
Postman默认发送GET请求,而视图仅处理POST请求,因此会进入else分支返回错误提示。测试时需切换为POST请求,同时确认@csrf_exempt装饰器已正确添加,避免CSRF验证拦截请求。
(2)Git仓库路径错误
视图中git.Repo('mayapp.pythonanywhere.com')使用的是相对路径,PythonAnywhere的web进程无法识别,需替换为绝对路径:
repo = git.Repo('/home/yourusername/mayapp.pythonanywhere.com')
(将yourusername替换为你的PythonAnywhere用户名)
(3)日志未生成问题
- 检查
logs目录:手动创建BASE_DIR/logs目录,确保PythonAnywhere用户拥有读写权限(执行mkdir ~/mayapp.pythonanywhere.com/logs) - 验证日志初始化:在视图中临时添加打印语句
print("Webhook POST received"),查看PythonAnywhere的服务器日志(Web > Logs > Your app's log)确认请求是否到达 - 检查日志级别:确保
webhook_logger的level和对应handler的level均设置为DEBUG,避免日志被过滤
(4)Git拉取权限问题
即使配置了SSH密钥,web进程可能无法访问SSH代理,处理步骤:
- 在PythonAnywhere的控制台中手动执行
git pull origin main(替换main为你的分支名),测试是否能正常拉取代码 - 检查SSH密钥权限:执行
chmod 600 ~/.ssh/id_rsa确保密钥文件权限合规 - 在视图中添加SSH密钥环境变量配置:
import os os.environ['GIT_SSH_COMMAND'] = 'ssh -i /home/yourusername/.ssh/id_rsa -o StrictHostKeyChecking=no'
内容的提问来源于stack exchange,提问作者Louis Eiden
相关产品推荐
相关产品推荐

