包装/装饰urls.py与views.py中的函数 [英] Wrapping/decorating a function in urls.py vs in views.py

查看:41
本文介绍了包装/装饰urls.py与views.py中的函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

因此,我对views.py中的包装函数非常熟悉.因此,如果用户 已登录,则我编写了一个装饰器,以重定向到默认的REDIRECT_URL(类似于反向的 login_required );它基于我过去的观点:

So, I'm pretty familiar with wrapping functions in views.py. So I've written a decorator to redirect to the default REDIRECT_URL if the user is logged in (sort of a reverse login_required); it's based on how I've made views in the past:

def not_logged_in(redirect_url=None, redirect_field_name=REDIRECT_FIELD_NAME):
    def decorator(view_func, *args, **kwargs):
        def wrapper(request, *args, **kwargs):
            if not request.user.is_authenticated():
                return view_func(*args, **kwargs)
            else:
                redirect_url = (request.REQUEST.get(redirect_field_name, redirect_url) or
                                settings.REDIRECT_URL)
                return HttpResponseRedirect(redirect_url)
        return wrapper
    return decorator

但是,出现以下错误:'function'对象没有属性'status_code',这是由MiddleWare期望HttpResponse引起的.当我查看 response 的值时,我看到它是<函数包装在0x2b3a9922a500> 上.

However, I get the following error: 'function' object has no attribute 'status_code' which is caused by a MiddleWare expecting an HttpResponse. When I look at the value for response, I see that it's <function wrapper at 0x2b3a9922a500>.

这是我在 urls.py 中调用它的方式:

Here's how I'm calling it in urls.py:

url(r'login/', 
     not_logged_in(auth_views.login), 
     {'authentication_form': LoginForm },
),

推荐答案

这是我对同一件事的实现.

Here’s my implementation of the same thing.

def logout_required(view):
    def f(request, *args, **kwargs):
        if request.user.is_anonymous():
            return view(request, *args, **kwargs)
        return HttpResponseRedirect(settings.LOGIN_REDIRECT_URL)
    return f

urls.py 中:

urlpatterns = patterns("",
    url(r"^login/", logout_required(login), {"template_name": "users/login.html"}, "login"),
    # ...

我希望这会有所帮助(虽然不确定).

I hope this helps (unsure though).

这篇关于包装/装饰urls.py与views.py中的函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