You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PythonAnywhere部署Django应用遇错误:模块缺失及属性异常

解决PythonAnywhere部署Django应用时的DRF相关错误

我来帮你一步步解决这两个部署时的DRF问题:

第一步:彻底解决ModuleNotFoundError: No module named 'rest_framework'

你提到进入虚拟环境后手动安装了DRF,但可能存在安装不彻底或者PythonAnywhere没正确使用虚拟环境的情况,按下面的步骤检查和修复:

  • 登录PythonAnywhere控制台,激活你的项目虚拟环境:workon your_virtualenv_name(如果是用virtualenv创建的,可能需要用source /home/your_username/.virtualenvs/your_virtualenv/bin/activate
  • 执行pip install djangorestframework,确认看到"Successfully installed djangorestframework-x.x.x"的成功提示
  • djangorestframework添加到项目根目录的requirements.txt里,这样后续部署可以直接用pip install -r requirements.txt一键安装所有依赖
  • 检查WSGI配置:在PythonAnywhere的「Web」标签下找到你的应用配置,确保WSGI文件正确激活了虚拟环境并指向项目settings。示例配置如下:
import os
import sys

# 激活虚拟环境
activate_this = '/home/your_username/.virtualenvs/your_virtualenv/bin/activate_this.py'
with open(activate_this) as file_:
    exec(file_.read(), dict(__file__=activate_this))

# 添加项目路径到sys.path
project_path = '/home/your_username/your_project_folder'
if project_path not in sys.path:
    sys.path.append(project_path)

# 设置Django环境变量
os.environ['DJANGO_SETTINGS_MODULE'] = 'your_project_name.settings'

# 启动WSGI应用
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

第二步:修复'function' object has no attribute 'get_extra_actions'错误

这个错误通常有两个常见原因,逐个排查:

  1. 版本不兼容问题:DRF和Django的版本必须匹配,否则会出现这类奇怪的属性错误。先查看当前版本:
    • 在虚拟环境中运行django-admin --versionpip show djangorestframework
    • 版本匹配参考:DRF 3.14+支持Django 3.2~4.2;DRF 3.13支持Django 2.2~4.0;DRF 3.12支持Django 2.2~3.2。如果版本不匹配,要么升级Django,要么降级DRF。比如你的Django是2.2,就执行pip install djangorestframework==3.13.1来安装兼容版本
  2. 路由配置错误:DRF的DefaultRouter(或其他路由器)只支持注册类视图(比如继承viewsets.ModelViewSet的类),如果你把函数视图传给了router.register(),就会触发这个错误。检查你的urls.py:
    错误示例:
    from rest_framework.routers import DefaultRouter
    from . import views
    
    router = DefaultRouter()
    router.register(r'products', views.product_list)  # 这里用了函数视图,错误!
    urlpatterns = router.urls
    
    正确处理方式:要么把函数视图改成类视图,要么直接用普通路由配置:
    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('products/', views.product_list),
    ]
    

先按上面的步骤排查,应该就能解决这两个问题了。

内容的提问来源于stack exchange,提问作者Matthew Snell

火山引擎 最新活动