TypeError at /api/v1/accounts/me/ getMe() 得到一个意外的关键字参数“版本”

Ami*_*mir 1 api django django-rest-framework

我目前正在使用 django-rest-framewok 版本控制 Django 项目。我面临一个奇怪的问题,说名为 version 的意外关键字参数。

视图.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)
Run Code Online (Sandbox Code Playgroud)

项目网址.py

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

和帐户应用程序的 urls.py

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

当我打电话给http://127.0.0.1:8000/api/v1/accounts/me/ 我得到这样的错误

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
Run Code Online (Sandbox Code Playgroud)

Django 专家的请给我我遗漏的提示。TIA

编辑 我从尚旺的答案中得到了解决方案概念,这将是我的解决方案

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

Sha*_*ang 5

如果你已经(?P<version>(v1|v2))在 url 中定义,这意味着你的 views.py 方法需要一个参数version。但是您的getMe方法没有它作为参数,因此出现错误。简单的修复方法是删除 url 定义中的命名参数。

编辑:

您应该查看有关 named group 的 django 文档,在 python 中(?P<name>pattern)表示一个名为 group 的正则表达式。如果你在 django url 定义中有那个,这意味着你正在将参数传递给 views.py 方法。我认为你的 views.py 方法没有使用version参数,所以你不应该在 url 中定义它。你只需要:

url(r '^api/v1|v2/accounts/', include('Accounts.urls')),
Run Code Online (Sandbox Code Playgroud)

如果version因为某些其他方法确实需要它而无法删除该参数,则只需在getMe方法中定义它并且不要将其用于任何事情:

def getMe(self, request, version):
    user = ScreenShotUser.objects.get(pk=request.user.id)
    return Response(user)
Run Code Online (Sandbox Code Playgroud)

在 django doc 中阅读有关url 调度程序如何工作的更多详细信息。