Ah... no such luck.
def here(self):
return current.request.env.request_uri
On Monday, January 20, 2014 10:05:32 AM UTC-8, Anthony wrote:
>
> I haven't looked into this in detail, but note that self.here() does in
> fact use the URL() function to generate the "next" variable.
>
> Anthony
>
> On Monday, January 20, 2014 12:25:59 PM UTC-5, Joe Barnhart wrote:
>>
>> I think I have found the underlying problem in tools.py, but I'm not sure
>> it is even fixable.
>>
>> The issue is that routes.py only works if you use the URL() function, but
>> the decorator @auth.requires_login doesn't use the URL function when it
>> presets the "next" field. So everything works consistently except the
>> "next" after logon, which always fails because (in my case) it contains the
>> application name. Here is the relevant part of the decorator:
>>
>> def requires(self, condition, requires_login=True, otherwise=None):
>> """
>> decorator that prevents access to action if not logged in
>> """
>>
>> def decorator(action):
>>
>> def f(*a, **b):
>>
>> basic_allowed, basic_accepted, user = self.basic()
>> user = user or self.user
>> if requires_login:
>> if not user:
>> . . .
>> else:
>> next = self.here()
>> current.session.flash = current.response.flash
>> return call_or_redirect(
>> self.settings.on_failed_authentication,
>> self.settings.login_url +
>> '?_next=' + urllib.quote(next))
>>
>> if callable(condition):
>> flag = condition()
>> else:
>> flag = condition
>> if not flag:
>> current.session.flash = self.messages.access_denied
>> return call_or_redirect(
>> self.settings.on_failed_authorization)
>> return action(*a, **b)
>> f.__doc__ = action.__doc__
>> f.__name__ = action.__name__
>> f.__dict__.update(action.__dict__)
>> return f
>>
>> return decorator
>>
>>
>> I'm not sure this is even "fixable" since it would require
>> reverse-engineering a string back into the format desired for URL(). In
>> the short term, I fixed it by overriding the "next=" variable on the
>> creation of the login dialog box. This is from my default controller, and
>> it works as expected:
>>
>> def user():
>> cmd=request.url.split('/')[-1]
>> if cmd=='register':
>> . . .
>>
>> elif cmd=='login':
>> return dict(form=auth.login(next=URL('register','index')))
>> return dict(form=auth())
>>
>>
>>
>>
>
--
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
---
You received this message because you are subscribed to the Google Groups
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.