在req.path中使用django的反向函数

时间:2017-03-14 16:33:08

标签: python django django-allauth django-1.9

我在邀请功能上磕磕绊绊地了解它是如何工作的。我在http://www.pythondiary.com/tutorials/create-invite-only-website.html找到了博文。在那里作者说(它检查路径,因为如果没有检查,这将导致无限循环)。如何使用反向函数检查路径?

class Invite(models.Model):
    INVITE_CHOICES = (
    ('G', 'General'),
    ('I', 'Invitational'),
    )
    user = models.OneToOneField(User)
    cookie = models.UUIDField(default=uuid.uuid4)
    token = models.UUIDField(default=uuid.uuid4, unique=True, editable=False)

    def __str__(self):
        return self.user.username

    # def get_absolute_url(self):
    #     return reverse('user_mgmt:confirm_invite', kwargs={'token': self.token})

class InvitedMiddleware(object):
    def process_request(self, req):
        if req.path == '/i.auth': # what path is this?
            return None
        if not req.user.is_authenticated():
            if 'token' in req.COOKIES:
                return redirect('user_mgmt.views.login_user')
        return None

    def process_response(self, req, resp):
        if req.user.is_authenticated():
            if req.user.is_staff:
                return resp
            if 'token' in req.COOKIES:
                token = req.COOKIES['token']
            else:
                invite = Invite.objects.get(user=req.user)
                token = invite.token
            resp.set_cookie('token', token, MAX_AGE=1209600)
        return resp

1 个答案:

答案 0 :(得分:0)

行。但首先请注意,此示例使用旧的Middleware声明和语法。如果您感觉舒服,请切换到新的Middleware语法。另外它是5年前写的(!),从那时起Django发生了很多变化!

回顾docs

  

你可以像洋葱一样想到它(中间件):每个中间件类都是一个“层”   包裹视图,这是洋葱的核心。如果请求   穿过洋葱的所有层,一直到   在核心视图中,响应将通过每一层   (在相反的顺序)回来的路上。

所以,作者在这里做的是:

根据InvitedMiddlewareInvitedMiddleware设置的外观顺序,view会在每次request.path来电之前调出。它会检查view(即即将调用'/i.auth'的即将呈现模板的网址)是否为127.0.0.1:8000/i.auth/(即None。如果是,那么他返回'/i.auth'(视图永远不会被调用)。现在,他做到了,它的未知。他说我们将会看到这条路径后来做什么但是他从来没有做过(!)。也许这个教程的第二个系列,谁知道呢?

无论如何,如果请求的路径不是if req.path == reverse('url_name', ...): ,则执行另一次检查。如果用户未经过身份验证。但我认为从这里开始它非常简单。请记住,所有这些都发生在调用视图之前。

如果现在使用了MIDDLEWARE方法,它应该如下所示:

...

其中args是任何潜在的位置kwargs或/和$ Android/Sdk/tools/bin/avdmanager create avd --name Nexus6P --tag 11 --package 'system-images;android-23;google_apis;x86_64' Error: Invalid --tag 11 for the selected package. $ Android/Sdk/tools/bin/avdmanager create avd --name Nexus6P --package 'system-images;android-23;google_apis;x86_64' Error: Invalid --tag default for the selected package. $ Android/Sdk/tools/bin/avdmanager list Available Android Virtual Devices: Available devices definitions: ... --------- id: 11 or "Nexus 6P" Name: Nexus 6P OEM : Google ---------

但该帖子的作者并没有定义这个URL的某个地方。他也没有解释它的结构。我认为通过它并继续其余的是安全的。