2013-12-12 208 views
1

蓝图内使用认证装饰从我想用下面的基本身份验证装饰在我的蓝图:如何烧瓶

def requires_auth(func): 
    @wraps(func) 
    def decorated(*args, **kwargs): 
     request_auth = request.authorization 
     if not request_auth or not auth.authenticate(request_auth.username, request_auth.password): 
      return api.response_auth_failed() 
     return func(*args, **kwargs) 
    return decorated 

而在蓝图:

@bp.route("/") 
@requires_auth 
def root(): 
    return "root" 

但依靠flask_peewee.auth模块,该模块还需要db实例,这需要应用实例作为Database()模块使用该应用进行配置:

db = Database(app) 
auth = Auth(app, db) 

我之前的工作是通过在一个app.py文件中实例化所有这些应用程序来简化应用程序,但现在我想组织它更好一点。

是否可以将我的db.Model定义,上述requires_auth装饰到另一个文件,说db_models.py模块,并导入requires_auth装饰成我个人的蓝图的定义?如果我需要访问app对象来创建db对象,我该怎么做?


编辑:我重新整理我的应用程序看起来像这样:http://charlesleifer.com/blog/structuring-flask-apps-a-how-to-for-those-coming-from-django/我把requires_auth功能在我auth.py模块一个我可以导入并在view.py使用它,但是当我试图将其导入到一个我的蓝图失败了。我认为这是因为auth模块导入应用程序模块,并且蓝图正在扩展应用程序模块,因此我得到了循环导入。有任何想法吗?

回答

1

正如你所指出的,我认为问题在于你的模块组织。如果您创建一个包含requires_auth的装饰模块,该怎么办?

然后,你将组织你的进口流向,如:

  1. app.py(实例应用& DB)
  2. auth.py(AUTH实例,从app.py进口)
  3. API。 py(实例化api,从app.py导入)
  4. decorators.py(define requires_auth,auth and api from import)
  5. blueprints/views.py(从app.py,auth.py,api.py, decorators.py)
  6. main.py(导入app,auth,api,装饰器,蓝图)并且是应用程序的入口点。
+0

这是我注册蓝图的app.py模块而不是main.py.我现在正在main.py模块中注册蓝图,并避免任何循环导入。这也允许我在auth模块中定义'require_auth'函数,这是有道理的。非常感谢。 –