如何构建这种中型烧瓶应用?

时间:2017-07-26 07:42:38

标签: authentication flask authorization flask-security

在Python中使用FLASK框架,我的应用程序需要:

  1. 注册并登录用户(使用sqlite或postgres数据库)
  2. 访问登录用户拥有的特定Google电子表格,并以json格式输出该数据。 我需要拥有自己的授权和权限。认证系统
  3. 我在弄清楚如何构建应用程序时遇到了很多麻烦 - 我应该拥有哪些目录和子目录?

    我做过很多比赛(约1个月)。我正在使用虚拟环境,但不知道如何测试我的代码。一般来说,我的代码运行但我不知道它们是如何一起工作的。**我对瓶子来说是全新的。**

    构建应用

    |应用

    | ---- run.py

    | ---- config.py

    | ----数据库

    | --------- database.db

    | ----应用

    | --------- views.py

    | --------- models.py

    | --------- forms.py

    | --------- extensions.py

    | ----模板

    | ---------....

    | ----静态

    | --------....

    授权/身份验证我看过Flask-Login,Flask-Auth,Flask-Security。我理解一般的想法,但不知道如何安全地实施完整的授权和认证系统。

    app = Flask(__name__)
    app.config.from_object(config)
    login_manager = LoginManager()
    login_manager.init_app(app)
    
    def create_app():   
        db.init_app()
        db.app = app
        db.create_all()
        return app
    
    @app.route('/')
    def index():
         #needs to render the homepage template
    
    @app.route('/signup', methods = ['GET', 'POST'])
    def register():
        form = SignupForm()
        if request.method == 'GET':
            return render_template('signup.html', form=form)
        elif request.method == 'POST':
            if form.validate_on_submit():
                if User.query.filter_by(email=form.email.data).first():
                    return "email exists"
                else:
                    newuser = User(form.email.data, form.password.data)
                    db.session.add(newuser)
                    db.session.commit()
                    login_user(newuser)
    
                return "New User created"
        else:
            return "form didn't validate"
    
        return "Signup"
    
    @app.route('/login', methods = ['GET', 'POST'])
    def login():
        form = SignupForm()
    
        if request.method == 'GET':
            return render_template('login.html', form=form)
        elif request.method == 'POST':
            if form.validate_on_submit():
                user = User.query.filter_by(email=form.email.data).first()
                if user:
                    if user.password == form.password.data:
                        login_user(user)
                        return "you are logged in"
                    else:
                        return "wrong password"
                else:
                    return "user doesnt exist"
            else:
                return "form did not validate"
    
    @login_manager.user_loader
    def load_user(email):
        return User.query.filter_by(email = email).first()
    
    @app.route('/protected')
    @login_required
    def protected():
        return "protected area for logged in users only"
    
    if __name__ == '__main__':
        #app.create_app()
        app.run(port=5000, host='localhost')`
    
    from flask_security import Security, SQLAlchemyUserDatastore, UserMixin, RoleMixin, login_required
    import os
    
    # Create app
    app = Flask(__name__)
    #app.config['DEBUG'] = True
    app.config['SECRET_KEY'] = '' 
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////'
    app.config['SECURITY_PASSWORD_HASH'] = 'sha512_crypt'
    app.config['SECURITY_PASSWORD_SALT'] = str(os.urandom(24))
    # Create database connection object
    db = SQLAlchemy(app)
    
    # Define models
    roles_users = db.Table('roles_users',
        db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
        db.Column('role_id', db.Integer(), db.ForeignKey('role.id')))
    
    class Role(db.Model, RoleMixin):
        id = db.Column(db.Integer(), primary_key=True) 
        name = db.Column(db.String(80), unique=True) 
        description = db.Column(db.String(255))
    
    class User(db.Model, UserMixin):
        id = db.Column(db.Integer, primary_key=True)
        email = db.Column(db.String(255), unique=True) 
        password = db.Column(db.String(255))
        active = db.Column(db.Boolean())
        confirmed_at = db.Column(db.DateTime())
        roles = db.relationship('Role', secondary=roles_users,  backref=db.backref('users', lazy='dynamic'))
    
    
    user_datastore = SQLAlchemyUserDatastore(db, User, Role)
    security = Security(app, user_datastore)
    
    # Create a user to test with
    @app.before_first_request 
    def create_user():
        db.create_all()
        user_datastore.create_user(email='', password='')
        db.session.commit()
    
    @app.route('/') 
    @login_required 
    def home():
        #password = encrypt_password('mypass')
        #print verify_and_update_password('mypass', password)
        return "hello"
    
    if __name__ == '__main__': 
        app.run(debug=True, use_reloader=False)
    

    **我真的很感激任何指导!**

2 个答案:

答案 0 :(得分:0)

项目结构:
如果您计划构建更大的Flask应用程序,则应考虑将功能分解为蓝图 官方Flask文档提供了有关如何构建更大应用程序的教程: http://flask.pocoo.org/docs/0.12/patterns/packages/

另外,请查看Hitchhiker组织项目的指南。它有一些非常好的观点:http://python-guide-pt-br.readthedocs.io/en/latest/writing/structure/

如果您正在设计REST API,请考虑使用Flask-RESTful(也适用于蓝图)

答案 1 :(得分:0)

你好,我想出来&我的应用程序看起来很好:)我正在使用蓝图&应用工厂模式。

APP
|_runserver.py
|_/app
|---__init__.py
|---config.py
|---extensions.py
|---forms.py
|---models.py
|---/login_dashboard #blueprint
|------__init__.py
|------views.py
|------/templates
|---------base.html
             .
             .
|------/static
|-----------/css
              .
              .
|-----------/js
              .
              .
|-----------/img
              .
              .