2016-08-29 42 views
0

我一直在運行Django Rest Framework上的教程來構建簡單的待辦事項列表應用程序。在Django Rest Framework中將基於功能的視圖更新爲基於類的視圖時出錯

當我從基於函數的視圖轉換到基於類的視圖時,我開始獲取到Django的堆棧跟蹤,並且所有http調用都開始失敗。

我使用virtualenv來隔離依賴關係,並使用Python 3.5.2。

任何人對發生了什麼事情有任何想法,或者如何解決這個錯誤?

我正在粉化這個配置錯誤或版本不匹配,但我不知道從哪裏開始。

/views.py:

from django.http import Http404 
from list.models import List 
from list.serializers import ListSerializer 
from rest_framework.views import APIView 
from rest_framework.response import Response 
from rest_framework import status 

class ListsView(APIView): 
     """ 
     List all lists. 
     """ 
     def get(self, request, format=None): 
       lists = List.objects.all() 
       serializer = ListSerializer(lists, many=True) 
       return Response(serializer.data) 

     ... 

/urls.py

from django.conf.urls import url 
from rest_framework.urlpatterns import format_suffix_patterns 
from list import views 

urlpatterns = [ 
    url(r'^lists/$', views.ListsView), 
    url(r'^lists/(?P<pk>[0-9]+)/$', views.ListView), 
    url(r'^lists/(?P<list>[0-9]+)/items/$', views.ListItemsView), 
    url(r'^lists/(?P<list>[0-9]+)/items/(?P<pk>[0-9]+)/$', views.ListItemView), 
] 

urlpatterns = format_suffix_patterns(urlpatterns) 

輸入:

curl http://localhost:8000/lists/ 

跟蹤:

Internal Server Error: /lists/ 
Traceback (most recent call last): 
    File "<pwd>/env/lib/python3.5/site-packages/django/core/handlers/exception.py", line 39, in inner 
    response = get_response(request) 
    File "<pwd>/env/lib/python3.5/site-packages/django/core/handlers/base.py", line 249, in _legacy_get_response 
    response = self._get_response(request) 
    File "<pwd>/env/lib/python3.5/site-packages/django/core/handlers/base.py", line 187, in _get_response 
    response = self.process_exception_by_middleware(e, request) 
    File "<pwd>/env/lib/python3.5/site-packages/django/core/handlers/base.py", line 185, in _get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
TypeError: __init__() takes 1 positional argument but 2 were given 
[29/Aug/2016 00:03:32] "GET /lists/ HTTP/1.1" 500 61615 

ENV:

python 3.5.2 

要求:

Django==1.10 
django-lint==2.0.4 
djangorestframework==3.4.6 
logilab-astng==0.24.3 
logilab-common==1.2.2 
psycopg2==2.6.2 
Pygments==2.1.3 
pylint==0.28.0 
six==1.10.0 
+2

顯示urls.py –

+0

它看起來像你必須在定義了一些中間件' MIDDLEWARE「,它不是作爲Django 1.10的新型中間件編寫的。請發佈你的MIDDLEWARE設置。 – solarissmoke

+0

@SergeyGornostaev你是對的。這個問題在'urls.py'中。在這種情況下,我忽略了在路由中調用'as_view()'。將使用正確的響應和代碼進行更新。 – sjhcockrell

回答

0

@SergeyGornostaev有正確的直覺來看待和張貼urls.py

在從基於功能的視圖到基於視圖的重構中,我忽略了在更新路由時在視圖上調用as_view()

前:url(<pattern>, views.ListsView)

後:url(<pattern>, views.ListView.as_view())

這解決了錯誤。


完全/urls.py前:

完全/urls.py後

from django.conf.urls import url 
from rest_framework.urlpatterns import format_suffix_patterns 
from list import views 

urlpatterns = [ 
    url(r'^lists/$', views.ListsView), 
    url(r'^lists/(?P<pk>[0-9]+)/$', views.ListView), 
    url(r'^lists/(?P<list>[0-9]+)/items/$', views.ListItemsView), 
    url(r'^lists/(?P<list>[0-9]+)/items/(?P<pk>[0-9]+)/$', views.ListItemView), 
] 

urlpatterns = format_suffix_patterns(urlpatterns) 

from django.conf.urls import url 
from rest_framework.urlpatterns import format_suffix_patterns 
from list import views 

urlpatterns = [ 
    url(r'^lists/$', views.ListsView.as_view()), 
    url(r'^lists/(?P<pk>[0-9]+)/$', views.ListView.as_view()), 
    url(r'^lists/(?P<list>[0-9]+)/items/$', views.ListItemsView.as_view()), 
    url(r'^lists/(?P<list>[0-9]+)/items/(?P<pk>[0-9]+)/$', views.ListItemView.as_view()), 
] 

urlpatterns = format_suffix_patterns(urlpatterns)