【问题标题】:use django's reverse function in req.path在 req.path 中使用 django 的 reverse 函数
【发布时间】:2017-08-05 02:49:34
【问题描述】:

我偶然发现了邀请功能以了解它的工作原理。我在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

【问题讨论】:

  • 你必须分享你的urls.py来帮助你
  • 我还没有理解 req.path 所以我还没有创建 url。是登录的url/路径吗?
  • 为了理解 reverse 函数(这就是你要问的,对吧?)你必须实现 urls.py
  • 问题是我不明白 req.path 部分。他在那里检查什么?他指的是哪条路?你能告诉我一个例子,你将根据他使用的条件创建什么 url?使用 django-allauth 会有所不同吗?
  • 在models.py中我使用了reverse函数,我知道为什么我使用reverse函数以及给出什么路径但不知道req.path部分。你认为会是什么?你能把这个概念说清楚吗?

标签: python django django-allauth django-1.9


【解决方案1】:

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

docs召回:

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

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

根据InvitedMiddlewareMIDDLEWARE 设置中出现的顺序,InvitedMiddleware 将在每个view 调用之前被调用。它检查request.path(即即将调用view,即将渲染模板的url)是否为'/i.auth'(即127.0.0.1:8000/i.auth/。如果是,那么他返回@ 987654335@(视图从未被调用)。现在,他这样做了,这是未知的。他说我们稍后会了解这条路径的作用,但他从来没有这样做过(!)。也许有本教程的第二个系列,谁知道呢?

无论如何,如果请求的路径不是'/i.auth',则执行另一次检查。如果用户未通过身份验证。但我认为从这里开始非常简单。请记住,所有这些都发生在视图被调用之前。

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

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

其中... 是任何潜在的位置args 或/和kwargs

但该帖子的作者并未在某处定义此 URL。他也没有解释它的结构。我认为通过它并继续其余部分是安全的。

【讨论】:

  • 我对这个太感兴趣了。您将如何构建您的网址?我们必须使用 EXEMPT_URL 吗?
  • 问题是你想要这个网址做什么?。为什么你必须检查它?作者说的是无限循环,但他从未显示urls.py
  • 什么是 i.auth ?
  • 我了解中间件的概念,但我仍然对 url 部分感到困惑。那我应该给什么网址呢?
猜你喜欢
  • 2016-01-08
  • 2011-11-17
  • 1970-01-01
  • 2018-07-19
  • 1970-01-01
  • 2015-04-23
  • 2012-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多