2016-08-13 7 views
0

В настоящее время я кодирую простое веб-приложение, используя флягу и flask_login. Это main.py:колба и флак_login - избегать импорта flask_login из основного кода

import flask 
import flask_login 

app = flask.Flask(__name__) 

login_manager = flask_login.LoginManager() 
login_manager.init_app(app) 

@app.route('/') 
@flask_login.login_required 
def index(): 
    return "Hello World!" 

Приведенный выше код работает. Проблема возникает из-за того, что я хочу отделить код, связанный с аутентификацией, от кода приложения основной колбы. Другими словами, я хочу my_auth.py, который импортирует flask_login, и я хочу main.py до import my_auth, и НЕ должен импортировать flask_login.

Проблема с декоратором @flask_login.login_required. Если я не импортирую flask_login из main.py, можно ли как-то «обернуть» основную функцию index() с помощью login_required?

(я на самом деле задал неправильный вопрос раньше, которые все еще могут иметь отношение: flask and flask_login - organizing code)

+1

Почему вы не хотите импортировать 'flask_login' в' main.py'? –

+0

Разделение проблем - пытаясь понять, насколько я могу отделить сторону входа от основного кода. – wookie919

+0

Проблемы уже разделены: у вас есть отдельный модуль под названием «flask_login», который обеспечивает регистрацию. – davidism

ответ

3

создать файл my_auth.py

# my_auth.py 

import flask_login 

login_manager = flask_login.LoginManager() 

# create an alias of login_required decorator 
login_required = flask_login.login_required 

и в файле main.py

# main.py 

import flask 
from my_auth import (
    login_manager, 
    login_required 
) 

app = flask.Flask(__name__) 
login_manager.init_app(app) 

@app.route('/') 
@login_required 
def index(): 
    return "Hello World!" 

Может быть это то, чего вы хотите достичь.

+0

Спасибо.Поскольку я не уверен, что лучший метод, я подожду еще несколько дней, прежде чем принять ваш ответ, если появится гуру фляги/flask_login и даст окончательный ответ. – wookie919

+0

@ wookie919 да, конечно. Я думаю, что на самом деле эта большая часть кода достаточно, если вам это нужно. –

1

Я могу подтвердить, что ответ Акшай работает.

Во время ожидания ответа, однако, я также нашел обходной путь, который не полагаться на использование декоратора (?):

В main.py:

@SVS.route("/") 
def index(): 
    if not my_auth.is_authenticated(): 
     return flask.redirect(flask.url_for('login')) 

    return "Hello World!" 

В my_auth.py:

def is_authenticated(): 
    return flask_login.current_user.is_authenticated 

 Смежные вопросы

  • Нет связанных вопросов^_^