首页 > 解决方案 > 在 Django 中,方法中的请求参数有什么作用?

问题描述

我见过一些代码,有时身份验证方法具有请求参数,而其他时候则没有,例如,请参见以下代码:

代码 1:

def register(request):
     
    if request.method == 'POST':
        form = UserCreationForm(request.POST)

        if form.is_valid():
            form.save()
            # code for automatic login after singing up
            username = form.cleaned_data['username']
            password = form.cleaned_data['password1']
            user = authenticate(username=username, password=password)
            login(request, user)
            return redirect('/')

代码 2:

def login(request):
     
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(request, username=username, password=password)

根据官方文档

request是一个 HttpRequest ,如果没有提供给它可能是 None authenticate()(将它传递给后端)。

这个request论点实际上做了什么,我什么时候应该考虑在authenticate方法中传递它?

标签: djangodjango-viewsdjango-authentication

解决方案


根据 Django 文档,并由我刚才在查看源代码时确认,这将传递给authenticate您正在使用的任何身份验证后端的方法。

唯一似乎使用它的后端类是RemoteUserBackend,原因是 RemoteUserBackend 将在用户(已存在于远程身份验证数据库中)第一次登录时创建本地用户模型实例,然后在返回之前用户实例,后端调用自己的configure_user方法,传递新的用户实例,以及request.

此处的文档:https ://docs.djangoproject.com/en/3.1/ref/contrib/auth/#django.contrib.auth.backends.RemoteUserBackend

但是,这就是它变得愚蠢的地方......是,默认实现configure_user实际上并没有做任何事情,它只是一个存根,您可以在子类中扩展它,RemoteUserBackend如果您想添加自己的行为,您可以选择编写它它。

清如泥。但实际上它是有道理的。也许在请求中传递了一些参数触发了身份验证的需要,其中一些参数包含有关用户的信息,这些信息需要存储在新创建的 User 实例中......请求对象包含有关请求的所有信息,它来自派上用场。

可以说,某个时候,有人写了一个身份验证后端,此时需要访问请求,或者身份验证模块的作者预计有一天有人可能会需要它。但是在 auth 模块本身中,默认情况下,request不用于我能看到的任何内容。

所以似乎没有必要传递requestauthenticate,但是如果您可以想象将来您可能想要使用时髦的身份验证后端配置您的应用程序,您可能想要传递它..以防万一该后端需要它。默认ModelBackend不使用它。


推荐阅读