Python 令牌名称';app&x27;没有定义。瓶子

Python 令牌名称';app&x27;没有定义。瓶子,python,flask,Python,Flask,我正在尝试用工厂设计模式实现一个flask应用程序。由于此错误,无法运行应用程序 127.0.0.1 - - [24/Jun/2018 18:07:14] "OPTIONS /api/v1/users/register HTTP/1.1" 200 - token name 'app' is not defined 127.0.0.1 - - [24/Jun/2018 18:07:15] "POST /api/v1/users/register HTTP/1.1" 500 - Traceback

我正在尝试用工厂设计模式实现一个flask应用程序。由于此错误,无法运行应用程序

127.0.0.1 - - [24/Jun/2018 18:07:14] "OPTIONS /api/v1/users/register HTTP/1.1" 200 -
token name 'app' is not defined
127.0.0.1 - - [24/Jun/2018 18:07:15] "POST /api/v1/users/register HTTP/1.1" 500 -
Traceback (most recent call last):
  File "/home/jacobo/.local/share/virtualenvs/alen-yVjuFfoa/lib/python3.5/site-packages/flask/app.py", line 2309, in __call__ 
    return self.wsgi_app(environ, start_response)
  File "/home/jacobo/.local/share/virtualenvs/alen-yVjuFfoa/lib/python3.5/site-packages/flask/app.py", line 2295, in wsgi_app 
    response = self.handle_exception(e)
  File "/home/jacobo/.local/share/virtualenvs/alen-yVjuFfoa/lib/python3.5/site-packages/flask_cors/extension.py", line 161, in wrapped_function 
    return cors_after_request(app.make_response(f(*args, **kwargs)))
  File "/home/jacobo/.local/share/virtualenvs/alen-yVjuFfoa/lib/python3.5/site-packages/flask/app.py", line 1741, in handle_exception 
    reraise(exc_type, exc_value, tb)
  File "/home/jacobo/.local/share/virtualenvs/alen-yVjuFfoa/lib/python3.5/site-packages/flask/_compat.py", line 35, in reraise 
    raise value
  File "/home/jacobo/.local/share/virtualenvs/alen-yVjuFfoa/lib/python3.5/site-packages/flask/app.py", line 2292, in wsgi_app 
    response = self.full_dispatch_request()
  File "/home/jacobo/.local/share/virtualenvs/alen-yVjuFfoa/lib/python3.5/site-packages/flask/app.py", line 1815, in full_dispatch_request 
    rv = self.handle_user_exception(e)
  File "/home/jacobo/.local/share/virtualenvs/alen-yVjuFfoa/lib/python3.5/site-packages/flask_cors/extension.py", line 161, in wrapped_function 
    return cors_after_request(app.make_response(f(*args, **kwargs)))
  File "/home/jacobo/.local/share/virtualenvs/alen-yVjuFfoa/lib/python3.5/site-packages/flask/app.py", line 1718, in handle_user_exception  reraise(exc_type, exc_value, tb)
  File "/home/jacobo/.local/share/virtualenvs/alen-yVjuFfoa/lib/python3.5/site-packages/flask/_compat.py", line 35, in 
    reraise raise value
  File "/home/jacobo/.local/share/virtualenvs/alen-yVjuFfoa/lib/python3.5/site-packages/flask/app.py", line 1813, in full_dispatch_request 
    rv = self.dispatch_request()
  File "/home/jacobo/.local/share/virtualenvs/alen-yVjuFfoa/lib/python3.5/site-packages/flask/app.py", line 1799, in dispatch_request 
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/mnt/c/Users/Jacobo/Projects/alen/server/users/api.py", line 25, in register 
   'token': token.decode()
AttributeError: 'NameError' object has no attribute 'decode'
我的项目结构如下:

/ myapp
  /users
    api.py
    models.py
  app.py
  database.py
  extensions.py
  settings.py
run.py
我认为问题在于应用程序未被识别为应用程序配置。但我不知道如何让它工作

app.py

from flask import Flask, render_template
from server import users
from server.extensions import bcrypt, db, migrate, cors
from server.settings import DevConfig


def create_app(config_object=DevConfig):
    app = Flask(__name__,
                static_folder="../frontend/public",
                template_folder="../frontend/public")
    app.config.from_object(config_object)
    register_extensions(app)
    register_blueprints(app)
    return app


