我正在为自己的博客做一个博客,一切正常,甚至是会议。
现在,我正在尝试使用名为@require_login
的装饰器来限制管理员。我认为我做的事情确实是错的,除了无效的事实。
这是我的装饰者:
def requirir_login(func):
request = make_response()
if session['logged_in'] == True:
return func
else:
print("no hay sesion registrada webon")
这里用它来装饰管理功能:
@app.route("/admin")
@requirir_login
def admin():
users = User.objects
return render_template("admin.html", users=users)
我的逻辑背后是检查是否有会话然后返回管理功能。如果不是,我想在终端中检查该消息以进行测试。
如果还没有会话,我还没决定该怎么做。我可能会重定向到登录页面或其他东西。
答案 0 :(得分:2)
你的装饰者需要提供一个包装器函数,它将被调用来代替装饰函数。只有在调用该包装器时才会发送实际请求,并且可以测试会话:
from functools import wraps
def requirir_login(func):
@wraps(func)
def wrapper(*args, **kwargs):
if session['logged_in']:
return func(*args, **kwargs)
else:
print("no hay sesion registrada webon")
return wrapper
当应用装饰器时,会调用它的返回值来替换装饰的函数。这里返回wrapper
,现在成为您的查看功能。
包装器传递所有未经修改的参数,使得装饰器适用于任何视图函数,无论它们期望从路径传递的参数如何。
我还做了一些其他更改来改进装饰器的功能:
== True
进行测试;这是if
@functools.wraps()
decorator为您的包装器提供与原始包装视图函数相同的名称和文档字符串,在调试时总是有用。如果你有一个登录表单,你确实可以使用重定向:
return redirect(url_for('login'))
如果您的登录视图名为login
。