Created
April 29, 2012 18:05
-
-
Save pcdinh/2552300 to your computer and use it in GitHub Desktop.
Flask login_required decorator
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from flask import request, g | |
from functools import wraps | |
def login_required(f=None, url="public.login", next=None): | |
""" | |
Check if user is logged or redirect to a certain page. | |
By default go to public login. | |
""" | |
def outer_decorator(decorated_fn): | |
""" | |
Takes the decorated function <fn>. | |
""" | |
@wraps(decorated_fn) | |
def inner_fn(*ted_args, **ted_kw): | |
""" | |
Takes the decorated function params <ted_args> and <ted_kw>. | |
<next> workaround thanks to <mitsuhiko>: | |
> that does not work: | |
> if next is None: | |
> next = request.url | |
> instead you need to do | |
> the_next = next | |
. if the_next is None: | |
. the_next = request.url | |
> and then use the_next | |
> or some other variable | |
> next is from an outer scope | |
> overriding that does not work in python 2 and would not be threadsafe in python 3 | |
> yay! | |
> but why does "url" don't need that? | |
> you are not overriding url | |
> if you would do ``url += "foo"`` it would fail too | |
""" | |
_next = next | |
if _next is None: | |
_next = request.url | |
## Redirect conditions | |
if not isinstance(g.user, dict): | |
return redirect_to(url, next=_next) | |
return decorated_fn(*ted_args, **ted_kw) | |
return inner_fn | |
# <f> is None when this deco is called with params | |
# if f is not None: | |
if callable(f): | |
return outer_decorator(f) | |
return outer_decorator |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment