我在邀请函功能上遇到了障碍,无法理解它是如何工作的。我在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

最佳答案

好 啊。但首先要注意,这个示例使用了旧的Middleware声明和语法。当您感到舒服时,切换到新的Middleware语法。另外它是5年前写的(!),从那以后,Django发生了很多变化!
回忆起docs
你可以把它(中间件)想象成洋葱:每个中间件类都是一个“层”
这包裹了视图,它在洋葱的核心。如果请求
穿过洋葱的所有层,一直到
在核心的视图中,响应将通过每一层
(以相反的顺序)在回来的路上。
所以,作者在这里做的是:
根据InvitedMiddleware内部MIDDLEWARE设置的出现顺序,每次InvitedMiddleware调用之前都会调用view。它检查request.path(即即将调用view,即将呈现模板的url)是否'/i.auth'(即127.0.0.1:8000/i.auth/)。如果是,则返回None(视图从不被调用)。现在,他做到了,这是未知的。他说我们以后会走这条路,但他从来没有做过(!)。也许本教程还有第二个系列,谁知道呢?
无论如何,如果请求的路径不是'/i.auth',则执行另一个检查。如果用户未通过身份验证。但我觉得从现在开始很简单。记住,所有这些都发生在调用视图之前。
如果,现在使用reverse方法,应该如下所示:

if req.path == reverse('url_name', ...):

其中...是任何潜在的位置args或/和kwargs
但那篇文章的作者并没有在某个地方定义这个URL。他也没有解释它的结构。我认为通过这一点并继续其余的工作是安全的。

关于python - 在req.path中使用Django的反向功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42791562/

10-12 18:54