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

通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 15:41:28