Возврат HTML представления против JSON объекта с HTML с помощью Flask & AJAX

Я разрабатываю одностраничное Flask-приложение, использующее AJAX для навигации по маршрутам. Например, когда пользователь нажимает на навигационную ссылку, делается GET-запрос с помощью AJAX, который вызывает маршрут типа "/profile", который возвращает JSON, включающий HTML для замены на экране.

Если я набираю существующий маршрут в браузере без вызова AJAX-запроса, HTML возвращается, как и ожидалось, в виде JSON и просто вставляется как текст на экране. Я хотел бы дать пользователям возможность вводить маршруты в адресной строке и получать загруженную страницу, а не просто вставлять JSON вместе с HTML. Каков правильный способ вернуть представление вместо простого JSON из моей конечной точки Flask, если не было сделано никакого AJAX запроса (кто-то просто набирает "/profile" в браузере, не нажимая на навигационную ссылку профиля)?

Моя первая мысль - передать какой-нибудь параметр как часть каждого AJAX запроса и заставить бэкенд проверить, существует ли параметр при вызове, где я бы вернул представление вместо JSON. Это кажется очень неэффективным и усложнит код, добавив множество дополнительных операторов if. Кроме того, мне придется создать 2 HTML-файла для каждого маршрута.

Как правильно поступить в этом случае?

Если вы делаете ajax-запрос, вы можете добавить это в свой маршрут.

_xhr_key = request.headers.get('X-Requested-With')
if _xhr_key and _xhr_key == 'XMLHttpRequest': # if true this means that its an AJAX call
    #return data for AJAX function
else:
    #return data for regular request
    #render HTML template to the user over here since its a regular request

Аякс-запросы создают объект XMLHttpRequest. Если в заголовке присутствует объект XMLHttpRequest, это означает, что это AJAX-запрос. Таким образом, вы можете загрузить веб-страницу, когда она обычно загружается, таким образом, вы можете отобразить страницу с помощью AJAX, когда кто-то обычно набирает ссылку в браузере

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