def register_extensions(app):
    bcrypt.init_app(app)
    db.init_app(app)
    migrate.init_app(app, db)
    cors.init_app(app)
    return None


def register_blueprints(app):
    app.register_blueprint(users.api.blueprint)
    return None
import os


class Config(object):

    SECRET_KEY = 'p9Bv<3Eid9%$i01'
    APP_DIR = os.path.abspath(os.path.dirname(__file__))  # This directory
    PROJECT_ROOT = os.path.abspath(os.path.join(APP_DIR, os.pardir))
    BCRYPT_LOG_ROUNDS = 13
    DEBUG_TB_ENABLED = False 
    DEBUG_TB_INTERCEPT_REDIRECTS = False
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SQLALCHEMY_DATABASE_URI = database


class ProdConfig(Config):
    ENV = 'prod'
    DEBUG = False
    DEBUG_TB_ENABLED = False  

class DevConfig(Config):
    ENV = 'dev'
    DEBUG = True
    DEBUG_TB_ENABLED = True
from flask import Blueprint, jsonify, request, make_response
from .models import User
from server.extensions import db
from sqlalchemy.exc import IntegrityError

blueprint = Blueprint('user', __name__, url_prefix='/api/v1/users')


@blueprint.route("/register", methods=['POST'])
def register():
    data = request.get_json()
    user = User.query.filter_by(email=data.get('email')).first()
    if not user:
            user = User(
                email=data["email"],
                password=data["password"]
            )
            db.session.add(user)
            db.session.commit()
            token = user.encode_auth_token(user.id)
            print('token', token)
            responseObject = {
                'status': 'success',
                'message': 'Succesfully registered.',
                'token': token.decode()
            }
            return make_response(jsonify(responseObject)), 201

    else:
        responseObject = {
            'status': 'fail',
            'message': 'User already exists. Please log in.'
        }
        return make_response(jsonify(responseObject)), 202
import datetime as dt
import jwt

from server.database import Column, Model, SurrogatePK
from server.database import db, reference_col, relationship
from server.extensions import bcrypt


class Role(SurrogatePK, Model):

    __tablename__ = 'roles'
    name = Column(db.String(80), unique=True, nullable=False)
    user_id = reference_col('users', nullable=True)
    user = relationship('User', backref='roles')

    def __init__(self, name, **kwargs):
        db.Model.__init__(self, name=name, **kwargs)

    def __repr__(self):
        """Represent instance as a unique string."""
        return '<Role({name})>'.format(name=self.name)


class User(SurrogatePK, Model):

    __tablename__ = 'users'
    email = Column(db.String(80), unique=True, nullable=False)
    password = Column(db.String(255), nullable=True)
    created_at = Column(db.DateTime, nullable=False,
                        default=dt.datetime.utcnow)
    active = Column(db.Boolean(), default=False)
    is_admin = Column(db.Boolean(), default=False)

    def __init__(self, email, password=None, **kwargs):
        db.Model.__init__(self, email=email, **kwargs)
        if password:
            self.set_password(password)
        else:
            self.password = None

    def set_password(self, password):
        self.password = bcrypt.generate_password_hash(password).decode()

    def check_password(self, value):
        return bcrypt.check_password_hash(self.password, value)

    def __repr__(self):
        return '<User({email!r})>'.format(email=self.email)

    def encode_auth_token(self, user_id):
        try:
            payload = {
                'exp': dt.datetime.utcnow() + dt.timedelta(days=0, seconds=5),
                'iat': dt.datetime.utcnow(),
                'sub': user_id
            }
            return jwt.encode(
                payload,
                app.config.get('SECRET_KEY'),
                algorithm='HS256'
            )
        except Exception as e:
            return e

    @staticmethod
    def decode_auth_token(auth_token):
        """
        Validates the auth token
        :param auth_token:
        :return: integer|string
        """
        try:
            payload = jwt.decode(auth_token, app.config.get('SECRET_KEY'))
            is_blacklisted_token = BlacklistToken.check_blacklist(auth_token)
            if is_blacklisted_token:
                return 'Token blacklisted. Please log in again.'
            else:
                return payload['sub']
        except jwt.ExpiredSignatureError:
            return 'Signature expired. Please log in again.'
        except jwt.InvalidTokenError:
            return 'Invalid token. Please log in again.'
设置.py

from flask import Flask, render_template
from server import users
from server.extensions import bcrypt, db, migrate, cors
from server.settings import DevConfig


def create_app(config_object=DevConfig):
    app = Flask(__name__,
                static_folder="../frontend/public",
                template_folder="../frontend/public")
    app.config.from_object(config_object)
    register_extensions(app)
    register_blueprints(app)
    return app


def register_extensions(app):
    bcrypt.init_app(app)
    db.init_app(app)
    migrate.init_app(app, db)
    cors.init_app(app)
    return None


def register_blueprints(app):
    app.register_blueprint(users.api.blueprint)
    return None
import os


class Config(object):

    SECRET_KEY = 'p9Bv<3Eid9%$i01'
    APP_DIR = os.path.abspath(os.path.dirname(__file__))  # This directory
    PROJECT_ROOT = os.path.abspath(os.path.join(APP_DIR, os.pardir))
    BCRYPT_LOG_ROUNDS = 13
    DEBUG_TB_ENABLED = False 
    DEBUG_TB_INTERCEPT_REDIRECTS = False
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SQLALCHEMY_DATABASE_URI = database


class ProdConfig(Config):
    ENV = 'prod'
    DEBUG = False
    DEBUG_TB_ENABLED = False  

class DevConfig(Config):
    ENV = 'dev'
    DEBUG = True
    DEBUG_TB_ENABLED = True
from flask import Blueprint, jsonify, request, make_response
from .models import User
from server.extensions import db
from sqlalchemy.exc import IntegrityError

blueprint = Blueprint('user', __name__, url_prefix='/api/v1/users')


@blueprint.route("/register", methods=['POST'])
def register():
    data = request.get_json()
    user = User.query.filter_by(email=data.get('email')).first()
    if not user:
            user = User(
                email=data["email"],
                password=data["password"]
            )
            db.session.add(user)
            db.session.commit()
            token = user.encode_auth_token(user.id)
            print('token', token)
            responseObject = {
                'status': 'success',
                'message': 'Succesfully registered.',
                'token': token.decode()
            }
            return make_response(jsonify(responseObject)), 201

    else:
        responseObject = {
            'status': 'fail',
            'message': 'User already exists. Please log in.'
        }
        return make_response(jsonify(responseObject)), 202
import datetime as dt
import jwt

from server.database import Column, Model, SurrogatePK
from server.database import db, reference_col, relationship
from server.extensions import bcrypt


class Role(SurrogatePK, Model):

    __tablename__ = 'roles'
    name = Column(db.String(80), unique=True, nullable=False)
    user_id = reference_col('users', nullable=True)
    user = relationship('User', backref='roles')

    def __init__(self, name, **kwargs):
        db.Model.__init__(self, name=name, **kwargs)

    def __repr__(self):
        """Represent instance as a unique string."""
        return '<Role({name})>'.format(name=self.name)


class User(SurrogatePK, Model):

    __tablename__ = 'users'
    email = Column(db.String(80), unique=True, nullable=False)
    password = Column(db.String(255), nullable=True)
    created_at = Column(db.DateTime, nullable=False,
                        default=dt.datetime.utcnow)
    active = Column(db.Boolean(), default=False)
    is_admin = Column(db.Boolean(), default=False)

    def __init__(self, email, password=None, **kwargs):
        db.Model.__init__(self, email=email, **kwargs)
        if password:
            self.set_password(password)
        else:
            self.password = None

    def set_password(self, password):
        self.password = bcrypt.generate_password_hash(password).decode()

    def check_password(self, value):
        return bcrypt.check_password_hash(self.password, value)

    def __repr__(self):
        return '<User({email!r})>'.format(email=self.email)

    def encode_auth_token(self, user_id):
        try:
            payload = {
                'exp': dt.datetime.utcnow() + dt.timedelta(days=0, seconds=5),
                'iat': dt.datetime.utcnow(),
                'sub': user_id
            }
            return jwt.encode(
                payload,
                app.config.get('SECRET_KEY'),
                algorithm='HS256'
            )
        except Exception as e:
            return e

    @staticmethod
    def decode_auth_token(auth_token):
        """
        Validates the auth token
        :param auth_token:
        :return: integer|string
        """
        try:
            payload = jwt.decode(auth_token, app.config.get('SECRET_KEY'))
            is_blacklisted_token = BlacklistToken.check_blacklist(auth_token)
            if is_blacklisted_token:
                return 'Token blacklisted. Please log in again.'
            else:
                return payload['sub']
        except jwt.ExpiredSignatureError:
            return 'Signature expired. Please log in again.'
        except jwt.InvalidTokenError:
            return 'Invalid token. Please log in again.'
/users/models.py

from flask import Flask, render_template
from server import users
from server.extensions import bcrypt, db, migrate, cors
from server.settings import DevConfig


def create_app(config_object=DevConfig):
    app = Flask(__name__,
                static_folder="../frontend/public",
                template_folder="../frontend/public")
    app.config.from_object(config_object)
    register_extensions(app)
    register_blueprints(app)
    return app


def register_extensions(app):
    bcrypt.init_app(app)
    db.init_app(app)
    migrate.init_app(app, db)
    cors.init_app(app)
    return None


def register_blueprints(app):
    app.register_blueprint(users.api.blueprint)
    return None
import os


class Config(object):

    SECRET_KEY = 'p9Bv<3Eid9%$i01'
    APP_DIR = os.path.abspath(os.path.dirname(__file__))  # This directory
    PROJECT_ROOT = os.path.abspath(os.path.join(APP_DIR, os.pardir))
    BCRYPT_LOG_ROUNDS = 13
    DEBUG_TB_ENABLED = False 
    DEBUG_TB_INTERCEPT_REDIRECTS = False
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SQLALCHEMY_DATABASE_URI = database


class ProdConfig(Config):
    ENV = 'prod'
    DEBUG = False
    DEBUG_TB_ENABLED = False  

class DevConfig(Config):
    ENV = 'dev'
    DEBUG = True
    DEBUG_TB_ENABLED = True
from flask import Blueprint, jsonify, request, make_response
from .models import User
from server.extensions import db
from sqlalchemy.exc import IntegrityError

blueprint = Blueprint('user', __name__, url_prefix='/api/v1/users')


@blueprint.route("/register", methods=['POST'])
def register():
    data = request.get_json()
    user = User.query.filter_by(email=data.get('email')).first()
    if not user:
            user = User(
                email=data["email"],
                password=data["password"]
            )
            db.session.add(user)
            db.session.commit()
            token = user.encode_auth_token(user.id)
            print('token', token)
            responseObject = {
                'status': 'success',
                'message': 'Succesfully registered.',
                'token': token.decode()
            }
            return make_response(jsonify(responseObject)), 201

    else:
        responseObject = {
            'status': 'fail',
            'message': 'User already exists. Please log in.'
        }
        return make_response(jsonify(responseObject)), 202
import datetime as dt
import jwt

from server.database import Column, Model, SurrogatePK
from server.database import db, reference_col, relationship
from server.extensions import bcrypt


class Role(SurrogatePK, Model):

    __tablename__ = 'roles'
    name = Column(db.String(80), unique=True, nullable=False)
    user_id = reference_col('users', nullable=True)
    user = relationship('User', backref='roles')

    def __init__(self, name, **kwargs):
        db.Model.__init__(self, name=name, **kwargs)

    def __repr__(self):
        """Represent instance as a unique string."""
        return '<Role({name})>'.format(name=self.name)


class User(SurrogatePK, Model):

    __tablename__ = 'users'
    email = Column(db.String(80), unique=True, nullable=False)
    password = Column(db.String(255), nullable=True)
    created_at = Column(db.DateTime, nullable=False,
                        default=dt.datetime.utcnow)
    active = Column(db.Boolean(), default=False)
    is_admin = Column(db.Boolean(), default=False)

    def __init__(self, email, password=None, **kwargs):
        db.Model.__init__(self, email=email, **kwargs)
        if password:
            self.set_password(password)
        else:
            self.password = None

    def set_password(self, password):
        self.password = bcrypt.generate_password_hash(password).decode()

    def check_password(self, value):
        return bcrypt.check_password_hash(self.password, value)

    def __repr__(self):
        return '<User({email!r})>'.format(email=self.email)

    def encode_auth_token(self, user_id):
        try:
            payload = {
                'exp': dt.datetime.utcnow() + dt.timedelta(days=0, seconds=5),
                'iat': dt.datetime.utcnow(),
                'sub': user_id
            }
            return jwt.encode(
                payload,
                app.config.get('SECRET_KEY'),
                algorithm='HS256'
            )
        except Exception as e:
            return e

    @staticmethod
    def decode_auth_token(auth_token):
        """
        Validates the auth token
        :param auth_token:
        :return: integer|string
        """
        try:
            payload = jwt.decode(auth_token, app.config.get('SECRET_KEY'))
            is_blacklisted_token = BlacklistToken.check_blacklist(auth_token)
            if is_blacklisted_token:
                return 'Token blacklisted. Please log in again.'
            else:
                return payload['sub']
        except jwt.ExpiredSignatureError:
            return 'Signature expired. Please log in again.'
        except jwt.InvalidTokenError:
            return 'Invalid token. Please log in again.'
将日期时间导入为dt
进口jwt
从server.database导入列、模型、代理程序
从server.database导入数据库,引用列,关系
从server.extensions导入bcrypt
类角色(代理、模型):
__tablename_uu='角色'
name=列(db.String(80),unique=True,nullable=False)
user\u id=reference\u col('users',nullable=True)
用户=关系('user',backref='roles')
定义初始化(self,name,**kwargs):
db.Model.\uuuu init\uuuu(self,name=name,**kwargs)
定义报告(自我):
“”“将实例表示为唯一字符串。”“”
返回“”。格式(name=self.name)
类用户(代理程序,模型):
__tablename_uu='users'
email=列(db.String(80),unique=True,nullable=False)
password=Column(db.String(255),null=True)
在=列处创建(db.DateTime,nullable=False,
默认值=dt.datetime.utcnow)
active=列(db.Boolean(),默认值=False)
is_admin=Column(db.Boolean(),默认值=False)
定义初始化(自我、电子邮件、密码=无,**kwargs):
db.Model.\uuuu init\uuuuu(self,email=email,**kwargs)
如果输入密码:
self.set_密码(password)
其他:
self.password=None
def设置_密码(自我、密码):
self.password=bcrypt.generate_password_hash(password.decode)()
def检查_密码(自身、值):
返回bcrypt.check\u password\u散列(self.password,value)
定义报告(自我):
返回“”。格式(email=self.email)
def encode_auth_令牌(自身、用户id):
尝试:
有效载荷={
“exp”:dt.datetime.utcnow()+dt.timedelta(天=0,秒=5),
“iat”:dt.datetime.utcnow(),
“sub”:用户\u id
}
返回jwt.encode(
有效载荷,
app.config.get('SECRET_KEY'),
算法='HS256'
)
例外情况除外,如e:
返回e
@静力学方法
def解码认证令牌(认证令牌):
"""
验证身份验证令牌
:param auth_令牌:
:return:integer |字符串
"""
尝试:
payload=jwt.decode(身份验证令牌,app.config.get('SECRET\u KEY'))
is_blacklisted_token=BlacklistToken。检查_黑名单(auth_token)
如果是被列入黑名单的\u令牌:
return“令牌”被列入黑名单。请重新登录。”
其他:
返回有效载荷['sub']
除jwt.ExpiredSignatureError外:
return的签名已过期。请重新登录。”
除jwt.InvalidTokenError外:
return“无效令牌”。请重新登录。”

提前感谢

问题很清楚,与烧瓶本身无关

  File "/mnt/c/Users/Jacobo/Projects/alen/server/users/api.py", line 25, in register 
   'token': token.decode()
AttributeError: 'NameError' object has no attribute 'decode'
对象
标记
不是具有
解码
(我假设它应该是
字节
);而是一个
namererror
对象

如果我们追溯到
token
的来源,它来自您的
def encode\u auth\u token(self,user\u id):
函数–存在的问题是,任何异常都会返回,而不是正确处理(或者说,没有处理,因此它们会引发异常):


我建议完全删除该异常处理,以便找到根本原因(例如,
SECRET\u KEY
必须是字节,而不是字符串,但您会发现这一点)。

我已经删除了try和except,现在错误是:
文件/mnt/c/Users/Jacobo/Projects/alen/server/Users/models.py”,第72行,在encode_auth_token app.config.get('SECRET_KEY')中,NameError:name'app'未定义
我不明白为什么未加载配置。这是我的run.py文件
来自flask.helpers从服务器导入get_debug_标志。app import从服务器导入create_应用。settings import DevConfig,ProdConfig=DevConfig如果get_debug_标志()否则ProdConfig app=create_app(CONFIG)
您还没有在该模块中导入
app
。确定,但如果我从models.py中的server.app import app添加,我会出现“无法导入app”。循环依赖项?有什么帮助吗??谢谢