我在flask登录时使用了一个flask片段来检查用户是否已登录:
from functools import wraps
def logged_in(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if session.get('logged_in') is not None:
return f(*args, **kwargs)
else:
flash('Please log in first.', 'error')
return redirect(url_for('login'))
return decorated_function
我把风景装点得像这样:
@app.route('/secrets', methods=['GET', 'POST'])
@logged_in
def secrets():
error = None
我也想做点类似的事情来获得授权。现在,我有很多视图要检查用户是否拥有资源,比如说hotdogs
资源。
如果登录的用户是特定热狗的所有者,他可以编辑和管理他的热狗。如果他不是,我就把他踢到未经授权的屏幕上。
@app.route('/<hotdog>/addmustard/',methods=["GET"])
@logged_in
def addmustard(hotdog):
if not (authorizeowner(hotdog)):
return redirect(url_for('unauthorized'))
do_stuff()
authorizeowner()
接受热狗作为输入,并检查记录的热狗所有者是否与会话变量中列出的所有者名称匹配。
我试着制作一个owns_热狗包装器/装饰器函数,类似于我登录的函数,但它抱怨它不接受参数。我怎样才能实现类似的目标?有点像。。。
def owns_hotdog(f):
@wraps(f)
def decorated_function(*args, **kwargs):
if not authorizeowner(hotdog):
return f(*args, **kwargs)
else:
flash('Please log in first.', 'error')
return redirect(url_for('login'))
return decorated_function
从错误消息中,decorator似乎没有从路由中的变量接收Flask视图可以访问的热狗参数。我的希望是。。。
@app.route('/<hotdog>/addmustard/',methods=["GET"])
@logged_in
@owns_hotdog(hotdog)
def addmustard(hotdog):
do_stuff()
一切都与我当前的authorizeowner(热狗)功能一起工作,但是在我的路线上放一个包装器,而不是路线内的第一行,看起来更干净。
其他注意事项:
以下是操作方法:
当decorator接受参数时,它不是真正的decorator,而是返回realdecorator的factory函数。
但如果我是您,我将使用Flask登录进行身份验证,并使用自定义装饰器和您的函数来扩展它来处理授权。
我看了看烧瓶校长,但发现这对我的口味来说太复杂了。尚未检查烧瓶安全性,但我相信它使用烧瓶主体进行授权。总的来说,我认为Flask登录时使用一些自定义代码已经足够了。
相关问题 更多 >
编程相关推荐