2015-07-13 310 views
0

我正尝试使用login_required装饰器外部的django视图。 我在我的工具上使用这个函数。django login_required装饰器外部视图

@login_required 
def somefunc(): 
    #logic 

,然后我打电话此somefunc()在我看来

class MyView(View): 
    def get(self, request, *args, **kwargs): 
     my_func = Somefunc() 

当我做到这一点说object has no attribute 'user' 请告诉我这里的问题?

回答

0

您应该在View上添加login_required修饰符。这可以通过重写dispatch方法来实现。

class MyView(View): 
    @method_decorator(login_required) 
    def dispatch(self, *args, **kwargs): 
     return super(MyView, self).dispatch(*args, **kwargs) 

你可以创建自己实现这一混入或只使用django-bracesLoginRequiredMixin

如果您想在功能中进行此项检查,则最好在somefunc中提出PermissionDenied例外。

无论哪种方式,你将需要request/usersomefunc

+0

谢谢,我更新了答案 – jgadelange

1

login_required正在寻找一个请求对象作为第一个参数来装饰视图功能。请求对象具有user属性,然后检查该属性是否实际登录。您无法用此装饰器包装任意函数,并期望它与实际视图函数完全相同。

+0

如果我发送请求给我的SomeFunc(请求) – aryan

+0

这可能会起作用。我认为如果用户没有登录,'login_required'将返回一个HttpResponse,所以你应该以某种方式处理。查看源代码的工作原理:https://docs.djangoproject.com/en/1.8/_modules/django/contrib/auth/decorators/#login_required –

+0

但是,这是一个相当迂回和模糊的处理方式,并可能导致意外的错误。我建议你自己写一个明确的检查,而不是使用'login_required'。您也可以按照@jgadelange的建议检查django-braces。 –

相关问题