django - 在 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 ,如果没有提供给它可能是 Noneauthenticate()
(将它传递给后端)。
这个request
论点实际上做了什么,我什么时候应该考虑在authenticate
方法中传递它?
解决方案
根据 Django 文档,并由我刚才在查看源代码时确认,这将传递给authenticate
您正在使用的任何身份验证后端的方法。
唯一似乎使用它的后端类是RemoteUserBackend
,原因是 RemoteUserBackend 将在用户(已存在于远程身份验证数据库中)第一次登录时创建本地用户模型实例,然后在返回之前用户实例,后端调用自己的configure_user
方法,传递新的用户实例,以及request
.
但是,这就是它变得愚蠢的地方......是,默认实现configure_user
实际上并没有做任何事情,它只是一个存根,您可以在子类中扩展它,RemoteUserBackend
如果您想添加自己的行为,您可以选择编写它它。
清如泥。但实际上它是有道理的。也许在请求中传递了一些参数触发了身份验证的需要,其中一些参数包含有关用户的信息,这些信息需要存储在新创建的 User 实例中......请求对象包含有关请求的所有信息,它来自派上用场。
可以说,某个时候,有人写了一个身份验证后端,此时需要访问请求,或者身份验证模块的作者预计有一天有人可能会需要它。但是在 auth 模块本身中,默认情况下,request
不用于我能看到的任何内容。
所以似乎没有必要传递request
给authenticate
,但是如果您可以想象将来您可能想要使用时髦的身份验证后端配置您的应用程序,您可能想要传递它..以防万一该后端需要它。默认ModelBackend
不使用它。
推荐阅读
- android - 当 DRM 会话管理器设置为媒体源时,Exoplayer 显示空白屏幕
- mongodb - Mongdb 无法通过传递变量 id 获取文档
- forms - 相关的多选列表
- python - 为什么是 arr[:][np.newaxis].shape = (1, n) 而不是 (n, 1)?
- jquery - 如果使用电子邮件,则使用 ajax 请求禁用多步骤表单中的注册过程
- reactjs - 如何在 react/apollo 中调用条件 useQuery 钩子
- android - 如何在 react-native 中将图像文件分段上传到服务器?
- javascript - geocoder.setInput() 和 geocoder.query() 之间的区别?
- android - Gluon,Android 10 黑屏问题
- python - 如何删除前三个数字字符的记录?熊猫/蟒蛇