首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我正在重组我的Flask-restful应用程序,但在放置HTTP-auth以使应用程序运行时遇到了问题

我正在重组我的Flask-restful应用程序,但在放置HTTP-auth以使应用程序运行时遇到了问题
EN

Stack Overflow用户
提问于 2015-08-09 13:33:17
回答 3查看 935关注 0票数 2

实际上,我有一个这样的目录:

代码语言:javascript
复制
/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用户名/密码身份验证。我将在必须登录的区域使用它们,并且我想验证每个用户。模块是我需要添加装饰器的地方,但是由于这个错误,整个应用程序没有运行: AttributeError:‘Login.py’对象没有'login_required‘属性。

代码语言:javascript
复制
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代码,它调用装饰器,然后请求身份验证。

代码语言:javascript
复制
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类,以便可以使用装饰器。我现在的选择可能是将该身份验证代码粘贴到每个需要它的资源类中,但似乎必须有更好的方法来组织它。帮助?

EN

回答 3

Stack Overflow用户

发布于 2015-08-09 19:17:20

您正在导入您的auth模块,而您确实希望在该模块中导入HTTPBasicAuth对象。由于您的模块与HTTPBasicAuth对象具有相同的名称,也可能会遇到问题。

我建议将您的auth.py重命名为其他名称,如authentication.py,并将您的导入更改为:

代码语言:javascript
复制
from ..authentication import auth
票数 2
EN

Stack Overflow用户

发布于 2015-08-10 10:34:33

这有点令人困惑,因为您有一个在内部定义auth变量的auth.py模块。

这行代码:

代码语言:javascript
复制
from myapp import auth

正在导入模块,而不是其中定义的变量。将其更改为:

代码语言:javascript
复制
from myapp.auth import auth

我认为这将会奏效。

票数 0
EN

Stack Overflow用户

发布于 2015-08-29 04:44:51

抱歉,这有点老了,但是为了给其他有这个问题的人看,我建议不要使用flask.ext.httpauth。我发现它不是很有用。下面是我如何使用flask-restful进行HTTP基本身份验证。

这是在myapp/init.py:中

代码语言:javascript
复制
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

具有需要授权才能访问资源的资源的资源脚本。

代码语言:javascript
复制
from myapp import requires_auth

@requires_auth
def get(self):
    # do something
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31901234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档