2012-03-27 32 views
6

Para acceder a la página de detalles de un artículo en mi sitio, se podría utilizar la siguiente URLurl diseño maneras de ocultar pk/Identificación de url

<mydomain>/item/1 

donde 1 es la clave principal del artículo

Busco a una solución que me permite rediseñar la dirección URL con los siguientes requisitos:

  • excluyen pk o cualquier ID secuenciales desde la url
  • ser capaz de acceder de forma exclusiva la página Detalles del artículo

tenía la intención de pedir esto como una cuestión general de diseño web, pero sólo pensé que debería mencionar que estoy trabajando con Python/Django.

+1

slugfield es una buena opción !! – dm03514

Respuesta

6

Es necesario tener algunos tipo de identificador en la URL, y este identificador:

  1. debe ser único (no hay dos objetos pueden tener el mismo ID)
  2. deben ser permanentes (el id para un objeto nunca puede cambiar)

por lo que no hay tantas opciones, y la clave principal del objeto es la mejor opción. Si por algún motivo no puede usar eso (¿por qué no?), Puede codificarlo u ofuscarlo: consulte this question y sus respuestas para obtener algunas ideas sobre cómo hacerlo.

El propio diseño de URL de Stack Overflow merece un vistazo. Se puede llegar a esta pregunta a través de cualquier URL de la forma

https://stackoverflow.com/questions/9897050/any-text-you-like-here!

Esto permite que la URL que contenga palabras clave del título del interrogación (para motores de búsqueda) al mismo tiempo ser capaz de cambiar cuando cambia el título sin romper viejos enlaces.

+0

Gracias Gareth. Tu respuesta me proporciona buenas indicaciones para lo que vagamente tengo en mente. La razón por la que no deseo utilizar el pk generado automáticamente en la url es porque no quiero que los extraños puedan descubrir cuántos elementos se han creado en el sitio. Aquí hay una pregunta de seguimiento para usted. ¿Sería mejor quedarse con pk generado automáticamente y adoptar la solución de codificación/ocultación, o diseñar y usar una función para generar pk no continuo? Gracias. – tamakisquare

+3

Se adhieren a la clave principal generada automáticamente en la base de datos y usan la codificación en la URL. (Si codificas en la URL siempre tienes la opción de cambiar tu esquema de codificación en el futuro si encuentras problemas con él, pero si lo haces en la base de datos es difícil de cambiar). –

+0

Ese es un buen punto. Gracias una vez más. :) – tamakisquare

4

Bueno, hay muchas formas de hacerlo. Como está usando django, eche un vistazo al SlugField. O genera UUID y lo almacena en cada elemento para acceder.

4

Para Django, puede dar a sus modelos un SlugField, luego haga que la vista busque el modelo usando eso.

MyModel.objects.filter(slug_field_name='some-slug-value') 

Asegúrate de que haya alguna forma de restricción de exclusividad en él.

0

Una manera sucia de hacer esto sería usar una cookie para contener la identificación del objeto que se solicita. No me gusta especialmente la idea y puede ser muy difícil conseguir un marco de apoyo a menos que tenga experiencia escribiendo/ampliando marcos.

Algunos marcos soportan el uso de un id = atributo en lugar de la ruta de su URL. Si esto se incluye como un parámetro POST, no será visible, pero vincular páginas con POST sería todo un desafío, ya que está destinado a la presentación de datos del formulario.

El método que sugeriría es utilizar algo además de los identificadores para identificar de manera única sus objetos si esto es un requisito real. Luego incluye eso en tu URL. Si bien este no es un diseño ideal desde la perspectiva de la base de datos, sí tiene beneficios. Primero debes considerar por qué quieres ocultar esta información. Si es para fines de SEO, usar el nombre del elemento en lugar de su ID es lo que quiere en la URL. El verdadero problema es que si oculta esta información en algún otro canal de datos, entonces tiene la misma URL para diferentes recursos. Esto no está a la altura de muchas razones, entre las que destacan SEO y los marcadores de los usuarios. El uso de una clave legible por humanos resuelve ambas situaciones y otras, al tiempo que enfurece a su DBA. El uso de este método también debería funcionar fácilmente en un marco de trabajo, ya sea directamente o mediante el uso de un código adicional en el controlador para realizar la traducción, lo que podría configurarlo correctamente con el DBA.

5

No me gusta la opción slugfield porque agrega una consulta adicional a la base de datos.

hice lo siguiente en un proyecto:

Mi URL tiene el siguiente aspecto:

<domain>/item/5927/728e26e9464a171b228bc9884ba3e4f76e2f8866/ 

Esto es:

<domain>/item/<id>/<hash>/ 

Si usted no sabe el hash se puede' Llegue al artículo:

urls.py:

url(r'^item/(?P<id>\d+)/(?P<hash>\w+)/$', 'rwapp.views.item', name='item') 

views.py:

from hashlib import sha1 

def item(request,id=None,hash=None): 
    if not id: 
     return HttpResponseRedirect("/home") 
    if hash: 
     chash = sha1("secret_word%s"%id).hexdigest() 
     if not chash==hash: 
      return HttpResponseRedirect("/home") 
    else: 
     return HttpResponseRedirect("/home") 

Por supuesto, cada vez que se renderiza la URL que hay que añadir la // parte.

Cuestiones relacionadas