2016-08-17 2 views
0

웹 응용 프로그램을 개발하는 동안 flask-admin과 같은 공장 패턴 및 플라스크 확장을 사용합니다. 응용 프로그램을 만들지 않았을 때 flask-admin에서 일부 구성을로드하려고합니다. 그래서 current_app.config["SOME_CONFIG"]을 사용하여 구성 값을 얻습니다. 그러나 나는 Working outside of application context. 예외를 가지고 있습니다. 코드는 다음과 같습니다 :플라스크에서 공장 패턴을 사용할 때 플라스크 확장에 config를 사용하는 방법은 무엇입니까?

# __init__.py 

from flask import Flask 

def create_app(config_name): 

    app = Flask(__name__) 
    app.config.from_object(config_name) 
    app.config.from_pyfile("config.py") 

    from admin import admin 
    admin.init_app(app) 

    return app 


# admin/__init__.py 

from flask import current_app 
from flask_admin import Admin 

admin = Admin(name=current_app.config["ADMIN_NAME"], template="bootstrap2") 
+0

여기에 붙여 넣은 모든 줄 사이에 공백이 없어야합니다. 또한 코드가 4 개 들여 쓰기가 너무 많습니다. 오 ... 사실, 당신은 또한 헤더가 될 가능성이있는 것을 들여 썼습니다. –

+1

admin 이름이 config의 일부분 인 이유는 무엇입니까? 그것은 그것이 작동하도록 의도 된 것 같지 않습니다. – davidism

+0

@davidism flask-admin 외에, 플라스크 보안을 사용할 때 모델의 필드를 정의하도록 구성에 따라 싶습니다. 예를 들어, SECURITY_TRACKABLE이 True이면 login_count, last_login_ip, last_login_at를 정의합니다 ... – stamaimer

답변

2

귀하의 응용 프로그램은 create_app 기능 (참조 http://flask.pocoo.org/docs/0.11/appcontext/ 참조) 동안 여전히 설정 상태에 있습니다. 설치 상태에서 액세스하려면 응용 프로그램 객체에 대한 참조가 필요하며 current_app는 사용할 수 없습니다.

admin = Admin(name=app.config["ADMIN_NAME"], template="bootstrap2")

또는

변화 관리자 변수를하고 admin/__init__.py에서 함수 작성 :

당신은 사용 create_app 기능 내에서 관리 객체를 생성 할 수

admin = object() 
def instantiate_admin(config): 
    global admin 
    admin = Admin(name=config["ADMIN_NAME"], template="bootstrap2") 
    return admin 

및 create_app()에서 사용 :

from admin import instantiate_admin 
admin = instantiate_admin(app.config) 
admin.init_app(app) 
0

당신이해야 할 일은 다음과 같이 설정하는 것입니다.

# config.py 
class Config(object): 
    ADMIN_NAME = 'admin' 

# __init__.py 
from flask import Flask 
from flask_admin import Admin 

# initiate all extensions here 
admin = Admin(template='bootstrap2') 

def create_app(config): 
    app = Flask(__name__) 
    app.config.from_object(config) 

    admin.init_app(app) 
    return app 

# wsgi.py 
from . import create_app 
from config import Config 

app = create_app(Config) 

if __name__ == '__main__': 
    app.run() 

그리고 관리자 패키지 아래

# admin/__init__.py 
from .. import admin # import extensions from __init__.py 

admin.add_view('blah') 

에서

는 실제 예제에 대한 링크입니다. 나는 좀 더 일반적인 정보를 문질렀다. 그러나 이것은 내가 모든 플라스크 응용 프로그램을 설치하는 방법이다. 만큼 당신이 응용 프로그램의 맥락에서 그것을 유지 문제가 안 dev에 서버를 실행으로

http://hastebin.com/likupoxoxi.py

.

관련 문제