Использовать обратную функцию 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. И при этом он не объясняет структуру этого. Я думаю, что это безопасно пройти и продолжить с остальными.