Возврат 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, когда кто-то обычно набирает ссылку в браузере