我有一个看起来像这样的Django模型:
class Person(models.Model):
name = models.CharField(max_length=32)
place = models.ForeignKey(Place, related_name='people')
approved = models.BooleanField()
objects = PersonManager()
@models.permalink
def get_absolute_url(self):
return('deal_details', (), {
'person_slug': slugify(self.name),
})
如您所见,我已经拥有该对象的绝对URL。但是,我想创建一个难以猜测的URL来跟踪对象的批准过程。任何人做过类似的事情和/或对我应该如何进行有任何建议?
我的第一个想法是创建一个像obfuscated_key
这样的模型字段,它是通过save
function of the model随机生成的。然后,URL看起来像/people/status/<id>/<obfuscated_key>/
。但也许有更好的方法来解决这个问题?
答案 0 :(得分:4)
执行此操作的一种好方法是使用安装的密钥(来自settings.py)散列对象的ID。这就是密码重置电子邮件表单的作用 - django.contrib.auth.tokens
中有一些有用的代码 - 在最新的SVN版本中,django.contrib.auth.crypto
。
答案 1 :(得分:0)
像URL缩短程序(读取:混淆)之类的东西可能有用。
答案 2 :(得分:0)
我已经使用UUIDField做了类似的事情。
在模型中:
uuid = UUIDField(auto=True)
然后在视图中检查id和uuid:
item = get_object_or_404(Item, id=id, uuid__exact=uuid)
UUIDField来自http://djangosnippets.org/snippets/335/