python - 使用 POST 时 Django 中的 MultiValueDictKeyError

标签 python django-rest-framework token postman

我是 Django 休息框架的新手,被要求编写我们项目的 token 认证部分。需要注意的一件事是,因为我将来不会使用默认管理站点,所以我编写了登录、注销、注册功能,并通过 POSTMAN 测试功能。我现在要做的是让新用户注册、登录和注销。当用户登录时,我发给他/她一个 token 。一切都以最简单的方式执行。

可是我还是搞不定。我搜索了所有相关问题,但仍然无法解决我的问题。如果有人知道该怎么做,请帮助我! 详情如下。

当我使用 GET 时,一切正常。但是当我使用 POST 时,我得到 MultiValueDictKeyError。我不知道为什么。

View.py

    from rest_framework.response import Response
    from django.contrib.auth import authenticate
    from rest_framework.authtoken.models import Token
    from rest_framework import status
    from django.contrib.auth.models import User
    from rest_framework.authentication import TokenAuthentication
    from rest_framework.permissions import IsAuthenticated
    from django.contrib.auth.signals import user_logged_in, user_logged_out
    from rest_framework.decorators import api_view, authentication_classes, permission_classes
    from django.views.decorators.csrf import csrf_exempt, requires_csrf_token
    @csrf_exempt
    @requires_csrf_token
    @api_view(['POST'])
    def create_user_view(request):
        if request.method == 'POST':
            username = request.POST['username']
            email = request.POST['email']
            password = request.POST['password']
            user = User.objects.create_user(username=username, email=email,     password=password)
            user.save()
            return Response({'detail': "Create user"})


    @csrf_exempt
    def login_view(request):
         if request.method == 'POST':
            username = request.POST['username']
            password = request.POST['password']
            user = authenticate(username=username, password=password)
         if user is not None:
            user_logged_in.send(sender=user.__class__, request=request, user=user)
            token = Token.objects.get_or_create(user=user)
            return Response({
                           'detail': 'POST answer', 'token': token[0].key,
                           })
        else:
            return Response({'detail': "The username or password were incorrect.",
           status: status.HTTP_404_NOT_FOUND})

    @csrf_exempt
    def logout_view(request):
        if request.method == 'POST':
            user = getattr(request, 'user', None)
            if hasattr(user, 'is_authenticated') and not user.is_authenticated():
                user = None
                user_logged_out.send(sender=user.__class__, request=request, user=user)
            if hasattr(request, 'user'):
                 from django.contrib.auth.models import AnonymousUser

                 request.user = AnonymousUser()
           return Response({'detail': "You have logged out successfully."})

Test_app/Urls.py

    from django.conf.urls import patterns, url
    from rest_framework.urlpatterns import format_suffix_patterns
    from test_app import views
    urlpatterns = patterns('test_app.views',
                           url(r'^signup', views.create_user_view),
                           url(r'^login', views.login_view),
                           url(r'^logout', views.logout_view),
                           url(r'^auth', views.AuthView),
                           )
    urlpatterns = format_suffix_patterns(urlpatterns)

Models.py(是的,我只在文件里放了两行)

    from django.contrib.auth.models import User
    from django.db import models

我还按照教程所说修改了settings.py。

现在的问题是:

Request Method: POST
Request URL:    http://127.0.0.1:8000/signup?username=haha&email=haha@gmail.com&password=okok
Django Version: 1.8.2
Exception Type: MultiValueDictKeyError
Exception Value:    
"'username'"
Exception Location: /Users/wyq/PycharmProjects/env/lib/python2.7/site-packages/django/utils/datastructures.py in __getitem__, line 322

有人可以帮忙吗?非常感谢!

最佳答案

MultiValueDictKeyErrorQueryDict 中发生,当您尝试访问的键不在 QueryDict 中时。您的请求方法说 POST 但 url 方案表明您传递的参数将进入 request.GET 字典。

您需要通过表单或其他方式提交参数,以便在 request.POST QueryDict

中访问它们

关于python - 使用 POST 时 Django 中的 MultiValueDictKeyError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31050173/

相关文章:

python - 如何克服数据 "TypeError: list indices must be integers or slices, not str"中的pa中的["result"]

django - 如何在 Django Rest Framework 的自定义字段中传递额外的关键字参数?

django - 在Django Rest Framework序列化器中合并两个字段

angular - Firebase消息传递: Can I check if the user already has a token without invoking the browser prompt?

Python:只有 numpy 的低通滤波器

python - 如何使用 enaml 完成初始 Splitter 和 SplitItem 布局?

python - 为什么对实例方法的引用存储在每个实例对象中而不是类对象中?

Django Rest Framework 从外键关系返回单个字段

c++ - 解析字符串并将标记作为参数传递

parsing - 如何处理 EBNF 语法中不同标记中的重叠字符组?