URL дизайн: способы скрыть pk / id от URL - PullRequest
7 голосов
/ 28 марта 2012

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

<mydomain>/item/1

, где 1 - первичный ключ элемента

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

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

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

Ответы [ 5 ]

7 голосов
/ 28 марта 2012

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

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

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

Стоит обратить внимание на собственный дизайн URL Stack Overflow. Вы можете ответить на этот вопрос по любому URL-адресу вида

/8285204/url-dizain-sposoby-skryt-pk-id-ot-url!

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

5 голосов
/ 01 июня 2013

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

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

Мой URL выглядит так:

<domain>/item/5927/728e26e9464a171b228bc9884ba3e4f76e2f8866/

Это:

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

Если вы не знаете хеш, вы не можете получить элемент:

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, вы должны добавить // часть.

4 голосов
/ 28 марта 2012

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

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

Убедитесь, что на нем есть какая-то форма ограничения уникальности.

4 голосов
/ 28 марта 2012

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

0 голосов
/ 28 марта 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...