簡體   English   中英

我正在重組Flask-restful應用程序,但無法放置HTTP-auth以使應用程序運行

[英]I am restructuring my Flask-restful app, but having trouble placing the HTTP-auth in order to get app running

本質上,我有這樣的目錄:

/app
  runserver.py
  /myapp
    __init__.py
    api.py
    auth.py
    /resources
      __init.py
      users.py
      login.py
    /models
      __init.py
      models.py
    /common
    /assets

在我的auth.py中,我有一個標准的HTTP基本用戶名/密碼驗證。 我將這些用於必須登錄的區域,並且我想驗證每個用戶。 Login.py是我需要添加裝飾器的位置,但是由於此錯誤,整個應用程序無法運行:AttributeError:'module'對象沒有屬性'login_required'

from flask.ext.httpauth import HTTPBasicAuth
auth = HTTPBasicAuth()

@auth.verify_password
def verify_password(username, password):
    user = User.query.filter_by(username = username).first()
    if not user or not user.verify_password(password):
        return False
    g.user = user
    return True

@auth.error_handler
def unauthorized():
    return make_response(jsonify({'message': 'Unauthorized'}), 403)

我的login.py代碼,它調用裝飾器,然后要求身份驗證。

from flask_restful import Resource, reqparse
from myapp.models.users import User
from myapp import auth 

class login(Resource):
    decorators = [auth.login_required]

    def __init__(self):
        self.reqparse = reqparse.RequestParser()
        self.reqparse.add_argument('userid', type = str , default="")
        self.reqparse.add_argument('username', type = str,  default="")
        self.reqparse.add_argument('password', type = str,  default="")
        super(login, self).__init__()


    def post(self):
        args = self.reqparse.parse_args()
        username = args['username']
        password = args['password']
        message = {'status': 'Authorized'}
    return message

總結一下,我的問題是:如何以及在哪里添加flask-httpauth類,以便可以使用裝飾器。 我現在的選擇可能是將身份驗證代碼粘貼到需要它的每個資源類中,但是似乎必須有一種更好的方法來組織它。 救命?

當您確實要在該模塊中導入HTTPBasicAuth對象時,就是在導入auth模塊。 由於模塊的名稱與HTTPBasicAuth對象的名稱相同,您還可能遇到問題。

我建議將您的auth.py重命名為其他名稱,例如authentication.py ,然后將導入更改為:

from ..authentication import auth

這有點令人困惑,因為您具有在內部定義auth變量的auth.py模塊。

該行:

from myapp import auth

正在導入模塊,而不是其中定義的變量。 更改為:

from myapp.auth import auth

我認為這會起作用。

抱歉,這有點老了,但是出於其他問題的考慮,我建議不要使用flask.ext.httpauth。 我發現它不是很有用。 這是我使用flask-restful進行HTTP基本身份驗證的方法。

這是在myapp / init .py中:

from flask import Flask, request
from flask.ext.restful import abort

def requires_auth(f):
    @wraps(f)
    def decorated(*args, **kwargs):
        auth = request.authorization
        if not auth:
            abort(401)
        user = User.query.filter(User.username == auth.username).first()
        auth_ok = False
        if user != None:
            auth_ok = verify_password(auth.password) == user.password
        if not auth_ok:
            return abort(401)
        return f(*args, **kwargs)
    return decorated

資源腳本具有需要授權才能訪問該資源的資源。

from myapp import requires_auth

@requires_auth
def get(self):
    # do something

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM