Foros del Web » Programando para Internet » Python »

Django: Problema con patrón de regex cuando utilizo varias URL con el mismo patrón

Estas en el tema de Django: Problema con patrón de regex cuando utilizo varias URL con el mismo patrón en el foro de Python en Foros del Web. Hola a todos. Soy un novato en Django y Python, ayer me encontré con este problema: Tengo varias URL con formato de slugs, pero el ...
  #1 (permalink)  
Antiguo 22/09/2013, 09:00
Avatar de Gguer  
Fecha de Ingreso: abril-2009
Mensajes: 125
Antigüedad: 15 años
Puntos: 1
Django: Problema con patrón de regex cuando utilizo varias URL con el mismo patrón

Hola a todos.

Soy un novato en Django y Python, ayer me encontré con este problema:

Tengo varias URL con formato de slugs, pero el patrón de la expresión regular que utilizo,
Código:
(?P<slug_categoria>[\w-]+)
, causa conflicto cuando tengo más de una url. El navegador no sabe a cuál de todas las URL registradas debe enviar la petición (bueno, en realidad toma el primer elemento que coincida con el patrón), porque realmente todas aceptan el mismo formato.

Éstas son tres URL en mi archivo urls.py:

Código Python:
Ver original
  1. url(r'^(?p<slug_etiqueta>[\w-]+)/$', views.categoria, 'name=categoria'),
  2. url(r'^(?p<slug_categoria>[\w-]+)/$', views.categoria, 'name=categoria'),
  3. url(r'^(?p<slug_depto>[\w-]+)/$', views.departamento, 'name=departamento'),

Me gustaría que mis URL quedaran en este formato:

Código:
categoria: /productos/baterias-acusticas
etiqueta: /productos/set-de-bateria-acustica
departamento: /productos/baterias-y-percusion
Pero cuando se envía la petición, la URL que recibe slug_etiqueta es la primera que se llama, porque es la primera que coincide con el patrón [\w-]+.

Para que funcionara cada URL, las configuré de esta manera:

Código:
etiqueta: /productos/etiqueta/set-de-bateria-acustica
categoria: /productos/categoria/baterias-acusticas
departamento: /productos/departamento/baterias-y-percusion
Pero francamento quisiera evitar ese espacio extra, porque me gusta mucho cómo lucen en la primera forma. De cualquier manera este problema creo que va a volverme a pasar porque suena muy común. ¿Alguno de ustedes ha psado por esto? ¿Cómo pudo solucionarlo?

Un saludo :)

Última edición por Gguer; 22/09/2013 a las 09:03 Razón: Título más apropiado
  #2 (permalink)  
Antiguo 22/09/2013, 09:33
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Django: Problema con patrón de regex cuando utilizo varias URL con el mism

Creo que producto/etiqueta o producto/categoria sería lo mas apropiado. Otra cosa trata de que `name` sea único, ya que puedes tener tener problemas después para resolver una url.

Si quieres tenerlo en el formato que quieres puedes hacer varias cosas:

Capturar ese slug y mandarlo a una sola vista. Después ir probando si es un departamento, una etiqueta o una categoría. La desventaja de esto es que puedes tener los 3 términos con el mismo slug. (Este no lo recomiendo).

Si se te hace muy largo poner /categoria/slug/, /etiqueta/slug/, /departamento/slug/ entonces puedes abreviarlo a una letra. /c/slug/, /e/slug/, /d/slug/ (tal vez el mejor balance)
  #3 (permalink)  
Antiguo 22/09/2013, 10:26
Avatar de Gguer  
Fecha de Ingreso: abril-2009
Mensajes: 125
Antigüedad: 15 años
Puntos: 1
Respuesta: Django: Problema con patrón de regex cuando utilizo varias URL con el mism

Hola, @razpeitia. Gracias por responder.

Lo siento, no me di cuenta que estaba repetida la vista en las dos primeras URL, pero creo que ya no puedo editarlo. La primera, naturalmente, dirige a una vista llamada etiqueta.

Creo que en este proyecto no pueden repetirse los slugs, porque cada departamento, categoría y estiqueta son diferentes, uno derivado del otro. Me agrada tu primera propuesta, pero me asusta un poco la velocidad que pueda tardarse en comprobar si es departamento, categoria o vista.

Sobre tu segunda propuesta, ¿también la recomiendas si me importa el tema de SEO? El poner la inicial me hace pensar que puede volverse menos claro para un buscador.

este proyecto no es comercial, me lo inventé para aprender Python con Django :) Por eso quiero saber las buenas prácticas, pero estoy probando de todo, qué funciona y qué no.
  #4 (permalink)  
Antiguo 22/09/2013, 16:05
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Django: Problema con patrón de regex cuando utilizo varias URL con el mism

Cita:
Iniciado por Gguer Ver Mensaje
Me agrada tu primera propuesta, pero me asusta un poco la velocidad que pueda tardarse en comprobar si es departamento, categoria o vista.
No, no creo que la velocidad aquí sea un problema. Comparado con las millones de operaciones por segundo que puede hacer una maquina moderna, una expresión regular tan sencilla no es problema. Ademas si conoces de expresiones regulares sabrás que falla tan pronto como encuentre una diferencia.

Cita:
Iniciado por Gguer Ver Mensaje
Sobre tu segunda propuesta, ¿también la recomiendas si me importa el tema de SEO? El poner la inicial me hace pensar que puede volverse menos claro para un buscador.
Creo que esta pregunta sería mas para SEO (lo cual no es mi área), pero redes sociales como twitter, G+, etc... usan este tipo de abreviación en la url sin ningún problema.
  #5 (permalink)  
Antiguo 23/09/2013, 08:04
Avatar de Gguer  
Fecha de Ingreso: abril-2009
Mensajes: 125
Antigüedad: 15 años
Puntos: 1
Respuesta: Django: Problema con patrón de regex cuando utilizo varias URL con el mism

Pensaba que algo más avanzado como las Class Based-Views para tratar las vistas en Django podría ayudarme también a resolver esta cuestión, pero eso apenas voy a estudiarlo hoy.

Muchas gracias por tu ayuda, razpeitia. Nos estamos viendo :)

Etiquetas: django, urls
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:43.