2013-12-12 206 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'函數,這是有道理的。非常感謝。 –