从类视图中访问请求对象

4 投票
2 回答
4910 浏览
提问于 2025-04-18 12:34

我有下面这样的代码:

url(r'login$', views.LoginView.as_view(), name='login'),

然后显示的效果是这样的:

class LoginView(TemplateView):
    def __init__(self, *args, **kwargs):
        #How to operate on request Object's type and its params.

我在代码里已经把我的问题写成了注释。

2 个回答

3

如果你想要初始化变量,最好的地方就是在设置函数(setup function)里:

class SomeBaseView(View):
    var1 = None

    def setup(self, request, *args, **kwargs):
        super().setup(request, *args, **kwargs)
        # do the vars initialization here
        self.var1 = kwargs.get('param')  # e.g.

顺便说一下,设置函数是在调度(dispatch)之前被调用的,而且你不需要像调度那样返回任何东西。

当视图在请求/响应的过程中被调用时,setup() 方法会把 HttpRequest(HTTP请求)赋值给视图的请求属性,同时把从 URL 模式中捕获到的位置参数和关键字参数分别赋值给 args 和 kwargs 属性。然后就会调用 dispatch()。

https://docs.djangoproject.com/en/4.1/ref/class-based-views/base/#django.views.generic.base.View.as_view

另一方面,不推荐使用调度函数(dispatch function),因为你需要返回 super 调用,这样会让事情变得复杂。

6

正如@karthikr提到的,你不应该去重写__init__()这个方法。请求对象在dispatch()方法中首次可用,这个方法是在__init__()之后立即被调用的,但你也不需要重写这个方法。这个方法的主要作用是调用get()post()或者其他相关的方法处理器。不过,通常来说,你也不需要重写这些方法。

不过,如果你真的非常想在最早的时刻捕捉到请求,那么dispatch方法是最好的选择。

class LoginView(TemplateView):
    def dispatch(self, request, *args, **kwargs):
        print self.request  # Works!
        return super(LoginView, self).dispatch(request, *args, **kwargs)  # Don't forget this

撰写回答