Flask:如何为所有方法注册包装器

纳乔纳乔曼

我一直在从瓶子转移到烧瓶。如果我需要的代码是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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何为一个对象的所有方法添加别名?

来自分类Dev

如何为所有方法一次创建一个对象?

来自分类Dev

如何为Nunit项目下的所有方法/类创建文档

来自分类Javascript

如何显示对象的所有方法?

来自分类Dev

当所有项目都在包装器中时,如何为TreeView编写DataTemplates?

来自分类Dev

如何为所有按钮注册单个事件侦听器

来自分类Dev

TypeScript:如何创建一个包装类,该包装类具有基类的所有方法而无需手动声明?

来自分类Dev

类中所有方法的抽象方法装饰器

来自分类Python

如何使用给定的装饰器获取python类的所有方法

来自分类Dev

Java编译器如何检查接口中的所有方法是否都已实现?

来自分类Dev

RXSwift如何为具有返回值的委托方法创建包装器

来自分类Dev

用try catch包装现有javascript对象的所有方法

来自分类Dev

侦听(注册)接口的特定方法而不实现所有方法,Java

来自分类Dev

我的所有方法都需要通用包装,而无需复制代码(C#)

来自分类Dev

获取所有方法

来自分类Dev

如何为C ++方法编写目标C包装器?

来自分类Dev

如何导出程序集中所有方法的名称?

来自分类Dev

如何在Ruby中列出对象的所有方法?

来自分类Dev

如何折叠Xcode中的所有方法?

来自分类Dev

如何使PHPStorm折叠文件上的所有方法/功能?

来自分类Dev

如何在MEF中获取所有方法

来自分类Dev

如何显示特定类或** kwargs之类的所有方法?

来自分类Dev

如何获得Scala特征中所有方法的名称

来自分类Dev

如何使用dnlib库获取所有方法的说明?

来自分类Dev

如何避免激活类中的所有方法?

来自分类Dev

如何记录iOS应用中使用的所有方法

来自分类Dev

如何显示来自树枝的对象的所有方法?

来自分类Dev

如何从ASTParser打印所有方法声明和调用

来自分类Dev

如何检索 System.Math 的所有方法

Related 相关文章

  1. 1

    如何为一个对象的所有方法添加别名?

  2. 2

    如何为所有方法一次创建一个对象?

  3. 3

    如何为Nunit项目下的所有方法/类创建文档

  4. 4

    如何显示对象的所有方法?

  5. 5

    当所有项目都在包装器中时,如何为TreeView编写DataTemplates?

  6. 6

    如何为所有按钮注册单个事件侦听器

  7. 7

    TypeScript:如何创建一个包装类,该包装类具有基类的所有方法而无需手动声明?

  8. 8

    类中所有方法的抽象方法装饰器

  9. 9

    如何使用给定的装饰器获取python类的所有方法

  10. 10

    Java编译器如何检查接口中的所有方法是否都已实现?

  11. 11

    RXSwift如何为具有返回值的委托方法创建包装器

  12. 12

    用try catch包装现有javascript对象的所有方法

  13. 13

    侦听(注册)接口的特定方法而不实现所有方法,Java

  14. 14

    我的所有方法都需要通用包装,而无需复制代码(C#)

  15. 15

    获取所有方法

  16. 16

    如何为C ++方法编写目标C包装器?

  17. 17

    如何导出程序集中所有方法的名称?

  18. 18

    如何在Ruby中列出对象的所有方法?

  19. 19

    如何折叠Xcode中的所有方法?

  20. 20

    如何使PHPStorm折叠文件上的所有方法/功能?

  21. 21

    如何在MEF中获取所有方法

  22. 22

    如何显示特定类或** kwargs之类的所有方法?

  23. 23

    如何获得Scala特征中所有方法的名称

  24. 24

    如何使用dnlib库获取所有方法的说明?

  25. 25

    如何避免激活类中的所有方法?

  26. 26

    如何记录iOS应用中使用的所有方法

  27. 27

    如何显示来自树枝的对象的所有方法?

  28. 28

    如何从ASTParser打印所有方法声明和调用

  29. 29

    如何检索 System.Math 的所有方法

热门标签

归档