Django报错:'function'对象无get_extra_actions属性路由问题求解
错误原因
DRF 提供的 SimpleRouter、DefaultRouter 路由注册器仅支持注册 DRF 原生的 ViewSet 类,你当前的用法存在两处问题:
- 你传给
router.register()的参数是LoginView.as_view()的返回值,这是一个标准的函数视图,没有 ViewSet 必须具备的get_extra_actions属性,因此直接触发属性不存在的报错 - Django 自带的
LoginView是普通 Django 类视图,并非 DRF ViewSet 的子类,本身就不兼容 DRF 路由注册器的注册逻辑 - 补充说明:即使你使用的是 DRF 自带的 ViewSet,注册时也不需要加
.as_view(),直接传递 ViewSet 类本身即可,加了.as_view()依然会触发同类报错
解决方案
方案1:直接注册普通视图到路由列表(推荐,适配你当前使用 Django 自带 LoginView 的需求)
删掉 DRF 路由注册器相关的 LoginView 注册代码,直接把 LoginView 路由添加到 urlpatterns 即可,修改后的 urls.py 代码如下:
from django.contrib import admin from django.urls import path from django.contrib.auth.views import LoginView urlpatterns = [ path('admin/', admin.site.urls), path('login/', LoginView.as_view(), name='login'), ]
方案2:如果确实需要用 DRF 路由注册器管理登录接口
你需要将登录逻辑封装为 DRF ViewSet 子类再注册,示例实现如下:
- 首先在
main/views.py中定义登录 ViewSet
from rest_framework import viewsets from rest_framework.response import Response from rest_framework import status from django.contrib.auth import authenticate, login class LoginViewSet(viewsets.ViewSet): def create(self, request): username = request.data.get('username') password = request.data.get('password') user = authenticate(request, username=username, password=password) if user is not None: login(request, user) return Response({"msg": "登录成功"}, status=status.HTTP_200_OK) return Response({"msg": "用户名或密码错误"}, status=status.HTTP_400_BAD_REQUEST)
- 之后在
urls.py中注册该 ViewSet
from django.contrib import admin from django.urls import path, include from rest_framework import routers from main.views import LoginViewSet router = routers.SimpleRouter() # 注意这里直接传 ViewSet 类,不要加 .as_view() router.register(r'login', LoginViewSet, basename='login') urlpatterns = [ path('admin/', admin.site.urls), path('', include(router.urls)), ]
内容的提问来源于stack exchange,提问作者Ghazi
相关产品推荐
相关产品推荐

