Estoy desarrollando una aplicación Flask de una sola página usando AJAX para navegar por mis rutas. Por ejemplo, cuando un usuario hace clic en un enlace de navegación, se realiza una solicitud GET con AJAX que llama a una ruta como "/profile", que devuelve un JSON que incluye el HTML que se reemplazará en la pantalla.
Si escribo una ruta existente en el navegador sin llamar a una solicitud AJAX, el HTML se devolverá como se esperaba como un JSON y simplemente se pegará como texto en la pantalla. Me gustaría dar a los usuarios la posibilidad de escribir rutas en la barra de direcciones y hacer que la página se cargue en lugar de simplemente pegar el JSON con el HTML. ¿Cuál es la forma correcta de devolver una vista en lugar de simplemente el JSON desde mi punto final Flask si no se realizó una solicitud AJAX (alguien simplemente escribe "/ perfil" en el navegador sin hacer clic en el enlace de navegación del perfil)?
Mi primer pensamiento es pasar algún tipo de parámetro como parte de cada solicitud de AJAX y hacer que el backend verifique si el parámetro existe al ser llamado, donde devolvería una vista en lugar de JSON. Eso parece muy ineficiente y haría que el código fuera más complejo al agregar muchas más declaraciones if. Además, tendría que crear 2 archivos HTML para cada ruta.
¿Cuál es la forma correcta de hacer esto?
Si está realizando una solicitud ajax, puede agregar esto a su ruta.
_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 requestLas solicitudes Ajax crean un objeto XMLHttpRequest . Entonces, si el objeto XMLHttpRequest está presente en el encabezado, significa que es una solicitud AJAX. Así es como puede cargar una página web cuando un usuario normalmente la carga, por lo tanto, puede mostrar la página usando AJAX y cuando alguien normalmente escribe el enlace en el navegador