javascript - 格式错误:AttributeError:“JsonResponse”对象没有属性“_headers”
问题描述
我正在使用 Django 和 JavaScript 构建一个应用程序。在 Java 中,我有一个如下所示的函数:
fetch('/posts')
.then(response => response.json())
.then(posts => {
JavaScript 代码的第一行实际上调用了我的 .views 中的“post_list”函数
from django.contrib.auth.decorators import login_required
from django.http import JsonResponse
from .models import Post
@login_required
def post_list(request):
posts = Post.objects.filter(username=request.user)
posts = posts.order_by("-timestamp").all()
return JsonResponse([p.serialize() for p in posts], safe=False)
但随后程序在最后一行崩溃(当我尝试返回 JsonResponse 时)并且我收到 500 Internal Server Error。结果,我没有收到响应,并且我的 JavaScript .then(response ..... 行没有运行。
我不确定这是否与回答问题有关,但我的模型如下所示:
from django.db import models
from django.contrib.auth import get_user_model
User = get_user_model()
class Post(models.Model):
username = models.ForeignKey(User, on_delete=models.CASCADE, related_name="user")
post = models.CharField(max_length=365)
like = models.PositiveIntegerField(default=0)
timestamp = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"{self.username} posted {self.post} the {self.timestamp}, and the post has {self.like} likes"
def serialize(self):
return {
"id": self.id,
"username":self.username,
"post": self.post,
"like": self.like,
"timestamp": self.timestamp.strftime("%b %d %Y, %I:%M %p"),
}
那么,有谁知道为什么我会收到 500 内部服务器错误?
解决方案
如果您从正确的位置导入 JsonResponse,您应该不会看到此错误。相反,您应该收到一个错误“用户对象不是 JSON 可序列化”,您可以通过执行以下操作来修复它:
# models.py
from django.db import models
from django.contrib.auth import get_user_model
User = get_user_model()
class Post(models.Model):
username = models.ForeignKey(User, on_delete=models.CASCADE, related_name="user")
post = models.CharField(max_length=365)
like = models.PositiveIntegerField(default=0)
timestamp = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"{self.username} posted {self.post} at {self.timestamp}, and the post has {self.like} likes"
def serialize(self):
return {
"id": self.id,
"username": {
"username": self.username.username,
"displayName": self.username.get_full_name(),
"lastLogin": str(self.username.last_login.replace(microsecond=0)),
},
"post": self.post,
"like": self.like,
"timestamp": self.timestamp.strftime("%b %d %Y, %I:%M %p"),
}
作为一些额外的建议:
- 不要将用户对象称为用户名:当您没有获得用户名而是完整的用户对象时,它会变得混乱
- Javascript 完全能够以对访问者有意义的方式呈现日期格式,因此最好以 ISO-8601 格式传输日期时间,python 和 Javascript 都可以处理。我已将其添加为用户序列化的 lastLogin 属性的示例。