Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.
Например, ниже - класс ученика, который будет использовать его в нашем коде.
public class Student {
private int id;
public int getId() {
return this.id;
}
public setId(int newId) {
this.id = newId;
}
}
Приведенный ниже код дает вам исключение с нулевым указателем.
public class School {
Student obj_Student;
public School() {
try {
obj_Student.getId();
}
catch(Exception e) {
System.out.println("Null Pointer ");
}
}
}
Поскольку вы используете Obj_Student
, но вы забыли инициализировать его, как в правильном коде, показанном ниже:
public class School {
Student obj_Student;
public School() {
try {
obj_Student = new Student();
obj_Student.setId(12);
obj_Student.getId();
}
catch(Exception e) {
System.out.println("Null Pointer ");
}
}
}
Чтобы построить ответ tbicr's , вот пример, переопределяющий пример метода register
:
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__)
И пример с использованием record
декоратор :
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)
Метод перегрузки record
кажется довольно простым:
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()])
Подход current_app
хорош, но у вас должен быть некоторый контекст запроса. Если у вас его нет (например, для предварительного тестирования, например), вам лучше разместить
with app.test_request_context('/'):
до этого вызова current_app
.
Вместо этого у вас будет RuntimeError: working outside of application context
.
Вам либо нужно импортировать основную переменную app
(или то, что вы ее вызвали), которая возвращается Flask()
:
from someplace import app
app.config.get('CLIENT_ID')
Или сделать это из запроса:
@api.route('/authorisation_url')
def authorisation_url():
client_id = current_app.config.get('CLIENT_ID')
url = auth.get_authorisation_url()
return str(url)
Вы также можете обернуть чертеж в функции и передать app
в качестве аргумента:
Blueprint:
def get_blueprint(app):
bp = Blueprint()
return bp
Main:
from . import my_blueprint
app.register_blueprint(my_blueprint.get_blueprint(app))
flask.current_app
. Я бы предложил, если этот подход решит ваши проблемы, чтобы использовать его, Flask не применяет конкретный подход.
– Georg Schölly
27 September 2017 в 19:17
В чертежах есть метод register
, который вызывается, когда вы устанавливаете схему . Таким образом, вы можете переопределить этот метод или использовать record
decorator для описания логики, которая зависит от app
.
from api import api_blueprint as api
– Kyle James Walker 29 May 2016 в 03:06current_app
доступен только в контексте запроса. – sepehr 6 August 2016 в 15:20