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)
如果你已经(?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 调度程序如何工作的更多详细信息。
| 归档时间: |
|
| 查看次数: |
746 次 |
| 最近记录: |