@login_required
def my_view(request):
…
@login_required(login_url="/login/")
def other_view(request):
…
- Peter of the Norse
On 30/04/2018 3:35 PM, Stephen J. Butler wrote:@login_required doesn't take a test function. You need to use @user_passes_test directly.
Thank you Stephen.
I thought I'd start another thread to ask about my use case of being able to require login or not depending on whether the content needed a login or not ... but ... just as I was thinking about it I had another look at login_required and thought I'd ask one more question.
Its signature is ...
def login_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url=None):
Are you saying that function is the the view function?
MOn Mon, Apr 30, 2018 at 12:26 AM, Mike Dewhirst <miked@dewhirst.com.au <mailto:miked@dewhirst.com.au>> wrote:I'm pretty sure this is a not-understanding-python problem ratherthan a Django problem but here goes ...In a (FBV) view I'm trying to pass a function in to thelogin_required decorator. My function is called 'is_login_needed'and I want the login_required decorator to effectively switchitself off if login is not needed.The scenario is on-line training and if the training instructionhas questions with scores then obviously the user needs to login.On the other hand if it is simply a demonstration video or plainblah with no questions/answers/scores it should be viewable byanyone whether they are logged in or not.My function goes like this and the docstring reveals myunderstanding ...def is_login_needed(user):""" the login_required decorator has a user_passes_test()function asits first arg. If it returns True, no login is required.user.login_hereis always set equal to the selected course.login_needed. Forcoursesneeding a login, self.is_authenticated must be True. Forcourses notneeding a login, self.is_authenticated may return anything butthisfunction passed to the login_required decorator must return True"""if not user.login_here:return TrueSo the problem is that manage.py runserver reports an attributeerror saying the function (presumably mine) does not have anattribute 'user' ... like this ...<earlier runserver traceback lines snipped> File"C:\Users\mike\envs\xxct3\train\course\urls.py", line 8, in <module>from .views import (finished_course_view, course_view, index_view,File "C:\Users\mike\envs\xxct3\train\course\views.py", line 172,in <module>def course_view(request, pk=None, slug=None):File"C:\Users\mike\envs\xxct3\lib\site-packages\django\contrib\auth\decorators.py",line 22, in _wrapped_viewif test_func(request.user):AttributeError: 'function' object has no attribute 'user'If that 'function' is my 'is_login_needed' function I'm inclinedto think it obviously has a 'user' attribute.Here is the contrib.auth.decorators.login_required source(preceded by user_passes_test which it calls) from Django 1.11My reading of the following is that my own 'is_login_needed'function passed in via @login_required(is_login_needed,login_url='login') as the first positional argument is then passedto the 'user_passes_test' decorator as 'test_func' ...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 giventest,redirecting to the log-in page if necessary. The test shouldbe a callablethat 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):if test_func(request.user):return view_func(request, *args, **kwargs)path = request.build_absolute_uri()resolved_login_url = resolve_url(login_url orsettings.LOGIN_URL)# If the login url is the same scheme and net locationthen just# use the path as the "next" url.login_scheme, login_netloc =urlparse(resolved_login_url)[:2]current_scheme, current_netloc = 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_loginreturn redirect_to_login(path, resolved_login_url, redirect_field_name)return _wrapped_viewreturn decoratordef login_required(function=None,redirect_field_name=REDIRECT_FIELD_NAME, login_url=None):"""Decorator for views that checks that the user is logged in,redirectingto the log-in page if necessary."""actual_decorator = user_passes_test(lambda u: u.is_authenticated,login_url=login_url,redirect_field_name=redirect_field_name)if function:return actual_decorator(function)return actual_decoratorCould someone please explain where I'm stuffing up. I reckon I'mconfused about which function the AttributeError is complaining.Many thanks for any helpMike-- You received this message because you are subscribed to the GoogleGroups "Django users" group.To unsubscribe from this group and stop receiving emails from it,send an email to django-users+unsubscribe@googlegroups.com<mailto:django-users+unsubscribe@googlegroups.com>.To post to this group, send email to django-users@googlegroups.com<mailto:django-users@googlegroups.com>.Visit this group at https://groups.google.com/group/django-users<https://groups.google.com/group/django-users>.To view this discussion on the web visithttps://groups.google.com/d/msgid/django-users/726f0262-6ca1-1cbf-a983-45b2c797b7d8%40dewhirst.com.au<https://groups.google.com/d/msgid/django-users/726f0262-6ca1-1cbf-a983-45b2c797b7d8%40dewhirst.com.au?utm_medium=email&utm_source=footer>.For more options, visit https://groups.google.com/d/optout<https://groups.google.com/d/optout>.--You received this message because you are subscribed to the Google Groups "Django users" group.To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscribe@googlegroups.com <mailto:django-users+unsubscribe@googlegroups.com>.To post to this group, send email to django-users@googlegroups.com <mailto:django-users@googlegroups.com>.Visit this group at https://groups.google.com/group/django-users.To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CAD4ANxUzQwUkXEXj6-RQ8sP1YRXUii%3D7b74cL13tm4SSpBqqKw%40mail.gmail.com <https://groups.google.com/d/msgid/django-users/CAD4ANxUzQwUkXEXj6-RQ8sP1YRXUii%3D7b74cL13tm4SSpBqqKw%40mail.gmail.com?utm_medium=email&utm_source=footer>.For more options, visit https://groups.google.com/d/optout.
--
You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscribe@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/9cf6faaa-ca80-44f5-8821-c1f324fb411c%40dewhirst.com.au.
For more options, visit https://groups.google.com/d/optout.
No comments:
Post a Comment