Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;详情:&引用;JSON解析错误-期望值:第1行第1列(字符0)";django rest框架_Django_Django Rest Framework - Fatal编程技术网

&引用;详情:&引用;JSON解析错误-期望值:第1行第1列(字符0)";django rest框架

&引用;详情:&引用;JSON解析错误-期望值:第1行第1列(字符0)";django rest框架,django,django-rest-framework,Django,Django Rest Framework,当我通过XMLHttpRequest发出post请求时,它工作得很好,但是当我在django API视图中发出get请求时http://127.0.0.1:8000/create/我在文本框中写入了一个新文本,我得到了一个错误“详细信息”:“JSON解析错误-期望值:第1行第1列(字符0)” 这是我的文件代码。 serlizers.py 该应用程序就像我关注的推特应用程序一样 settings.py from django.shortcuts import render, redirect f

当我通过
XMLHttpRequest
发出post请求时,它工作得很好,但是当我在django API视图中发出get请求时
http://127.0.0.1:8000/create/
我在文本框中写入了一个新文本,我得到了一个错误
“详细信息”:“JSON解析错误-期望值:第1行第1列(字符0)”
这是我的文件代码。
serlizers.py
该应用程序就像我关注的推特应用程序一样

settings.py

from django.shortcuts import render, redirect
from .models import Tweet
from django.utils.http import is_safe_url
from .serializers import CreateTweeSerializers, TweeSerializers, TweetActionsSerlizer
from rest_framework.response import Response
from rest_framework.decorators import api_view, authentication_classes, permission_classes
from rest_framework.permissions import IsAuthenticated
from rest_framework.authentication import SessionAuthentication
# this woll make POST request work and re-render the new posts.


@api_view(["POST"])
# @authentication_classes([SessionAuthentication,MyCustomAuth])
@permission_classes([IsAuthenticated])
def post_create_view(request, *args, **kwargs):
    serializer = CreateTweeSerializers(data=request.POST)
    # raise_exception= if form.error reutnr error and status400
    if serializer.is_valid(raise_exception=True):
        serializer.save(user=request.user)
        return Response(serializer.data, status=201)
    return Response({}, status=400)


def home_view(request, *args, **kwards):
    return render(request, 'pages/home.html', context={}, status=200)


@api_view(["GET"])
def post_view(request, postId, *args, **kwards):
    qs = Tweet.objects.filter(id=postId)
    if not qs.exists():
        return Response({}, status=404)
    return Response(TweeSerializers(qs.first()).data, status=200)


@api_view(["DELETE", 'POST'])
@permission_classes([IsAuthenticated])
def post_delete_view(request, postId, *args, **kwards):
    qs = Tweet.objects.filter(id=postId)
    if not qs.exists():
        return Response({}, status=404)
    qs = qs.filter(user=request.user)
    if not qs.exists():
        return Response({"message": 'you cant delete this Post'}, status=401)
    obj = qs.first()
    obj.delete()
    return Response({'Message': "post removed"}, status=200)


@api_view(["GET"])
def posts_list_view(request, *args, **kwards):
    qs = Tweet.objects.all()
    serializer = TweeSerializers(qs, many=True)
    return Response(serializer.data)


@api_view(['POST'])
@permission_classes([IsAuthenticated])
def post_actions_view(request, *args, **kwards):
    '''
    actions = like,unlike,retweet
    '''
    # i dont understand how request.POST will send the id and the action type to the serlizer?
    # data=request.POST was a mistake
    serlizer = TweetActionsSerlizer(data=request.data)
    print(request.data)
    if serlizer.is_valid(raise_exception=True):
        data = serlizer.validated_data
        post_id = data.get('id')
        action = data.get('action')
        # you must serlize data to the get them.
        content = data.get('content')
    qs = Tweet.objects.filter(id=post_id)
    if not qs.exists():
        return Response({}, status=404)
    obj = qs.first()
    if action == 'like':
        obj.like.add(request.user)
        return Response(serlizer.data, status=200)
    elif action == 'unlike':
        obj.like.remove(request.user)
    elif action == 'retweet':
        newTwee = Tweet.objects.create(
            user=request.user, parent=obj, content=content)
        serlizer = TweeSerializers(newTwee)
        return Response(serlizer.data, status=201)

    return Response({}, status=200)
设置主要是默认设置,但最后我添加了restframework设置。
views.py

from django.shortcuts import render, redirect
from .models import Tweet
from django.utils.http import is_safe_url
from .serializers import CreateTweeSerializers, TweeSerializers, TweetActionsSerlizer
from rest_framework.response import Response
from rest_framework.decorators import api_view, authentication_classes, permission_classes
from rest_framework.permissions import IsAuthenticated
from rest_framework.authentication import SessionAuthentication
# this woll make POST request work and re-render the new posts.


@api_view(["POST"])
# @authentication_classes([SessionAuthentication,MyCustomAuth])
@permission_classes([IsAuthenticated])
def post_create_view(request, *args, **kwargs):
    serializer = CreateTweeSerializers(data=request.POST)
    # raise_exception= if form.error reutnr error and status400
    if serializer.is_valid(raise_exception=True):
        serializer.save(user=request.user)
        return Response(serializer.data, status=201)
    return Response({}, status=400)


def home_view(request, *args, **kwards):
    return render(request, 'pages/home.html', context={}, status=200)


@api_view(["GET"])
def post_view(request, postId, *args, **kwards):
    qs = Tweet.objects.filter(id=postId)
    if not qs.exists():
        return Response({}, status=404)
    return Response(TweeSerializers(qs.first()).data, status=200)


@api_view(["DELETE", 'POST'])
@permission_classes([IsAuthenticated])
def post_delete_view(request, postId, *args, **kwards):
    qs = Tweet.objects.filter(id=postId)
    if not qs.exists():
        return Response({}, status=404)
    qs = qs.filter(user=request.user)
    if not qs.exists():
        return Response({"message": 'you cant delete this Post'}, status=401)
    obj = qs.first()
    obj.delete()
    return Response({'Message': "post removed"}, status=200)


@api_view(["GET"])
def posts_list_view(request, *args, **kwards):
    qs = Tweet.objects.all()
    serializer = TweeSerializers(qs, many=True)
    return Response(serializer.data)


@api_view(['POST'])
@permission_classes([IsAuthenticated])
def post_actions_view(request, *args, **kwards):
    '''
    actions = like,unlike,retweet
    '''
    # i dont understand how request.POST will send the id and the action type to the serlizer?
    # data=request.POST was a mistake
    serlizer = TweetActionsSerlizer(data=request.data)
    print(request.data)
    if serlizer.is_valid(raise_exception=True):
        data = serlizer.validated_data
        post_id = data.get('id')
        action = data.get('action')
        # you must serlize data to the get them.
        content = data.get('content')
    qs = Tweet.objects.filter(id=post_id)
    if not qs.exists():
        return Response({}, status=404)
    obj = qs.first()
    if action == 'like':
        obj.like.add(request.user)
        return Response(serlizer.data, status=200)
    elif action == 'unlike':
        obj.like.remove(request.user)
    elif action == 'retweet':
        newTwee = Tweet.objects.create(
            user=request.user, parent=obj, content=content)
        serlizer = TweeSerializers(newTwee)
        return Response(serlizer.data, status=201)

    return Response({}, status=200)

我发现你的问题是:)

我所做的(导致屏幕上出现“JSON解析错误-期望值:第1行第1列(char 0)”消息),或者您可以通过curl或Postman重复相同的操作:

  • 身份验证为超级用户,然后在上打开浏览器
  • 在内容文本区域中键入“somestring”
  • 单击Post btn(使用选定的mediatype json)
  • 好吧,为什么错了在视图中,request.data的解析方式类似于
    {“somestring”}
    ,但它应该类似于
    {“content”:“somestring”}

    那么它是如何正确的(这里我使用了令牌身份验证)

    请求

    POST http://127.0.0.1:8000/create/
    Accept: application/json
    Content-Type: application/json
    Authorization: Token e6f2fdd681d0b023a73cb06e9720867adeb96daf
    
    {"content":  "a"}
    
    回应

    {
      "id": 10,
      "content": "a",
      "like": []
    }
    
    Response code: 201 (Created); Time: 50ms; Content length: 33 bytes
    

    那么,您不应该向
    /create
    发送POST请求吗?如果它想要创造一些东西,它需要数据,对吗?你为什么用GET?您可能需要一个GET请求来
    http://127.0.0.1:8000/items/
    (或者不管你在
    url.py中如何命名它)我使用get来获取数据,它与POST无关,我只是在代码中加入了,因为我不知道这是否重要。嗯,看起来不错,谢谢你的链接@madzohan是的,好主意,我刚刚把代码推到github。我还使用了django 3,课程使用了django 2.2,我使用了django allauth,而原来的课程没有,我做了更多的修改。兄弟,这很容易,但不要放弃-完成课程和drf手册)
    
    {
      "id": 10,
      "content": "a",
      "like": []
    }
    
    Response code: 201 (Created); Time: 50ms; Content length: 33 bytes