Как работает регистрация в Flask [дубликат]

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

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 ");
        }
    }
}
68
задан lord63. j 8 June 2015 в 02:43
поделиться

6 ответов

Чтобы построить ответ 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)
9
ответ дан ankostis 18 August 2018 в 21:58
поделиться
  • 1
    «@ api.record» не работает для меня. Из какого пространства имен «api»? – Tim Richardson 29 May 2016 в 02:52
  • 2
    Извините, не скопировал это из строки в вопросе from api import api_blueprint as api – Kyle James Walker 29 May 2016 в 03:06
  • 3
    Обратите внимание, что прокси current_app доступен только в контексте запроса. – sepehr 6 August 2016 в 15:20

Метод перегрузки 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()])
16
ответ дан Ashalynd 18 August 2018 в 21:58
поделиться
  • 1
    Для Python 3 используйте: app.config.items () вместо app.config.iteritems () – DhoTjai 2 November 2017 в 15:08
  • 2
    Привет, мне нужно вызвать или зарегистрировать record_params, я пробовал, но это не сработало. Большое спасибо. – mrblue 12 July 2018 в 15:13
  • 3

Подход current_app хорош, но у вас должен быть некоторый контекст запроса. Если у вас его нет (например, для предварительного тестирования, например), вам лучше разместить

with app.test_request_context('/'):

до этого вызова current_app.

Вместо этого у вас будет RuntimeError: working outside of application context.

3
ответ дан Ben Usman 18 August 2018 в 21:58
поделиться
  • 1
    Как насчет того, когда приложение создано на заводе, и поэтому «приложение» (или что-то другое вызывает фляжное приложение) недоступно для импорта? Внутри запросов это не проблема, потому что во время запросов есть контекст приложения, но при определении частей вне логики запроса, которые требуют конфигурации приложения. как можно получить доступ к конфигурации приложения, если вы не можете использовать приложение для создания контекста? – RobertoCuba 18 June 2016 в 02:15

Вам либо нужно импортировать основную переменную 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)
2
ответ дан Daniel Chatfield 18 August 2018 в 21:58
поделиться
  • 1
    Да, я не хотел делать ни одного из двух. Первый - создание перекрестных ссылок, а второй подход - не СУХОЙ. – Chirdeep Tomar 13 August 2013 в 20:58
  • 2
    @ChirdeepTomar Если первый подход создает циклический импорт (который нарушает приложение), то есть что-то не так, как структурировано ваше приложение. – Daniel Chatfield 13 August 2013 в 22:35
  • 3
    @DanielChatfield, это просто неправда. Объект приложения - это объект, который регистрирует чертежи. Предложив, что для чертежа правильно, чтобы импортировать объект приложения, always вызывает круговую зависимость. См. Другие ответы для правильной стратегии. – sholsapp 4 July 2014 в 22:42
  • 4
    @sholsapp Я знаю, что он создаст круговой импорт (так же, как в флаговых документах: flask.pocoo.org/docs/patterns/packages ), я сказал, что если он создал круговой импорт , которые нарушили приложение . – Daniel Chatfield 5 July 2014 в 09:27

Вы также можете обернуть чертеж в функции и передать app в качестве аргумента:

Blueprint:

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

Main:

from . import my_blueprint
app.register_blueprint(my_blueprint.get_blueprint(app))
1
ответ дан Georg Schölly 18 August 2018 в 21:58
поделиться
  • 1
    Я попробовал это, но у меня есть «Внутренняя ошибка сервера». – MD004 11 July 2017 в 23:20
  • 2
    @ MD004: Посмотрите на свои журналы ошибок сервера. – Georg Schölly 12 July 2017 в 05:48
  • 3
    Какие-либо недостатки такого подхода? – Tuukka Mustonen 21 September 2017 в 19:46
  • 4
    @Tuukka: Я не помню каких-либо особых недостатков, это было слишком долго, так как я использовал его. При использовании чертежа в нескольких приложениях могут быть некоторые преимущества flask.current_app. Я бы предложил, если этот подход решит ваши проблемы, чтобы использовать его, Flask не применяет конкретный подход. – Georg Schölly 27 September 2017 в 19:17

В чертежах есть метод register , который вызывается, когда вы устанавливаете схему . Таким образом, вы можете переопределить этот метод или использовать record decorator для описания логики, которая зависит от app.

4
ответ дан tbicr 18 August 2018 в 21:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: