【问题标题】:Referring to an object in the URL - do you use primary key or what is the best practice?引用 URL 中的对象 - 您使用主键还是最佳做法是什么?
【发布时间】:2013-12-31 09:23:06
【问题描述】:

我想通过我的 URL 引用某个数据实例。推荐的方法是什么?我应该使用该数据的主键还是不必要地公开数据库信息?即使使用 PK,URL 也不是“干净的”。那你平时是怎么处理的呢?

详情:

我的网站使用 django。我有一个名为“团队”的模型。任何老师都可以在线创建自己的团队,然后将其添加到数据库中。我不要求团队名称是唯一的。一位教师可以有多个团队。

现在,任何“将学生添加到团队”、“将作业分配给团队”的任何操作都需要在 URL 中传递对团队的引用。比如:

 {{ SITE_URL }}/add-student/{{ team }}/

由于名称不唯一,我无法使用该名称。

目前,我在创建每个团队时为其分配一个 UUID,并在我的 URL 中使用该 uuid。这行得通,但它会产生丑陋的 URL。

我可以使用团队的主键,它会比 uuid 短,但又不是一个很好的 URL。我还想知道暴露模型数据库条目的主键是否是一个安全问题?不过,我注意到 SO 似乎在其 URL 中使用了主键。

那么这里的最佳做法是什么?

【问题讨论】:

  • 我使用 slug 字段来提供人类可读(和 SEO)的 URL。 ClassBasedViews 可以使用 slug 来查找对象。

标签: sql django database-design django-models django-database


【解决方案1】:

Django 的基于类的视图(DetailViewUpdateView)默认使用 url 中的 pk 作为命名的 url 组来确定要获取的对象,因此我认为它不违反任何通过在 url 中使用 pk 来练习。

如果您想要一个非常令人难忘的网址,您可以创建一个 slug 并附加 pk,虽然不是完美的最佳选择,但仍然比 UUID 更令人难忘

我也相信,您的视图应该验证请求用户是否具有查看 url 的正确权限,这应该与实际的 url 结构无关。

【讨论】:

  • DetailView 将使用 pk OR slug。两者都不需要。
  • 谢谢。是的,我在授予访问权限之前在视图中进行了验证。我只是担心如果我使用 pk_id 是否存在任何安全违规。我想不会。
猜你喜欢
  • 1970-01-01
  • 2015-01-09
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多