Django viewset hat nicht Attribut 'get_extra_actions'
Arbeite ich mit Django zum ersten mal und ich bin versucht zu bauen, eine API und ich bin nach einigen tutorials und Beispiele und es richtig funktioniert, aber bei mir läuft das Projekt nun in einem Raspberry Pi nach der Installation alle Anforderungen und das Projekt scheitert mit der folgenden Fehlermeldung:
Performing system checks...
Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0xb547adb0>
Traceback (most recent call last):
File "/home/pi/.local/lib/python3.5/site-packages/django/utils/autoreload.py", line 225, in wrapper
fn(*args, **kwargs)
File "/home/pi/.local/lib/python3.5/site-packages/django/core/management/commands/runserver.py", line 120, in inner_run
self.check(display_num_errors=True)
File "/home/pi/.local/lib/python3.5/site-packages/django/core/management/base.py", line 364, in check
include_deployment_checks=include_deployment_checks,
File "/home/pi/.local/lib/python3.5/site-packages/django/core/management/base.py", line 351, in _run_checks
return checks.run_checks(**kwargs)
File "/home/pi/.local/lib/python3.5/site-packages/django/core/checks/registry.py", line 73, in run_checks
new_errors = check(app_configs=app_configs)
File "/home/pi/.local/lib/python3.5/site-packages/django/core/checks/urls.py", line 13, in check_url_config
return check_resolver(resolver)
File "/home/pi/.local/lib/python3.5/site-packages/django/core/checks/urls.py", line 23, in check_resolver
return check_method()
File "/home/pi/.local/lib/python3.5/site-packages/django/urls/resolvers.py", line 397, in check
for pattern in self.url_patterns:
File "/home/pi/.local/lib/python3.5/site-packages/django/utils/functional.py", line 36, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "/home/pi/.local/lib/python3.5/site-packages/django/urls/resolvers.py", line 536, in url_patterns
patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
File "/home/pi/.local/lib/python3.5/site-packages/django/utils/functional.py", line 36, in __get__
res = instance.__dict__[self.name] = self.func(instance)
File "/home/pi/.local/lib/python3.5/site-packages/django/urls/resolvers.py", line 529, in urlconf_module
return import_module(self.urlconf_name)
File "/usr/lib/python3.5/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 986, in _gcd_import
File "<frozen importlib._bootstrap>", line 969, in _find_and_load
File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 673, in exec_module
File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
File "/home/pi/Projects/openvpn-monitor/openvpnmonitor/urls.py", line 24, in <module>
url(r'^api/', include('openvpnmonitor.api.urls')),
File "/home/pi/.local/lib/python3.5/site-packages/django/urls/conf.py", line 34, in include
urlconf_module = import_module(urlconf_module)
File "/usr/lib/python3.5/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 986, in _gcd_import
File "<frozen importlib._bootstrap>", line 969, in _find_and_load
File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 673, in exec_module
File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
File "/home/pi/Projects/openvpn-monitor/openvpnmonitor/api/urls.py", line 16, in <module>
urlpatterns += router.urls
File "/home/pi/.local/lib/python3.5/site-packages/rest_framework/routers.py", line 101, in urls
self._urls = self.get_urls()
File "/home/pi/.local/lib/python3.5/site-packages/rest_framework/routers.py", line 363, in get_urls
urls = super(DefaultRouter, self).get_urls()
File "/home/pi/.local/lib/python3.5/site-packages/rest_framework/routers.py", line 261, in get_urls
routes = self.get_routes(viewset)
File "/home/pi/.local/lib/python3.5/site-packages/rest_framework/routers.py", line 176, in get_routes
extra_actions = viewset.get_extra_actions()
AttributeError: type object 'SessionViewSet' has no attribute 'get_extra_actions'
Meine views.py hat Sie den folgenden code:
from django.shortcuts import render
from rest_framework import viewsets
from .models import Session
from .serializers import SessionSerializer
from rest_framework.views import APIView, Response
class SessionViewSet(APIView):
queryset = Session.objects.all()
serializer_class = SessionSerializer
def get(self, request, format=None):
return Response("test")
Ich weiß wirklich nicht, warum funktioniert auf meinem laptop aber es funktioniert nicht auf meinem Raspberry Pi.
Hat diese zufällig jemand oder weiß jemand, warum geschieht dies?
Vielen, vielen Dank!
Edit:
Hier ist meine urls.py
from django.conf.urls import url
from rest_framework import routers
from openvpnmonitor.api.views import SessionViewSet
router = routers.DefaultRouter()
router.register(r'sessions', SessionViewSet)
urlpatterns = [
url(r'sessions', SessionViewSet.as_view()),
url(r'^docs/', schema_view),
]
urlpatterns += router.urls
InformationsquelleAutor alexca | 2018-04-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihnen genannt habe, es ein viewset, aber das macht es nicht; Sie Erben von APIView, eine eigenständige generische Ansicht, nicht ein viewset.
Einem viewset muss Erben von viewsets.ViewSet.
Ich verstehe nicht, was du meinst. Das tutorial schafft sowohl viewsets und eine eigenständige APIView; Sie scheinen zu sein, die Vermischung der beiden Methoden.
Ja, das tutorial erstellt viewsets und eine eigenständige APIView, die ich angelegt habe nur ein APIView, um eine benutzerdefinierte Ansicht und haben genau das BEKOMMEN, Endpunkt, statt den DRECK, und das funktioniert in meinem laptop, ich meine, wenn ich das Projekt auf meinem laptop funktioniert es richtig, aber ich versuche, führen Sie das gleiche Projekt auf meinem raspberry pi und ich bekomme den Fehler zu finden. Ich habe einfach versucht, zu ändern, die APIView zu einem ViewSet auf dem Raspberry Pi und es funktioniert, aber ich will ein APIView ein Endpunkt nur mit dem BEKOMMEN Endpunkt.
Sie müssen zeigen, Ihre urls.py; wie Sie sehen können aus dem tutorial, viewsets und eigenständige Ansichten werden anders angegeben, in der urls.
Danke Daniel, ich habe gerade bearbeitete meine Frage und ich habe meine urls.py
InformationsquelleAutor Daniel Roseman
Bevor Django Rest Framework v3.8 Sie könnte registrieren Sie einen
APIView
direkt mit einem router. Ich Tat dies ausgiebig zu erlangen, schön sortiert (und versioniert) automatische API-Dokumentation für einige sehr benutzerdefinierte API-Endpunkte. Angesichts der Wahl wieder, würde ich vermutlich schreiben, die die ganze Sache ein standard Weg, aber das ist keine option für jeden.Aber nach dem Graben in den Irrtum, es stellt sich heraus Sie kann einfach patch über das problem, indem der router was er will und das hinzufügen einer dummy -
get_extra_actions
classmethod.Ich sage ja nicht, das ist gut, aber es funktioniert jetzt.
Ich habe meine Unterlagen wieder zurück und ich habe es geschafft, ein upgrade auf DRFv3.8.
InformationsquelleAutor Oli