How to access app.config in a blueprint?

前端 未结 7 962
没有蜡笔的小新
没有蜡笔的小新 2020-12-12 23:07

I am trying to access access application configuration inside a blueprint authorisation.py which in a package api. I am initializing the blueprint in __in

相关标签:
7条回答
  • 2020-12-12 23:36

    Use flask.current_app in place of app in the blueprint view.

    from flask import current_app
    
    @api.route("/info")
    def get_account_num():
        num = current_app.config["INFO"]
    

    The current_app proxy is only available in the context of a request.

    0 讨论(0)
  • 2020-12-12 23:36

    You could also wrap the blueprint in a function and pass the app as an argument:

    Blueprint:

    def get_blueprint(app):
        bp = Blueprint()
        return bp
    

    Main:

    from . import my_blueprint
    app.register_blueprint(my_blueprint.get_blueprint(app))
    
    0 讨论(0)
  • 2020-12-12 23:50

    Blueprints have register method which called when you register blueprint. So you can override this method or use record decorator to describe logic which depends from app.

    0 讨论(0)
  • 2020-12-12 23:53

    You either need to import the main app variable (or whatever you have called it) that is returned by Flask():

    from someplace import app
    app.config.get('CLIENT_ID')
    

    Or do that from within a request:

    @api.route('/authorisation_url')
    def authorisation_url():
        client_id = current_app.config.get('CLIENT_ID')
        url = auth.get_authorisation_url()
        return str(url)
    
    0 讨论(0)
  • 2020-12-12 23:54

    Overloading record method seems to be quite easy:

    api_blueprint = Blueprint('xxx.api',  __name__, None)
    api_blueprint.config = {}
    
    @api_blueprint.record
    def record_params(setup_state):
      app = setup_state.app
      api_blueprint.config = dict([(key,value) for (key,value) in app.config.iteritems()])
    
    0 讨论(0)
  • 2020-12-12 23:54

    To build on tbicr's answer, here's an example overriding the register method example:

    from flask import Blueprint
    
    auth = None
    
    class RegisteringExampleBlueprint(Blueprint):
        def register(self, app, options, first_registration=False):
            global auth
    
            config = app.config
            client_id = config.get('CLIENT_ID')
            client_secret = config.get('CLIENT_SECRET')
            scope = config.get('SCOPE')
            callback = config.get('CALLBACK')
    
            auth = OauthAdapter(client_id, client_secret, scope, callback)
    
            super(RegisteringExampleBlueprint,
                  self).register(app, options, first_registration)
    
    the_blueprint = RegisteringExampleBlueprint('example', __name__)
    

    And an example using the record decorator:

    from flask import Blueprint
    from api import api_blueprint as api
    
    auth = None
    
    # Note there's also a record_once decorator
    @api.record
    def record_auth(setup_state):
        global auth
    
        config = setup_state.app.config
        client_id = config.get('CLIENT_ID')
        client_secret = config.get('CLIENT_SECRET')
        scope = config.get('SCOPE')
        callback = config.get('CALLBACK')
    
        auth = OauthAdapter(client_id, client_secret, scope, callback)
    
    0 讨论(0)
提交回复
热议问题