Fetch возвращает html, а не JSON ответ

Я работаю над проектом cs50 по веб-разработке Network. В основном строю подражатель твиттера.

Все еще в процессе, но на данный момент у меня есть два запроса на получение ответа в формате JSON. Один работает отлично, но другой, очень похожий запрос, возвращает html вместо JSON, вызывая ошибку. Не могу понять, почему этот не работает. Фрагменты кода ниже:

Вот тот, который по какой-то причине возвращает html для моего файла profile.html. Закомментированные части - это фактический запрос 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 snippet:

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));
    });

}

В режиме отладки django возвращает html-ответ при возникновении ошибки, обычно проблема заключается в этом, я думаю, что вы передаете параметр poster в функцию view, но не исключаете его в пути url

В будущем есть несколько вещей, которые следует запомнить, когда вы получаете ответ, отличный от ожидаемого, вам следует проверить логи в терминале или проверить код ответа в консоли на стороне клиента, если он начинается с 5, то это ошибка сервера, если начинается с 4, то он не найден или что-то подобное, и вам следует проверить логи

Вот как вы должны изменить свой код: Добавьте str:poster к пути url и измените запрос на выборку, чтобы включить это в ваш url

Вернуться на верх