2016-03-28 8 views
0

Ich arbeite gerade an einem Django-Projekt mit django-rest-framewok Versionierung. Ich bin mit einem seltsamen Problem konfrontiert, das unerwartete Schlüsselwortargument genannte Version sagt.TypeError at/api/v1/accounts/me/getMe() hat ein unerwartetes Schlüsselwortargument 'version'

views.py

class UserViewSet(viewsets.ModelViewSet): 

    queryset = ScreenShotUser.objects.all() 
    serializer_class = UserSerializer 


def getMe(self,request): 
     user = ScreenShotUser.objects.get(pk=request.user.id) 
     return Response(user) 

Projekt url.py

router = routers.DefaultRouter() 
router.register(r 'users', views.UserViewSet) 
urlpatterns = [ 
    url(r '^api/(?P<version>(v1|v2))/accounts/', include('Accounts.urls')), 
] 

und Die urls.py Konten Anwendung

urlpatterns = [ 
    url(r'^', include(router.urls)), 
    url(r'^me/$', views.getMe), 
] 

, wenn ich rufe http://127.0.0.1:8000/api/v1/accounts/me/ Ich habe Fehler wie diese

TypeError at /api/v1/accounts/me/ 
getMe() got an unexpected keyword argument 'version' 
Request Method: GET 
Request URL: http://127.0.0.1:8000/api/v1/accounts/me/ 
Django Version: 1.9.4 
Exception Type: TypeError 
Exception Value:  
getMe() got an unexpected keyword argument 'version' 
Exception Location: /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/django/core/handlers/base.py in get_response, line 147 
Python Executable: /Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5 
Python Version: 3.5.1 
Python Path:  
['/Working_repo/screenshot/ScreenShot', 
'/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/django_contrib_requestprovider-1.0.1-py3.5.egg', 
'/Working_repo/screenshot/ScreenShot', 
'/Library/Frameworks/Python.framework/Versions/3.5/lib/python35.zip', 
'/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5', 
'/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/plat-darwin', 
'/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/lib-dynload', 
'/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages'] 
Server time: Mon, 28 Mar 2016 13:12:54 +0000 

Django-Experten geben Sie mir bitte den Hinweis, dass ich vermisse.

TIA

EDIT Ich habe Lösungskonzept Form Antwort des Shang Wang bekam und dies wird meine Lösung

@api_view(['GET']) 
def getMe(request, version): 
    user = ScreenShotUser.objects.get(pk=request.user.id) 
    result = UserSerializer(user).data 
    return Response(result) 

Antwort

3

Wenn Sie in URL definiert haben (?P<version>(v1|v2)) sein, bedeutet dies, Ihre views.py Methode erwartet, einen Parameter version zu nehmen. Aber Ihre getMe Methode hat das nicht als Parameter, daher der Fehler. Easy Fix würde den benannten Parameter in Ihrer URL-Definition entfernen.

Edit:

Sie einen Blick auf django doc about named group, in Python nehmen sollte (?P<name>pattern) bedeutet eine Regex benannte Gruppe. Wenn Sie dies in der Django-URL-Definition haben, bedeutet dies, dass Sie einen Parameter an die Methode "views.py" übergeben. Ich glaube nicht, dass die Methode views.py den Parameter version verwendet. Sie sollten das also nicht in der URL definiert haben. Sie tun gerade:

url(r '^api/v1|v2/accounts/', include('Accounts.urls')), 

Wenn Sie die version Parameter nicht entfernen können, weil einige andere Methoden, um es tun müssen, nur definiert es in getMe Methode und es nicht für irgendetwas nutzen:

def getMe(self, request, version): 
    user = ScreenShotUser.objects.get(pk=request.user.id) 
    return Response(user) 

Lesen Sie mehr Details in django doc auf how url dispatcher is working.

+0

Vielen Dank für Ihre Antwort. Ich habe Ihre Lösung nicht gelöst, die Parameter in meiner URL klar entfernt. Können Sie es bitte erklären – Amir

+0

Wenn Ihre Lösung Versionsparameter von URL entfernt, dann ist es nicht möglich, weil eine Menge von API Versionsparameter jetzt außer getMe Methode verwendet. Also, was sollte ich für getMe Methode tun – Amir

+0

Ich habe meine Antwort bearbeitet. –

Verwandte Themen