在网址

时间:2016-06-10 18:13:49

标签: python django django-views

如果用户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')

2 个答案:

答案 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丢失,那么没有人可以访问该页面。用户也无法从其他浏览器访问它。

将其作为网址的一部分还有另一个缺点:如果其他人看到该链接,他也可以访问该网页。如果用户的软件自动报告他在某处访问的相似信息,那么这可能会很糟糕。

结合这些方法有两个缺点。