Django, React, Axios возвращают html вместо данных json

Я работаю над веб-приложением с Django Rest Framework и React.

Когда я делаю запрос к Django через http://localhost:8000/api/v1/auth/users/daniel/ для профиля пользователя, он возвращает JSON, но вместо того, чтобы возвращать ответ userProfile в качестве значения данных, он возвращает некоторый HTML-код реакции/Vite.

Ответ

<!doctype html>
<html lang = "en">
  <head>
    <script type = "module">
import RefreshRuntime from "/@react-refresh"
RefreshRuntime.injectIntoGlobalHook(window)
window.$RefreshReg$ = () => {}
window.$RefreshSig$ = () => (type) => type
window.__vite_plugin_react_preamble_installed__ = true
</script>

    <script type = "module" src = "/@vite/client"></script>

    <meta charset = "UTF-8" />
    <link rel = "icon" type = "image/svg+xml" href = "/vite.svg" />
    <meta name = "viewport" content = "width=device-width, initial-scale=1.0" />
    <title>Vite + React</title>
  </head>
  <body>
    <div id = "root"></div>
    <script type = "module" src = "/src/main.jsx?t=1717529669140"></script>
  </body>
</html>

Вот ответ DRF на то, что я ожидаю увидеть в ответе Reac Axios.

urls.py

urlpatterns = [
    .....,
    path('api/v1/auth/users/<str:username>/', views.UserProfileByUsernameView.as_view(), name='user-profile-by-username'),
]

view.py

class UserProfileByUsernameView(APIView):
    permission_classes = [AllowAny]

    def get(self, request, username):
        user = get_object_or_404(User, username=username)
        profile_serializer = UserProfileSerializer(user.userprofile)
        
        profile_data = profile_serializer.data
        profile_data['username'] = user.username
        profile_data['email'] = user.email

        return Response(profile_data, status=status.HTTP_200_OK)

сериализаторы.py

class UserProfileSerializer(serializers.ModelSerializer):
    username = serializers.CharField(source='user.username', read_only=True)
    email = serializers.EmailField(source='user.email', read_only=True)
    
    class Meta:
        model = UserProfile
        fields = '__all__'

профиль-page.jsx

const ProfilePage = () => {
  const { username } = useParams();
  const [userProfile, setUserProfile] = useState(null);
  const [isOwnProfile, setIsOwnProfile] = useState(false);
  const loggedInUsername = localStorage.getItem('username');

  useEffect(() => {
    const fetchUserProfile = async () => {
      try {
        const response = await axios.get(`/api/v1/auth/users/${username}/`, {
          headers: {
            'Authorization': `Bearer ${userToken()}`,
          },
        });
        console.info(response)
        setUserProfile(response.data);
        setIsOwnProfile(loggedInUsername === username);
      } catch (error) {
        console.error('Error fetching user profile:', error);
      }
    };

    fetchUserProfile();
  }, [username, loggedInUsername]);

  console.info(userProfile);

  if (!userProfile) {
    return (
      <div className = "flex justify-center items-center h-screen">
        <div className = "text-lg font-semibold">Loading...</div>
      </div>
    );
  }

Я пробовал выполнить поиск в инструментах разработчика, упростить возвращаемую модель и очистить кеш, так как в какой-то момент я увидел ответ 204, но мне не повезло.

Что, если вы поставите ?format=json в конце?

willeM_ Van Onsem 05.06.2024 15:13

Попробуйте установить новый заголовок в запросе axios: «Accept: application/json», ваш текущий Accept, вероятно, text/html.

Diego Magalhães 05.06.2024 16:08
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
2
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Представление DRF само по себе не выполняет рендеринг в JSON. На самом деле страница, которую вы просматриваете, не является JSON. Нет, это HTML, который показывает некоторые данные JSON.

Вы можете указать DRF, какой формат использовать, используя заголовок HTTP Content-Type или добавив значение format в строку запроса, например:

const response = await axios.get(`/api/v1/auth/users/${username}/?format=json`, {
  headers: {
    'Authorization': `Bearer ${userToken()}`,
  },
});

Спасибо за объяснение. Я попробовал добавить это, но разницы нет. JSON возвращается, но значение data — это значение HTML as a string, упомянутое в моем вопросе, но значение должно быть объектом userProfile.

daniellambert 05.06.2024 18:14
Ответ принят как подходящий

Чтобы решить проблему, мне пришлось добавить http://127.0.0.1:8000 к URL-адресу API.

http://127.0.0.1:8000/api/v1/auth/users/${username}.

Немного неловко, но иногда такова жизнь разработчика.

Другие вопросы по теме

Похожие вопросы

Как предварительно настроить базовую анимацию движения кадра в полиморфном компоненте, использующем слот Radix?
Почему PWA на основе реагирования, размещенное в моей службе приложений Azure, случайно начинает возвращать ошибку 500 для ВСЕХ вызовов POST (GET работает нормально)? Исправлено: Перезапустить браузер?
Не могу найти способ сделать условные реквизиты
Есть ли способ визуализировать HTML из строки в React без использования dangerouslySetInnerHTML или пакета React HTML Parser?
Ошибка теста Playwright: реквизиты возвращают разные значения в пользовательском интерфейсе тестирования Playwright и в реальном приложении React в браузере Chrome
TypeScript › Обновление импорта при перемещении файла: включено, не работает в VS Code
Эффект масштабирования при наведении изображения, отображение деталей изображения
React DatePicker не закрывается после выбора даты
Автономная библиотека веб-пакетов React
Становится ли изучение useEffect() менее важным для извлечения данных в React? Должны ли новички отдавать приоритет изучению React Query, а не useEffect()?