2012-03-27 3 views
6

Чтобы получить доступ к странице подробности о Элемента на моем сайте, можно было бы использовать следующий URLURL дизайн: способы скрыть рк/идентификатор из URL

<mydomain>/item/1 

где 1 является первичным ключом Пункт

Я ищу решение, которое позволяет мне перепроектировать URL со следующими требованиями:

  • исключить рк или любые последовательные IdS из URL
  • иметь возможность однозначно получить доступ к странице сведений об элементе

Я собирался спросить это как общий дизайн вопрос веба, но просто подумал, что я должен сказать, что я работаю с Python/Django.

+1

slugfield - хороший выбор! – dm03514

ответ

6

Вы должны иметь некоторые вид идентификатора в URL, и этот идентификатор:

  1. должен быть уникальным (не два объекта не могут иметь один и тот же идентификатор)
  2. должен быть постоянным (идентификатор для объекта никогда не может измениться)

так что не так много вариантов, и первичный ключ объекта является лучшим выбором. Если по какой-то причине вы не можете использовать это (почему бы и нет?), Вы можете закодировать или обфускать его: см. this question и его ответы на некоторые идеи о том, как это сделать.

Дизайн собственного URL-адреса переполнения стека стоит посмотреть. Вы можете связаться этот вопрос с помощью любого URL вида

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

Это позволяет URL содержать ключевые слова из названия на вопрос (для поисковых систем), а также возможность изменить при изменении названия не нарушая старых ссылок.

+0

Спасибо Гарет. Ваш ответ дает мне хорошие указания на то, что я смутно имею в виду. Причина, по которой я не хочу использовать автоматически генерируемый pk в URL-адресе, заключается в том, что я не хочу, чтобы посторонние могли выяснить, сколько элементов было создано на сайте. Вот вам следующий вопрос. Было бы лучше придерживаться автоматически сгенерированного pk и принять решение encode/obfuscate, или спроектировать и использовать функцию для генерации неустойчивого pk? Спасибо. – tamakisquare

+3

Придерживайтесь автоматического сгенерированного первичного ключа в базе данных и используйте кодировку в URL-адресе. (Если вы используете кодировку в URL-адресе, у вас всегда будет возможность изменить схему кодирования в будущем, если вы найдете проблемы с ней, но если вы сделаете это в базе данных, это трудно изменить.) –

+0

Это хороший момент. Еще раз спасибо. :) – tamakisquare

4

Ну, есть много способов сделать это. Поскольку вы используете django, взгляните на SlugField. Или вы создаете UUID и сохраняете его на каждом элементе для доступа.

4

Для Django вы можете дать вашим моделям SlugField, а затем взгляните на модель, используя это.

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

Удостоверьтесь в том, что на нем установлена ​​определенная форма единственности.

0

Одним из грязных способов сделать это было бы использование файла cookie для хранения идентификатора запрашиваемого объекта. Мне не очень нравится эта идея, и может быть очень сложно получить поддержку для поддержки, если у вас нет опыта написания/расширения фреймворков.

Поддержка некоторых фреймворков с использованием атрибута id = вместо вашего URL-адреса. Если этот параметр включен как параметр POST, он не будет виден, но связывание страниц вместе с POST будет сложным, поскольку оно предназначено для представления данных формы.

Метод, который я хотел бы предложить, заключается в том, чтобы использовать что-то помимо идентификаторов, чтобы однозначно идентифицировать ваши объекты, если это реальное требование. Затем включите это в свой URL. Хотя это не идеальный дизайн с точки зрения базы данных, у него есть преимущества. Сначала вы должны рассмотреть, почему вы хотите скрыть эту информацию. Если это для целей SEO, использование имени элемента, а не его идентификатора - это то, что вы хотите в URL. Реальная проблема заключается в том, что если вы просто скрываете эту информацию в каком-то другом канале передачи данных, у вас есть тот же URL-адрес для разных ресурсов. Это подпарам по многим причинам, не последним из которых является SEO и пользовательские закладки. Использование читаемого человеком ключа разрешает как ситуации, так и другие, одновременно приводя в бешенство вашего администратора баз данных. Использование этого метода также должно легко работать в каркас либо напрямую, либо с помощью дополнительного кода в контроллере для перевода, что может привести вас к правильной работе с администратором баз данных.

5

Мне не нравится опция slugfield, потому что она добавляет дополнительный запрос в базу данных.

я сделал следующее в проекте:

Мой URL выглядит следующим образом:

<domain>/item/5927/728e26e9464a171b228bc9884ba3e4f76e2f8866/ 

Это:

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

Если вы не знаете, хэш вы можете» t:

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") 

Конечно, каждый раз, когда вы визуализации URL, вы должны добавить // часть.

Смежные вопросы