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")
6条答案
按热度按时间r8uurelv1#
你需要在URL中有 * 某种 * 标识符,这个标识符:
1.必须是唯一的(没有两个对象可以有相同的id)
1.必须是永久的(对象的id永远不能改变)
所以没有那么多的选项,对象的主键是最好的选择。如果由于某种原因你不能使用它(为什么不呢?)可以对它进行编码或模糊处理:请参阅this question及其答案,了解如何做到这一点。
Stack Overflow自己的URL设计值得一看。您可以通过以下形式的任何URL访问此问题
https://stackoverflow.com/questions/9897050/any-text-you-like-here!
这允许URL包含来自问题标题的关键字(用于搜索引擎),同时还能够在标题更改时更改而不破坏旧链接。
oewdyzsn2#
我不喜欢slugfield选项,因为它向数据库添加了一个额外的查询。
我在一个项目中做了以下事情:
我的URL看起来像这样:
这是:
如果你不知道哈希值,你就无法访问该项目:
urls.py:
views.py:
当然,每次呈现URL时,都必须添加//部分。
xmakbtuz3#
对于Django,你可以给予你的模型一个SlugField,然后让视图使用它来查找模型。
确保它有某种形式的唯一性约束。
8ulbf1ek4#
有很多方法可以做到这一点。既然你正在使用django,那么看看SlugField。或者生成UUID并将其存储在每个项目上以供访问。
ccrfmcuu5#
这样做的一个肮脏的方法是使用cookie来保存被请求对象的ID。我不是特别喜欢这个想法,除非你有编写/扩展框架的经验,否则很难得到一个框架的支持。
一些框架支持使用id=属性代替URL路径。如果这是作为POST参数包含的,它将不可见,但将页面与POST链接在一起将是一个挑战,因为它旨在提交表单数据。
我建议的方法是,如果这是一个真实的的需求,使用除了id之外的东西来唯一地标识你的对象。然后将其包含在您的URL中。虽然从数据库的Angular 来看,这不是一个理想的设计,但它确实有好处。首先,您必须考虑为什么要隐藏这些信息。如果是出于SEO目的,在URL中使用项目的名称而不是其ID是您想要的。真实的的问题是,如果您只是将此信息隐藏在其他一些数据通道中,那么您将拥有不同资源的相同URL。这是低于标准杆的原因很多,其中最重要的是SEO和用户书签。使用人类可读的密钥可以解决这两种情况和其他情况,但会激怒DBA。使用这种方法还可以很容易地将其应用到框架中,可以直接使用,也可以通过在控制器中使用附加代码来进行转换,这可能会使您与DBA的关系变得正确。
a0x5cqrl6#
我认为这正是https://hashids.org/的作用。
从整数生成短的唯一ID
Hashids是一个小型的开源库,可以从数字中生成简短,唯一,非顺序的id。
它可以将347这样的数字转换为“yr8”这样的字符串,或者将[27,986]这样的数字数组转换为“3kTMd”。