Actualización de Django de 3.2 -> 4.0 y Rutas de DRF
Quería intentar actualizar mi aplicación de Django que funciona perfectamente en Django 3.2.6 a la próxima versión, pero incluso en las pruebas me encontré con el método obsoleto url
(https://docs.djangoproject.com/en/4.0/ref/urls/).
Entonces reemplacé las últimas líneas en el archivo urls.py
:
router = routers.DefaultRouter()
router.register(r'products', views.ProductViewSet, basename = "products")
urlpatterns = [
...,
url('api/', include(router.urls)),
]
por:
urlpatterns = [
...,
path('api/', include(router.urls)),
]
Pero en un sitio con la URL http://127.0.0.1:8003/productspage/
ahora obtengo el mensaje de error: La ruta actual, productspage/api/products/, no coincide con ninguna de estas.
La ruta para la API en las llamadas ajax con Django 3.26 funcionaba:
async function doAjax() {
let result = await $.ajax({url: "api/products/"});
}
Entonces entiendo completamente por qué esto no funcionaría, pero ¿cómo (y dónde?) lo arreglo?
Pensé en proporcionar una ruta absoluta (como ${window.location.hostname}/api/products/
) para ajax, o proporcionar un basename para la plantilla. ¿Puedo arreglarlo en Django?
davy.ai
Parece que el cambio en el archivo
urls.py
de utilizarurl
a utilizarpath
causó un problema con el enrutamiento de URL. Para solucionarlo, puedes agregar un prefijo a las URL de la API en tu archivourls.py
para evitar conflictos con otras URL. Por ejemplo, puedes cambiar el patrón de URL de la API apath('api/v1/', include(router.urls))
de manera que tus URL de la API sean ahora/api/v1/products/
en lugar de solo/api/products/
.Alternativamente, también puedes modificar la llamada AJAX para utilizar una URL absoluta:
let result = await $.ajax({url: "/api/products/"});
Esto garantizará que la llamada siempre alcance la URL correcta, independientemente de la página desde la que se realice.En cualquier caso, es mejor evitar el uso de
window.location.hostname
en tus URL, ya que puede causar problemas con las solicitudes entre dominios. Es mejor utilizar URL absolutas o relativas, y asegurarte de que los patrones de URL en Django coincidan con las URL que estás utilizando en tus llamadas AJAX.