基本上,我有一个目录:
/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-basic用户名/密码验证。我会将这些用于必须登录的区域,并且我想验证每个用户。 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代码,它调用装饰器然后请求auth。
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类,以便我可以使用装饰器。我现在的选择可能是将该auth代码粘贴到需要它的每个资源类中,但似乎必须有更好的方法来组织它。帮助
答案 0 :(得分:0)
当您真正想要导入该模块中的auth
对象时,您正在导入HTTPBasicAuth
模块。由于您的模块与HTTPBasicAuth
对象具有相同的名称,因此您也可能遇到问题。
我建议您将auth.py
重命名为其他内容,例如authentication.py
,并将导入更改为:
from ..authentication import auth
答案 1 :(得分:0)
这有点令人困惑,因为你有一个auth.py
模块,里面定义了一个auth
变量。
该行:
from myapp import auth
正在导入模块,而不是其中定义的变量。将其更改为:
from myapp.auth import auth
我认为这样可行。
答案 2 :(得分: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