我一直在从瓶子转移到烧瓶。如果我需要的代码是20行或更少,那么我就是那种喜欢编写自己的代码而不是从Internet下载软件包的人。以对Basic
身份验证协议的支持为例。在瓶子里我可以写:
def allow_anonymous():
"""assign a _allow_anonymous flag to functions not requiring authentication"""
def wrapper(fn):
fn._allow_anonymous = True
return fn
return wrapper
def auth_middleware(fn):
"""perform authentication (pre-req)"""
def wrapper(*a, **ka):
# if the allow_anonymous annotation is set then bypass this auth
if hasattr(fn, '_allow_anonymous') and fn._allow_anonymous:
return fn(*a, **ka)
user, password = request.auth or (None, None)
if user is None or not check(user, password):
err = HTTPError(401, text)
err.add_header('WWW-Authenticate', 'Basic realm="%s"' % realm)
return err
return fn(*a, **ka)
return wrapper
...
app = Bottle()
app.install(middleware.auth_middleware)
上面的代码为我提供了对所有方法基本身份验证协议的全面支持,除非使用@allow_anonymous
包装程序明确装饰。我只是烧瓶的初学者。我很难在不增加对更多python软件包的依赖或过多的模板的情况下完成烧瓶中上面与瓶子兼容的代码。如何在烧瓶中直接清楚地处理此问题?
如果您愿意,您绝对可以自己使用flask-httpauth的某些功能:-P
我认为您将需要玩一些before_request
游戏(不是很漂亮),或者add_url_rule
为每个api端点调用带有装饰性方法的flask (或者route
由您自己的装饰器来执行此操作)。的add_url_rule
获取通常是您的API端点处理程序的视图功能,但在你的情况下,会以某种方式被包装方法非常像你在后给了一个(auth_middleware
)。
要点:
from flask import Flask, make_response, request
app = Flask(__name__)
def view_wrapper(fn):
"""
Create a wrapped view function that checks user authorization
"""
def protected_view(*a, **ka):
# if the allow_anonymous annotation is set then bypass this auth
if hasattr(fn, '_allow_anonymous') and fn._allow_anonymous:
return fn(*a, **ka)
# consult werkzeug's authorization mixin
user, password = (request.authorization.username, request.authorization.password) if request.authorization else (None, None)
if user is None or not check(user, password):
err_response = make_response(text, 401)
err_response.headers['WWW-Authenticate'] = 'Basic realm="%s"' % realm
return err_response
return fn(*a, **ka)
return protected_view
# An endpoint
def hello():
return 'hello there'
app.add_url_rule('/', 'hello', view_wrapper(hello))
当然,可以(并且应该)使用Blueprints等进一步增强此功能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句