url design:从url隐藏pk/id的方法

tam*_*are 7 python django url

要访问我网站上的项目的详细信息页面,可以使用以下网址

<mydomain>/item/1
Run Code Online (Sandbox Code Playgroud)

其中1是Item的主键

我正在寻找一种解决方案,允许我重新设计具有以下要求的网址:

  • 从网址中排除pk或任何顺序ID
  • 能够唯一地访问项目详细信息页面

我打算将此问题作为一般网页设计问题,但我想我应该提到我正在使用Python/Django.

Gar*_*ees 7

你需要有一些样的URL标识,而这个标识:

  1. 必须是唯一的(没有两个对象可以具有相同的ID)
  2. 必须是永久的(对象的id永远不会改变)

所以没有那么多选项,对象的主键是最好的选择.如果由于某种原因你不能使用它(为什么不呢?)你可以编码或混淆它:看到这个问题及其答案,以获得有关如何做到这一点的一些想法.

Stack Overflow自己的URL设计值得一看.您可以通过表单的任何网址来解决此问题

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

这允许URL包含问题标题中的关键字(对于搜索引擎),同时还能够在不破坏旧链接的情况下更改标题.

  • 坚持在数据库中自动生成主键并在URL中使用编码.(如果你在URL中进行编码,如果你发现它有问题,你将来可以选择改变你的编码方案,但如果你在数据库中这样做,就很难改变.) (3认同)

Eva*_*ter 5

对于 Django,你可以给你的模型一个SlugField,然后让视图使用它查找模型。

MyModel.objects.filter(slug_field_name='some-slug-value')
Run Code Online (Sandbox Code Playgroud)

确保某种形式的唯一性约束在其上。


Jua*_*oco 5

我不喜欢slugfield选项,因为它向数据库添加了一个额外的查询.

我在一个项目中做了以下事情:

我的网址如下所示:

<domain>/item/5927/728e26e9464a171b228bc9884ba3e4f76e2f8866/
Run Code Online (Sandbox Code Playgroud)

这是:

<domain>/item/<id>/<hash>/
Run Code Online (Sandbox Code Playgroud)

如果您不知道哈希,则无法访问该项目:

urls.py:

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

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")
Run Code Online (Sandbox Code Playgroud)

当然,每次渲染URL时都必须添加//部分.