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'错误
这个错误通常有两个常见原因,逐个排查:
- 版本不兼容问题:DRF和Django的版本必须匹配,否则会出现这类奇怪的属性错误。先查看当前版本:
- 在虚拟环境中运行
django-admin --version和pip 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来安装兼容版本
- 在虚拟环境中运行
- 路由配置错误: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.urlsfrom django.urls import path from . import views urlpatterns = [ path('products/', views.product_list), ]
先按上面的步骤排查,应该就能解决这两个问题了。
内容的提问来源于stack exchange,提问作者Matthew Snell




