2

基本的に、次のようなディレクトリがあります。

/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' object has no attribute '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 クラスを追加する方法と場所を教えてください。今の私の選択肢は、その認証コードを必要とするすべてのリソース クラスに貼り付けることかもしれませんが、それを整理するためのより良い方法があるはずです。ヘルプ?

4

3 に答える 3

2

そのモジュール内のオブジェクトauthを本当にインポートしたいときに、モジュールをインポートしています。HTTPBasicAuthモジュールがオブジェクトと同じ名前を持っているために、問題が発生している可能性もありHTTPBasicAuthます。

auth.pyあなたの名前を などの別の名前authentication.pyに変更し、インポートを次のように変更することをお勧めします。

from ..authentication import auth
于 2015-08-09T11:17:20.303 に答える
0

申し訳ありませんが、これは少し古いですが、この質問を持つ他の人のために、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
于 2015-08-28T20:44:51.203 に答える
0

内部に変数auth.pyを定義するモジュールがあるため、これは少し混乱します。auth

この線:

from myapp import auth

モジュールで定義された変数ではなく、モジュールをインポートしています。次のように変更します。

from myapp.auth import auth

そして、それはうまくいくと思います。

于 2015-08-10T02:34:32.663 に答える