Django基于类的视图中self.request和request之间的区别

Sto*_*404 11 python django

在django中,对于基于类的视图,ListView和类似的DetailView方法get()或者post()由开发人员定义的其他函数采用参数include selfrequest.我了解到,在self这些实际上是一个self.request领域,所以self.request和它之间的区别是request什么?

例如,这是基于类的视图中的函数,用于处理用户的登录要求:

def login(self, request):
    name = request.POST['name']
    pwd = request.POST['password']
    user = authenticate(username=name, password=pwd)

    if user is not None:
        request.session.set_expiry(0)
        login(request, user)
        log_message = 'Login successfully.'
    else:
        log_message = 'Fail to login.'

    return HttpResponseRedirect(reverse('blog:testindex'))
Run Code Online (Sandbox Code Playgroud)

这是用于处理用户注册的函数:

def register(self, request):
    user_name = self.request.POST['username']
    firstname = self.request.POST['firstname']
    lastname = self.request.POST['lastname']
    pwd = self.request.POST['password']
    e_mail = self.request.POST['email']
    user = User.objects.create(username=user_name, first_name=firstname, last_name=lastname, email=e_mail)
    user.set_password(pwd)
    try:
        user.save()
        user = authenticate(username=user_name, password=pwd)
        login(self.request, user)
    except Exception:
        pass
    else:
        return HttpResponseRedirect(reverse('blog:testindex'))
Run Code Online (Sandbox Code Playgroud)

在第一个函数中,它使用存储在request第二个函数中的数据,它使用的数据self.request都在功能上起作用.有什么不同?

谢谢你的回答.

Ale*_*ina 7

对于子类View,它们是同一个对象.self.request = request在返回的view函数中设置as_view().我查看了历史记录,但只找到了设置self.request,然后立即将请求传递给了view函数.

  • 这是正确的,`self.args`和`self.kwargs`也一样。知道为什么Django设计时将这些变量既作为属性又作为函数参数传递,并且对于一个与另一个是否有约定或用例,这将是很有趣的。 (3认同)