コード例 #1
0
ファイル: app.py プロジェクト: rasenx/flask-restplus-demo
def main():
    host = config.get('FLASK_HOST', '0.0.0.0')
    port = config.get('FLASK_PORT', 5000)
    debug = config.get('FLASK_DEBUG', True)
    use_reloader = config.get('FLASK_USE_RELOADER', True)
    app.run(host=host,
            port=port,
            debug=debug,
            use_debugger=debug,
            use_reloader=use_reloader)
コード例 #2
0
 def default_error_handler(e):
     """
     Provide a default error handler for RestPlus to leverage.
     """
     logger.exception(e)
     debug = config.get('FLASK_DEBUG')
     if not debug:
         message = 'An unhandled exception occurred.'
         return {'message': message}, 500
コード例 #3
0
class Users:
    """ Known users """
    seed_service = User(id='73ff4c06-5054-425e-a6fe-496a489a3013',
                        email='*****@*****.**',
                        password=hash_password(config.get('passwords.seed')),
                        is_system_user=True)
    root = User(id='11b11961-949d-4c44-bf6a-1a44487c141d',
                email='*****@*****.**',
                password=hash_password(config.get('passwords.root')),
                is_system_user=True)
    admin = User(id='a1e121cc-76d8-45a1-a476-2936c6ba3278',
                 email='*****@*****.**',
                 password=hash_password(config.get('passwords.admin')),
                 is_system_user=True)
    minion = User(id='99ddc422-d2d4-46a7-a236-929abeda9af9',
                  email='*****@*****.**',
                  password=hash_password(config.get('passwords.minion')),
                  is_system_user=True)
    guest = User(id='788251aa-7290-4e96-b223-7ff42e27ba79',
                 email='*****@*****.**',
                 password=hash_password(config.get('passwords.guest')))
コード例 #4
0
    def audit(self,
              action,
              description=None,
              meta={},
              log_message=False) -> AuditLog:
        """
        Builds an AuditLog object, with the current user's username.
        If an http request object is present, the current request will be logged.
        """

        user = current_user or self.user
        assert user

        audit_log_entry = AuditLog()
        audit_log_entry.user_id = user.id
        audit_log_entry.user_email = user.email
        audit_log_entry.action = action
        audit_log_entry.description = description
        audit_log_entry.meta = meta

        try:
            if self.has_request_context:
                audit_log_entry.url = request.url
                firstline = '{} {}'.format(request.method, request.url)

                audit_request_bodies = config.get('AUDIT_REQUEST_BODIES')
                if audit_request_bodies:
                    audit_log_entry.request = '{}\n{}\n{}'.format(
                        firstline, request.headers, request.data)
                else:
                    audit_log_entry.request = '{}\n{}'.format(
                        firstline, request.headers)

            if log_message:
                message = "Audit Log: User: '******' {}. Meta: {}"
                message = message.format(audit_log_entry.user_email,
                                         audit_log_entry.action,
                                         audit_log_entry.meta)

                logger.info(message)

        except Exception as e:
            logger.error(e)

        return audit_log_entry
コード例 #5
0
# This line sets up loggers basically.
fileConfig(config.config_file_name)
logger = logging.getLogger('alembic.env')

# add your model's MetaData object here
# for 'autogenerate' support
# from myapp import mymodel
# target_metadata = mymodel.Base.metadata
target_metadata = Base.metadata

# other values from the config, defined by the needs of env.py,
# can be acquired:
# my_important_option = config.get_main_option("my_important_option")
# ... etc.

sqlalchemy_uri = env.get('SQLALCHEMY_DATABASE_URI')


def run_migrations_offline():
    """Run migrations in 'offline' mode.

    This configures the context with just a URL
    and not an Engine, though an Engine is acceptable
    here as well.  By skipping the Engine creation
    we don't even need a DBAPI to be available.

    Calls to context.execute() here emit the given string to the
    script output.

    """
    print('Running migrations offline. sqlalchemy.uri: {}'.format(
コード例 #6
0
def app_factory():
    monkey_patch_json_encoder()

    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = config.get('SQLALCHEMY_DATABASE_URI')
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
    app.secret_key = config.get('FLASK_SESSION_SECRET_KEY')

    db.init_app(app)

    Marshmallow(app)

    app.wsgi_app = ProxyFix(app.wsgi_app)
    app.url_map.strict_slashes = False

    blueprint = Blueprint('v1', __name__, url_prefix='/api/v1')
    api.init_app(blueprint)
    api.add_namespace(auth_namespace, '/authentication')
    api.add_namespace(users_namespace, '/users')

    app.register_blueprint(blueprint)
    app.session_interface = AppSessionInterface()

    login_manager = LoginManager()
    login_manager.init_app(app)

    seed_data_enabled = config.get('SEED_DATA_ENABLED')
    if seed_data_enabled:
        with app.app_context():
            seed_data = SeedDataService()
            seed_data.seed()

    @login_manager.user_loader
    def load_user(user_id):
        return User.query.get(user_id)

    @login_manager.request_loader
    def load_user_from_request(request):
        header = request.headers.get('Authorization')
        if header is None:

            # review how to whitelist end points that we know won't ever require authn/authz
            # total hack, clean up with werkzeug or flask trimming, or our own method... this is super messy.
            whitelist = ['/api/v1', '/api/v1?', '/api/v1/?', '/api/v1/swagger.json']
            if request.full_path in whitelist:
                return

            raise Unauthorized()

        header_value = header.split()
        auth_type = header_value[0].lower()

        if auth_type == 'bearer':
            authenticated_bearer_token(header_value[1])

        elif auth_type == 'basic':
            creds = request.authorization
            if creds is not None:
                authenticate_basic(creds.username, creds.password)

        if current_user is None:
            raise Unauthorized()

        g.authenticated_from_header = True

    @app.after_request
    def after_request(response):
        if 'cache-control' not in response.headers:
            response.headers['cache-control'] = 'no-cache'
        return response

    @api.errorhandler
    def default_error_handler(e):
        """
        Provide a default error handler for RestPlus to leverage.
        """
        logger.exception(e)
        debug = config.get('FLASK_DEBUG')
        if not debug:
            message = 'An unhandled exception occurred.'
            return {'message': message}, 500

    @app.errorhandler(400)
    def bad_request_error(e):
        return jsonify(error=400, text=str(e)), 400

    @app.errorhandler(404)
    def page_not_found(e):
        return jsonify(error=404, text=str(e)), 404

    @app.errorhandler(500)
    def server_error(e):
        logger.error(e)
        return jsonify(error=500, text=str(e)), 500

    @app.errorhandler(RequestException)
    def request_exception(e):
        logger.error(e)
        return jsonify(error=500, text=str(e)), 500

    return app