Направьте два модуля на один и тот же URL-адрес в Flask по сеансу

У меня есть незарегистрированный модуль/схема welcome и зарегистрированная схема home. Я хочу, чтобы пользователь с действительным сеансом перешел на home.index, а пользователь, являющийся гостем, — на welcome.index. Однако у меня возникают проблемы, потому что обе эти функции направляются к одному и тому же URL-адресу, /.

Как я могу сделать эту функциональность возможной? Я попытался добавить:

if(logged_in():
    redirect(url_for('home.index'))

на index() в схеме приветствия, но это, конечно, просто вызывает циклическую переадресацию, потому что URL-адрес для home.index такой же, как welcome.index.

Я также пытался определить welcome.index только в том случае, если logged_in() истинно. Однако это вызывает проблемы, потому что на сайте есть другие ссылки, ведущие на welcome.index, и если пользователь вошел в систему, они вызывают ошибки, поскольку welcome.index технически больше не существует.

Редактировать

Я вижу эту ошибку AttributeError: 'Blueprint' object has no attribute 'index' из этого кода:

from flask import Flask, session, g

from modules.welcome import welcome
from modules.home import home as home

from modules.home import index
from modules.welcome import index

 app = Flask(__name__)
 app.config.from_pyfile('config.cfg')

 app.register_blueprint(welcome)
 app.register_blueprint(home)

 @app.route('/', methods=['GET', 'POST'])
 def index():
    if 'user_id' in session:
        return home.index()
    else:
        return welcome.index()

Редактировать № 2: Код чертежей

Код в модулях/home.py:

from flask import Blueprint, render_template, redirect, url_for, request, session, g

from models.User import User
from helpers.login import *

home = Blueprint('home', __name__)

def index():
    return render_template('home/index.html')

Код в модулях/welcome.py:

from flask import Blueprint, render_template, redirect, url_for, request, session, g
import md5

from models.User import User
from helpers.login import *

welcome = Blueprint('welcome', __name__)

def index():
    alert, email = None, None
    if request.method == 'POST' and not logged_in():
        email = request.form['email'] 
        password_salt = md5.new(request.form['password']).hexdigest()
        user = User.query.filter_by(email=email , password_salt=password_salt).first()
        if user is None:
            alert = "Wrong username or password!"
        else:
            session['user_id'] = user.id
            return redirect(url_for('home.index'))
    return render_template('welcome/index.html', alert=alert, email=email)

@welcome.route('/about')
def about():
    return render_template('welcome/about.html')

@welcome.route('/tandp')
def tandp():
    return render_template('welcome/tandp.html')

@welcome.route('/logout')
def logout():
    session.pop('user_id', None)
    return redirect(url_for('welcome.index'))

@welcome.route('/register')
def register():
    error = None
    return "HI"

person element119    schedule 10.02.2013    source источник


Ответы (1)


Разделите свои методы, проверьте состояние регистрации, а затем вызовите правильную функцию (добавив параметры, которые вам нужны для каждого):

from ????? import app
from ????? import logged_in
import home.index
import welcome.index

@app.route('/')
def your_basic_index_view():
   if logged_in():
       return home.index()
   else:
       return welcome.index()

Или сделайте то же самое с декоратором. Вы не сможете использовать один маршрут, условно указывающий на два разных представления.

ИЗМЕНИТЬ:

Попробуйте следующее:

from flask import Flask, session, g

from modules.welcome import welcome
from modules.home import home as home

from modules.home import index as h_index
from modules.welcome import index as w_index

app = Flask(__name__)
app.config.from_pyfile('config.cfg')

app.register_blueprint(welcome)
app.register_blueprint(home)

@app.route('/', methods=['GET', 'POST'])
def index():
    if 'user_id' in session:
        return h_index()
    else:
        return w_index()
person planestepper    schedule 10.02.2013
comment
Спасибо, я смог (я думаю) импортировать функцию, используя from modules.home import index и т. д. Однако теперь я получаю 'Blueprint' object has no attribute 'index', хотя у меня есть индексная функция, определенная в обоих чертежах. - person element119; 10.02.2013
comment
Объявите эти функции голыми функциями — не украшайте их декоратором route. - person planestepper; 10.02.2013
comment
Я сделал их голыми функциями, я тоже попытался перезапустить приложение, и, похоже, оно выдает ту же ошибку. - person element119; 10.02.2013
comment
Я подозреваю, что в ваших чертежах есть много других методов и маршрутов. - person planestepper; 10.02.2013
comment
Да, это так. Я не уверен, как это может быть связано с ошибкой, но я обновил свой ответ полным кодом каждого файла чертежа. Я еще не писал никаких других методов, кроме index() для home, потому что я только начал писать приложение. - person element119; 10.02.2013
comment
Хорошо, я собираюсь попробовать вашу последнюю правку - отлично, это сработало! Большое спасибо за помощь мне. - person element119; 10.02.2013
comment
Было два импорта: один импорт приветствия, а другой импорт индекса (дважды). Что я сделал, так это специально извлек предполагаемую функцию из модуля и пропустил любую ссылку на модуль (поскольку они указывали на план, и поскольку они не регистрировались там, они были недоступны) - person planestepper; 11.02.2013