Skip to content

Instantly share code, notes, and snippets.

@Allianzcortex
Created November 7, 2019 00:48
Show Gist options
  • Save Allianzcortex/374f3713ac3e0b898e978b0850865bb1 to your computer and use it in GitHub Desktop.
Save Allianzcortex/374f3713ac3e0b898e978b0850865bb1 to your computer and use it in GitHub Desktop.
使用 __call__ 来控制基本权限
# 有一个装饰器 @require_user,这是对用户进行的权限管理。试想一下,一名用户可能会有多个角色
# 如果对这些角色每个都定义一个装饰器,就会造成太多的冗余和重复。在这种情况下我们来看看作者是怎么做的:
# 定义了一个基本类
def __init__(self, role):
self.role = role
def __call__(self, method):
@functools.wraps(method)
def wrapper(*args, **kwargs):
if not g.user:
url = url_for('account.signin')
if '?' not in url:
url += '?next=' + request.url
return redirect(url)
if self.role is None:
return method(*args, **kwargs)
if g.user.id == 1:
# this is superuser, have no limitation
return method(*args, **kwargs)
if g.user.role == 'new':
flash(_('Please verify your email'), 'warn')
return redirect(url_for('account.setting'))
if g.user.role == 'spam':
flash(_('You are a spammer'), 'error')
return redirect('/')
if self.roles[g.user.role] < self.roles[self.role]:
return abort(403)
return method(*args, **kwargs)
return wrapper
# 之后定义不同的权限限制
require_login = require_role(None)
require_user = require_role('user')
require_staff = require_role('staff')
require_admin = require_role('admin')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment