如果用户1创建此票证: mywebsite /经理/票/票证从用户-1 /
用户2创建: mywebsite /经理/票/票证从用户-2 /
如何通过在网址中输入来阻止用户1从用户2或其他用户访问该票证?
views.py
class TicketDisplay(LoginRequiredMixin, DetailView):
model = Ticket
template_name = 'ticket_detail.html'
context_object_name = 'ticket'
slug_field = 'slug'
def get_context_data(self, **kwargs):
context = super(TicketDisplay, self).get_context_data(**kwargs)
context['form_add_comment'] = CommentForm()
return context
url.py
url(r'^manager/tickets/(?P<slug>[-\w]+)/$',views.TicketDetail.as_view(), name='ticket_detail')
答案 0 :(得分:1)
我最近在一个项目中实现了这个功能。它可以通过使用自动生成的uuid来完成。为此,Django有a built-in model field,或者你可以使用一个slug字段并给它一个默认值。这是一个简单的例子。
在models.py文件中,导入uuid库,然后将slug字段的默认值设置为uuid.uuid4。
models.py:
import uuid
class Ticket(models.Model):
uuid = models.SlugField(default=uuid.uuid4, editable=False)
...
在urls.py中,只需使用uuid字段就好像它是pk一样。像这样:
url(r'^manager/tickets/(?P<uuid>[0-9a-z-]+)/?$', TicketDetail.as_view(), name='ticket-detail'),
在你的细节,更新和删除视图中,你需要确保并设置这两个属性,以便Django知道哪个字段用作slug:
slug_field = 'uuid'
slug_url_kwarg = 'uuid'
然后在你的模板中,每当你需要为kwargs检索一个对象时,只需使用uuid而不是pk。
注意除此之外,您还应该尽力使用权限阻止用户查看其他网页。您可以阻止某些帐户查看其他人的详细信息。例如,您可以编写权限mixin来检查request.user是否与视图正在处理的对象匹配。
tldr 这假设您与Ticket
模型上的用户有某种关系:
class SameUserOnlyMixin(object):
def has_permissions(self):
# Assumes that your Ticket model has a foreign key called user.
return self.get_object().user == self.request.user
def dispatch(self, request, *args, **kwargs):
if not self.has_permissions():
raise Http404('You do not have permission.')
return super(SameUserOnlyMixin, self).dispatch(
request, *args, **kwargs)
最后,坚持你的观点:
class TicketDisplay(LoginRequiredMixin, SameUserOnlyMixin, DetailView):
...
答案 1 :(得分:0)
您需要让用户1拥有用户2无法模仿的内容。
首选方法是使用您现有的身份验证方法,并检查是否允许访问该页面的用户这样做。
如果您没有在自己的网站上注册,那么您可以生成一些随机字符串 - secret
- 并将其存储在问题中。如果&#39;用户&#39;那是secret
然后他被允许。
此秘密字符串可以存储在cookie中,也可以作为URL的一部分。
将其存储在cookie中有一个缺点:如果cookie丢失,那么没有人可以访问该页面。用户也无法从其他浏览器访问它。
将其作为网址的一部分还有另一个缺点:如果其他人看到该链接,他也可以访问该网页。如果用户的软件自动报告他在某处访问的相似信息,那么这可能会很糟糕。
结合这些方法有两个缺点。