1

ログインしていないモジュール/ブループリントwelcomeと、ログインしているブループリント がありhomeます。有効なセッションを持つユーザーが に移動しhome.index、ゲストであるユーザーが に移動するようにしwelcome.indexます。ただし、これらの関数は両方とも同じ URL にルーティングされるため、問題が発生しています/

この機能を有効にするにはどうすればよいですか? 私は追加しようとしました:

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

index()の URLhome.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: ブループリント コード

modules/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')

modules/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"
4

1 に答える 1

3

メソッドを分割し、ログに記録されたステータスをテストしてから、適切な関数を呼び出します (それぞれに必要なパラメーターを追加します)。

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()

または、デコレータで同じことを行います。条件付きで 2 つの異なるビューを指す単一のルートを使用することはできません。

編集:

次のことを試してください。

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()
于 2013-02-10T03:38:26.303 に答える