使用自制装饰器在烧瓶中的应用程序上下文之外工作
working outside of aplication context in flask with a self made decorator
我正在从头开始为自己写博客,一切正常,甚至 sessions。
现在我试图用一个名为 @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)
我的逻辑是检查是否有 session 然后 return 管理功能。如果不是,我想在终端中检查该消息以进行测试。
如果还没有 session,我还没有决定怎么办。我可能会重定向到 log-in 页面或其他内容。
您的装饰器需要提供一个 wrapper 函数,它将代替装饰函数被调用。只有在调用包装器时才会路由实际请求,您才能测试会话:
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
当装饰器被应用时,它被称为它的 return 值 替换装饰函数。这里 wrapper
是 return 编辑的,因此它现在成为您的视图函数。
包装器原封不动地传递所有参数,使您的装饰器适用于任何视图函数,而不管它们期望从路由传入的参数如何。
我还做了一些其他更改来改进装饰器的功能:
- 您不需要测试
== True
;这就是 if
是 for,以测试表达式的结果是否为真。
- 我使用
@functools.wraps()
decorator 为您的包装器提供了与原始包装视图函数相同的名称和文档字符串,这在调试时总是很有帮助。
如果你有一个,你确实可以使用重定向到登录表单:
return redirect(url_for('login'))
如果您的登录视图名为 login
。
我正在从头开始为自己写博客,一切正常,甚至 sessions。
现在我试图用一个名为 @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)
我的逻辑是检查是否有 session 然后 return 管理功能。如果不是,我想在终端中检查该消息以进行测试。
如果还没有 session,我还没有决定怎么办。我可能会重定向到 log-in 页面或其他内容。
您的装饰器需要提供一个 wrapper 函数,它将代替装饰函数被调用。只有在调用包装器时才会路由实际请求,您才能测试会话:
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
当装饰器被应用时,它被称为它的 return 值 替换装饰函数。这里 wrapper
是 return 编辑的,因此它现在成为您的视图函数。
包装器原封不动地传递所有参数,使您的装饰器适用于任何视图函数,而不管它们期望从路由传入的参数如何。
我还做了一些其他更改来改进装饰器的功能:
- 您不需要测试
== True
;这就是if
是 for,以测试表达式的结果是否为真。 - 我使用
@functools.wraps()
decorator 为您的包装器提供了与原始包装视图函数相同的名称和文档字符串,这在调试时总是很有帮助。
如果你有一个,你确实可以使用重定向到登录表单:
return redirect(url_for('login'))
如果您的登录视图名为 login
。