我在邀请功能上磕磕绊绊地了解它是如何工作的。我在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
答案 0 :(得分:0)
行。但首先请注意,此示例使用旧的Middleware
声明和语法。如果您感觉舒服,请切换到新的Middleware
语法。另外它是5年前写的(!),从那时起Django发生了很多变化!
回顾docs:
你可以像洋葱一样想到它(中间件):每个中间件类都是一个“层” 包裹视图,这是洋葱的核心。如果请求 穿过洋葱的所有层,一直到 在核心视图中,响应将通过每一层 (在相反的顺序)回来的路上。
所以,作者在这里做的是:
根据InvitedMiddleware
内InvitedMiddleware
设置的外观顺序,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的某个地方。他也没有解释它的结构。我认为通过它并继续其余的是安全的。