Использовать обратную функцию django в req.path

Я наткнулся на функцию приглашения, чтобы понять, как она работает. Я нашел сообщение в блоге на 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 ответ

ХОРОШО. Но сначала обратите внимание, что этот пример использует старый Middleware объявление и синтаксис. Когда вам удобно, переключитесь на новый Middlewareсинтаксис. Кроме того, она была написана 5 лет назад (!), Где с тех пор многое изменилось в Django!

Ссылаясь на документы:

Вы можете думать о нем (промежуточном программном обеспечении) как о луке: каждый класс промежуточного программного обеспечения является "слоем", который обертывает представление, которое находится в ядре лука. Если запрос проходит через все слои лука [...], вплоть до представления в ядре, ответ будет проходить через каждый слой (в обратном порядке) на обратном пути.

Итак, что автор делает здесь, это:

В зависимости от порядка появления InvitedMiddleware внутри MIDDLEWARE настройка, InvitedMiddleware будет вызываться перед каждым view вызов. Это проверяет, если request.path (т.е. URL, который собирается вызвать view, который собирается сделать шаблон - или нет) '/i.auth' (т.е. 127.0.0.1:8000/i.auth/, Если это так, то он возвращается None (мнение никогда не называется). Теперь он делает это, неизвестно. Он говорит, что мы доберемся до того, что этот путь сделает позже, но он никогда не делает (!). Может быть, есть вторая серия этого урока, кто знает?

Во всяком случае, если запрошенный путь не '/i.auth' Затем выполняется другая проверка. Если пользователь не аутентифицирован. Но я думаю, что это довольно просто с этого момента. Помните, что все это происходит перед вызовом представления.

Если, теперь вы использовали reverse Метод должен выглядеть так:

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

где ... любой потенциальный позиционный args и / или kwargs,

Но автор этого поста не определяет где-то этот URL. И при этом он не объясняет структуру этого. Я думаю, что это безопасно пройти и продолжить с остальными.

Другие вопросы по тегам