django Fetch返回html而不是JSON响应

6ie5vjzr  于 2023-08-08  发布在  Go
关注(0)|答案(1)|浏览(116)

我正在研究cs50网络开发项目。基本上就是在模仿Twitter。
它仍在处理中,但到目前为止,我有两个获取JSON响应的请求。一次运行得很好,但另一个非常相似的请求返回html而不是JSON,导致错误。不知道为什么这个不管用。下面的代码片段:
这是一个返回html为我的profile.html文件由于某种原因。注解掉的部分是实际的fetch JSON请求,但我临时更改了它,以便在控制台中显示返回的内容。profile.js:

function load_posts_profile() {

    console.log("load_posts_profile running");

    document.querySelector('#prof-posts').style.display = 'block';

    fetch(`/profile_posts`)
    //.then(response => response.json())
    .then(response => response.text())
    .then(text => console.log(text))
    //.then(posts => {
        // Print posts
        //console.log(posts);
        //posts.forEach(post => show_posts_profile(post));
    //});

}

字符串
profile.html:

{% extends "network/layout.html" %}
{% load static %}

{% block body %}
    {% if user.is_authenticated %}
        <!--insert profle name below in h3-->
        <h2 id="profile-name"></h2>
        <br>
        <h4 id="followers"></h4>
        <br>
        <h4 id="following"></h4>

        <!--add js to load user's posts only-->
        <div id="prof-posts">
        </div>

    {% else %}
        <strong> Login To See Profile</strong>
    {% endif %}

{% endblock %}

{% block script %}
    <script src="{% static 'network/profile.js' %}"></script>
{% endblock %}


网址:urls.py

from django.urls import path

from . import views

urlpatterns = [
    path("", views.index, name="index"),
    path("login", views.login_view, name="login"),
    path("logout", views.logout_view, name="logout"),
    path("register", views.register, name="register"),
    path("all_posts", views.all_posts, name="all_posts"),
    path("<str:poster>", views.profile, name="profile"),
    path("profile_posts", views.profile_posts, name="profile_posts")
]


views.py片段:

def all_posts(request):

    posts = Post.objects.all()
    posts = posts.order_by("-timestamp").all()

    return JsonResponse([post.serialize() for post in posts], safe=False)

def profile_posts(request, poster):

    posts = Post.objects.get(poster=poster)
    posts = posts.order_by("-timestamp").all()

    return JsonResponse([post.serialize() for post in posts], safe=False)

def profile(request, poster):

    return render(request, "network/profile.html", {
        "poster": poster,
    })


下面是一个js文件,它包含了类似的fetch请求,可以很好地工作。为什么这一个可以工作(即返回JSON),而另一个返回html?:

function load_posts() {

    console.log("load_posts running");

    document.querySelector('#all-posts').style.display = 'block';


    fetch(`/all_posts`)
    .then(response => response.json())
    .then(posts => {
        // Print posts
        console.log(posts);
        posts.forEach(post => show_posts(post));
    });

}

piah890a

piah890a1#

在调试模式下,当出现错误时,django会返回一个html响应,通常这就是问题所在,我认为你传递了一个参数poster给视图函数,但你没有排除url路径中的一个
在未来有几件事要记住,当你得到一个不同的响应,然后你期望的,你应该检查你的日志在终端或检查响应代码在控制台客户端,如果它开始与5 ot是一个服务器错误,ot开始与4它没有找到或类似,你应该检查日志
下面是你应该如何修改你的代码:将str:poster添加到URL路径中,并修改fetch请求以将其包含在您的URL中

相关问题