django url设计:如何从url中隐藏pk/id

py49o6xq  于 2023-06-25  发布在  Go
关注(0)|答案(6)|浏览(220)

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

<mydomain>/item/1

其中1是Item的主键
我正在寻找一个解决方案,让我重新设计的网址与以下要求:

  • 从url中排除pk或任何顺序id
  • 能够唯一访问“项目详细信息”页面

我本想把这个问题作为一个一般的网页设计问题来问,但我想我应该提到我正在使用Python/Django。

r8uurelv

r8uurelv1#

你需要在URL中有 * 某种 * 标识符,这个标识符:
1.必须是唯一的(没有两个对象可以有相同的id)
1.必须是永久的(对象的id永远不能改变)
所以没有那么多的选项,对象的主键是最好的选择。如果由于某种原因你不能使用它(为什么不呢?)可以对它进行编码或模糊处理:请参阅this question及其答案,了解如何做到这一点。
Stack Overflow自己的URL设计值得一看。您可以通过以下形式的任何URL访问此问题
https://stackoverflow.com/questions/9897050/any-text-you-like-here!
这允许URL包含来自问题标题的关键字(用于搜索引擎),同时还能够在标题更改时更改而不破坏旧链接。

oewdyzsn

oewdyzsn2#

我不喜欢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时,都必须添加//部分。

xmakbtuz

xmakbtuz3#

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

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

确保它有某种形式的唯一性约束。

8ulbf1ek

8ulbf1ek4#

有很多方法可以做到这一点。既然你正在使用django,那么看看SlugField。或者生成UUID并将其存储在每个项目上以供访问。

ccrfmcuu

ccrfmcuu5#

这样做的一个肮脏的方法是使用cookie来保存被请求对象的ID。我不是特别喜欢这个想法,除非你有编写/扩展框架的经验,否则很难得到一个框架的支持。
一些框架支持使用id=属性代替URL路径。如果这是作为POST参数包含的,它将不可见,但将页面与POST链接在一起将是一个挑战,因为它旨在提交表单数据。
我建议的方法是,如果这是一个真实的的需求,使用除了id之外的东西来唯一地标识你的对象。然后将其包含在您的URL中。虽然从数据库的Angular 来看,这不是一个理想的设计,但它确实有好处。首先,您必须考虑为什么要隐藏这些信息。如果是出于SEO目的,在URL中使用项目的名称而不是其ID是您想要的。真实的的问题是,如果您只是将此信息隐藏在其他一些数据通道中,那么您将拥有不同资源的相同URL。这是低于标准杆的原因很多,其中最重要的是SEO和用户书签。使用人类可读的密钥可以解决这两种情况和其他情况,但会激怒DBA。使用这种方法还可以很容易地将其应用到框架中,可以直接使用,也可以通过在控制器中使用附加代码来进行转换,这可能会使您与DBA的关系变得正确。

a0x5cqrl

a0x5cqrl6#

我认为这正是https://hashids.org/的作用。
从整数生成短的唯一ID
Hashids是一个小型的开源库,可以从数字中生成简短,唯一,非顺序的id。
它可以将347这样的数字转换为“yr8”这样的字符串,或者将[27,986]这样的数字数组转换为“3kTMd”。

相关问题