2013-11-03 5 views

답변

2

두 가지 초기화 방법은 Flask 확장을위한 표준이며 확장이 초기화되는 방법에 대한 암시 적 규칙을 따릅니다. this section of the Flask documentation에서 설명하는 메모를 찾을 수 있습니다.

주의 할 점으로, init_app은 앱을 자체에 할당하지 않습니다. 이것은 의도적 인 것입니다! 클래스 기반 Flask 확장은 응용 프로그램이 생성자에 전달 될 때 객체에 응용 프로그램을 저장해야합니다. 이것은 확장을 알려주는 것입니다 : 다중 어플리케이션을 사용하는 것에 관심이 없습니다.

확장 프로그램에서 현재 응용 프로그램을 찾아야하고 참조가 필요하지 않으면 응용 프로그램을 명시 적으로 전달할 수있는 방법으로 local_current 응용 프로그램 컨텍스트를 사용하거나 API를 변경해야합니다. 다음과 같이

생각

요약 될 수있다 : 당신이 SQLAlchemy(app) 생성자를 사용하는 경우가 self.app에 대한 참조를 저장할 수 있도록

  • 다음 확장, app 유일한 응용 프로그램입니다 있다고 가정합니다.
  • init_app(app) 생성자를 사용하는 경우 확장은 app이 가능한 많은 응용 프로그램 중 하나라고 가정합니다. 따라서 참조를 저장하는 대신 필요할 때마다 응용 프로그램을 찾기 위해 current_app에 의존하게됩니다.

확장을 초기화하는 두 가지 방법의 실제적인 차이점은 생성자에서 전달되어야하므로 첫 번째 형식은 응용 프로그램이 있어야한다는 것입니다. 두 번째 형식을 사용하면 생성자에 아무 것도 전달하지 않기 때문에 응용 프로그램이 존재하기 전에 db 개체를 만들 수 있습니다. 이 경우 애플리케이션 인스턴스가 생길 때까지 db.init_app(app)에 대한 호출을 연기합니다. 응용 프로그램 인스턴스의 생성이 지연되는 일반적인 상황은 application factory pattern을 사용하는 경우입니다.