我解决了。对于正在阅读本文的其他人,这是我的解决方案:
首先你需要导入flask_login并且你必须安装它,你可以通过pip install flask_login来做。
然后,在你的 python 文件中,你需要导入这些:
from flask_login import UserMixin, login_user, LoginManager, login_required, logout_user, current_user
之后,创建您的app 并配置您的flask_login:
app= Flask(__name__)
db = SQLAlchemy(app) # this is my database file, if you've already created it than you can leave it out
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login' # REPLACE login WITH YOUR LOGIN ROUTE, BUT DO NOT INCLUDE A SLASH (/) AND MUST BE IN QUOTES
login_manager.login_message = "You must be logged-in in order to view this page." # OPTIONAL: A CUSTOM FLASH MESSAGE THAT WILL BE SHOWN WHEN A SIGNED-OUT USER TRIES TO ACCESS PAGES THAT REQUIRE A LOGIN. YOU CAN DELETE IT IF YOU WANT THE DEFAULT MESSAGE
@login_manager.user_loader
def user(id):
return Clients.query.get(int(id)) # REPLACE Clients WITH YOUR USER CLASS THAT IS USED TO AUTHENTICATE (NORMALLY IT INHERITS A DATABASE MODEL AND USERMIXIN)
最后,滚动到要限制的函数并应用@login_required 装饰器(从flask_login 导入),它必须在@app.route() 之后
@app.route('/exclusive_page_for_logged_in_users')
@login_required
def exclusive_page():
return render_template('exclusive_page.html')
回答我原来的问题:
@build.route('/')
def index():
if current_user.is_authenticated:
return render_template("index.html")
else:
return render_template("authenticate.html")
您可以看到条件current_user.is_authenticated。不要替换任何东西,因为这就是它的本意。该条件检查用户是否登录,如果您未登录,它将加载authenticate.html 而不是index.html,同时保持相同的路线;因此您看不到 @login_required 装饰器。
现在,您如何登录?您可以使用login_user(YOUR_USER_INFO_FROM_DB)
这很简单,但你需要一个数据库来做到这一点。你可以在你的数据库中搜索信息来验证它们,这里我就不一一列举了。
pw_check_validation = Clients.query.filter_by(auth_name=auth_name).first()
login_user(pw_check_validation)
flash(f"Login successful.")
return redirect(url_for("index"))
要注销,一个简单的logout_user() 就可以了。
# My code for log out
@build.route("/end_session/?db_ID=<int:id>")
@login_required
def logout(id):
logout_user()
flash("You have been logged out.")
return redirect(url_for('authenticate'))
希望对遇到同样问题的人有所帮助!