Skip to content

Instantly share code, notes, and snippets.

@comfuture
Created August 13, 2011 18:38
Show Gist options
  • Save comfuture/1144139 to your computer and use it in GitHub Desktop.
Save comfuture/1144139 to your computer and use it in GitHub Desktop.
flask extension that responses flexible result with negotiates accept header and checks permission
import json
from functools import wraps
from flask import render_template, url_for, request, redirect, session
from flask import Response
def require_role(role='student'):
def decorate(f):
@wraps(f)
def check(*args, **kwargs):
if session.get('role') != role:
return redirect(url_for('user.signin', role=role, redir=request.url))
return f(*args, **kwargs)
return check
return decorate
class WebApp(object):
def __init__(self, app_or_blueprint):
self.parent = app_or_blueprint
def route(self, rule, template=None, role=None, use_ext=False, **options):
types = ['application/json', 'text/html']
def decorate(f):
@wraps(f)
def wrap(*args, **kwargs):
result = f(*args, **kwargs)
if isinstance(result, Response) or isinstance(result, unicode):
return result
content_type = request.accept_mimetypes.best_match(types)
if content_type == 'text/html':
if '__redirect__' in result:
return redirect(result['__redirect__'])
if template:
return render_template(template, **result)
return json.dumps(result)
if role:
wrap = require_role(role)(wrap)
return self.parent.route(rule, **options)(wrap)
return decorate
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment