&引用;详情:&引用;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”}
,但它应该类似于{“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