django - Django Rest Framework:无法克服奇怪的错误
问题描述
尝试一个简单的请求:
网址.py
from django.conf.urls import url
from django.urls import include, path
from rest_framework import routers
from django.http import HttpResponse
from rest_framework.urlpatterns import format_suffix_patterns
from .public_views import NavigationBar
router = routers.DefaultRouter()
router.register(r'navbar', NavigationBar, basename="NavigationBar")
urlpatterns = [
path('', include(router.urls))
]
urlpatterns = format_suffix_patterns(urlpatterns)
public_views.py
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.permissions import AllowAny
from rest_framework.throttling import UserRateThrottle
from rest_framework.decorators import api_view, throttle_classes
from . view_utils import *
class OncePerDayUserThrottle(UserRateThrottle):
rate = '1/day'
class NavigationBar(APIView):
"""
obtain up to date navigation bar (or side menu navigation) hierarchy.
"""
permission_classes = ([AllowAny])
def get(self, request, format=None):
"""
get user addresses
"""
return Response("this is a good response")
def get_extra_actions(cls):
return []
当我 API 调用/v1/navbar
or/v1/navbar/
端点(我确实让我的主要urls.py
领导所有/v1/
流量到另一个专用urls.py
)时,我收到以下错误:
AttributeError at /v1/navbar
type object 'NavigationBar' has no attribute 'get_extra_actions'
Request Method: GET
Request URL: http://web/v1/navbar
Django Version: 2.1
Exception Type: AttributeError
Exception Value:
type object 'NavigationBar' has no attribute 'get_extra_actions'
Exception Location: /usr/local/lib/python3.6/site-packages/rest_framework/routers.py in get_routes, line 200
Python Executable: /usr/local/bin/uwsgi
Python Version: 3.6.8
Python Path:
['.',
'',
'/usr/local/lib/python36.zip',
'/usr/local/lib/python3.6',
'/usr/local/lib/python3.6/lib-dynload',
'/usr/local/lib/python3.6/site-packages']
Server time: Tue, 2 Jul 2019 17:12:27 +0000
我会很感激任何指示。另外,我不明白为什么错误消息包含一个Request URL: http://web/v1/navbar
指示,什么时候web
不是我正在使用的 URL 的一部分。哪里web
来的???我只是/v1/navbar/
用来打终点。
解决方案
这里有两件事不对。首先,路由器用于视图集,而不是简单视图。其次,对于基于类的视图,您需要通过as_view()
urlconf 中的方法调用它。所以摆脱那些路由器的东西,然后做:
urlpatterns = [
path(r'navbar', NavigationBar.as_view(), name="NavigationBar")
]
注意,现在你没有使用路由器,你根本不需要那个get_extra_actions
方法。
推荐阅读
- postgresql - 路由完成后不会直接释放 knex 连接(并且连接对象超出范围)
- kubernetes - nginx-ingress 未转发到仪表板
- javascript - 根据 ID 显示特定数据
- python - 运行使用 Pygame 的游戏在 pycharm 中不起作用,但从终端运行时会起作用
- mysql - 从nodejs逐行写入mysql表
- r - 如何限制集群库中的 pam 函数的迭代次数?
- css - 为什么我不能在 css 文件中使用 align="" ?
- javascript - 如何在不影响绘图的情况下使画布居中
- c# - 缺少 DbProvider?
- c - 带指针降序排列的数组