我试图在Django中分解下面的代码,以弄清楚它在做什么,并在必要时编辑它,但我不太清楚其中一些函数在做什么,或者它们来自哪里。
test_func和view_func是Django特有的还是内置的python函数?
**结论:**我不确定我是如何/为什么忽略了这些只是被定义为函数的参数的事实。我需要开始更好地关注细节。
下面是我试图分解/弄清楚的Django函数:
def user_passes_test(test_func, login_url=None, redirect_field_name=REDIRECT_FIELD_NAME):
"""
Decorator for views that checks that the user passes the given test,
redirecting to the log-in page if necessary. The test should be a callable
that takes the user object and returns True if the user passes.
"""
def decorator(view_func):
@wraps(view_func, assigned=available_attrs(view_func))
def _wrapped_view(request, *args, **kwargs):
print test_func
if test_func(request.user):
return view_func(request, *args, **kwargs)
path = request.build_absolute_uri()
# If the login url is the same scheme and net location then just
# use the path as the "next" url.
login_scheme, login_netloc = urlparse.urlparse(login_url or
settings.LOGIN_URL)[:2]
current_scheme, current_netloc = urlparse.urlparse(path)[:2]
if ((not login_scheme or login_scheme == current_scheme) and
(not login_netloc or login_netloc == current_netloc)):
path = request.get_full_path()
from django.contrib.auth.views import redirect_to_login
return redirect_to_login(path, login_url, redirect_field_name)
return _wrapped_view
return decorator
字符串
3条答案
按热度按时间pnwntuvh1#
view_func
是一个Django view。test_func
是一个“检查用户是否通过给定测试”的函数。所以,你写了一个函数,向用户请求一些东西,如果他们通过了,就返回
True
。然后你把这个函数传递给user_passes_test
,它创建了一个装饰器,你可以在用户看到你的视图之前先用它来测试用户,就像这样:字符串
装饰器在文档中的函数定义中提到。
wraps
是一个装饰器,它在装饰过程中保留了被 Package 的函数的签名(name,args等)。它位于functools中。yeotifhr2#
test_func
和view_func
是作为参数传入的函数--也就是说,名称只是任意的变量名称。user_passes_test
是一个decorator,它被应用于一个视图(它变成了变量view_func
)--它传递了一个函数作为参数(test_func
),它接受一个User
并返回True
或False
。c6ubokkw3#
继承自UserPassesTestMixin的Class-based views定义了一个
test_func
方法,该方法执行与现有答案[1、[2]](https://stackoverflow.com/a/6989925/5320906)中描述的装饰器参数相同的功能,即确定用户是否可以查看页面。字符串