Flask-login current_user returns 唯一ID
Flask-login current_user returns only ID
我已经设法使 flask-login 正常工作,但是当我尝试使用时,例如在我的模板中使用 current_user.username
,该值是 None
我怀疑这与我的 User.get() 函数有关,但我无法终生理解我需要做什么才能访问当前用户 username
或 email
等等。
所以问题是,为什么我的其他 current_user 属性(如 username
)没有填充?
models.py
注意get函数
from sqlalchemy import Column, Integer, String
from flask_login import UserMixin
from database import Base
class User(Base, UserMixin):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
username = Column(String(80), unique=True)
password = Column(String(80))
email = Column(String(120), unique=True)
def __init__(self, id):
self.id = id
def __repr__(self):
return '<User %r>' % self.username
@classmethod
def get(cls, id):
"""Return user instance of id, return None if not exist"""
try:
return cls(id)
except UserWarning:
return None
views.py
注意 load_user,我相信 flask 文档希望它存在并且将 ID 作为输入
import flask
from flask_login import login_user, logout_user, login_required
from reportr import app, login_manager
from models import User
from forms import UploadForm, LoginForm
from database import init_session
@login_manager.user_loader
def load_user(id):
return User.get(id)
@app.route('/', methods=('GET', 'POST'))
def index():
return flask.render_template('index.html')
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
del form.email # Don't want the email address on the form
if form.validate_on_submit():
session = init_session()
user = session.query(User).filter(User.username == flask.request.form['username']).first()
if user and user.password == flask.request.form['password']:
login_user(user)
flask.flash('Logged in successfully.', 'info')
else:
flask.flash('Username or password incorrect.', 'error')
return flask.redirect(flask.url_for('login'))
return flask.redirect(flask.url_for('index'))
return flask.render_template('login.html', form=form)
@app.route('/logout')
def logout():
logout_user()
return flask.redirect(flask.url_for('index'))
@app.route('/upload/results', methods=('GET', 'POST'))
def upload_results():
form = UploadForm()
if not form.validate_on_submit():
flask.flash('Please fill out all required fields', 'error')
return flask.render_template('upload_results.html', form=form)
@app.route("/settings")
@login_required
def settings():
pass
templates/nav-bar.html
这里我使用的是current_user.id,这很有效。
{% block navbar %}
<nav class="navbar navbar-default" role="navigation">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="{{ url_for('.index') }}"><span class="glyphicon-play" aria-hidden="true"></span>Reportr!</a>
</div>
<div class="navbar-collapse collapse click-nav">
<ul class="nav navbar-nav no-js">
<li class="dropdown">
<a id='browse_menu' href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">Browse <span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li>
<a id='browse_by_project' href="#">By Project</a>
</li>
</ul>
<li class="dropdown">
<a id='upload_menu' href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">Upload <span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li>
<a id='upload_test_results' href="{{ url_for('.upload_results') }}">Test Results</a>
</li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav navbar-right">
{% if current_user.is_authenticated() %}
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">{{ current_user.id }} <span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li><a href="{{ url_for('.settings') }}">Settings</a></li>
<li class="divider"></li>
<li><a href="{{ url_for('.logout') }}">Logout</a></li>
</ul>
</li>
{% else %}
<li>
<a id='login' href="{{ url_for('.login') }}">Login</a>
</li>
{% endif %}
</ul>
</div>
</div>
</nav>
{% endblock %}
我找到了问题的根源。
我的 load_user()
函数不是 return 用户,而是用户 class 的一个实例,只填充了 id
。
我更改了我的 load_user 函数来查询 table 和 return 用户的一个实例,而不是 class,现在它正在工作。
见下文:
@login_manager.user_loader
def load_user(user_id):
try:
return User.query.get(user_id)
except:
return None
我还删除了我模型上的 get()
函数,因为它不需要而且简单得多。
我已经设法使 flask-login 正常工作,但是当我尝试使用时,例如在我的模板中使用 current_user.username
,该值是 None
我怀疑这与我的 User.get() 函数有关,但我无法终生理解我需要做什么才能访问当前用户 username
或 email
等等。
所以问题是,为什么我的其他 current_user 属性(如 username
)没有填充?
models.py
注意get函数
from sqlalchemy import Column, Integer, String
from flask_login import UserMixin
from database import Base
class User(Base, UserMixin):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
username = Column(String(80), unique=True)
password = Column(String(80))
email = Column(String(120), unique=True)
def __init__(self, id):
self.id = id
def __repr__(self):
return '<User %r>' % self.username
@classmethod
def get(cls, id):
"""Return user instance of id, return None if not exist"""
try:
return cls(id)
except UserWarning:
return None
views.py
注意 load_user,我相信 flask 文档希望它存在并且将 ID 作为输入
import flask
from flask_login import login_user, logout_user, login_required
from reportr import app, login_manager
from models import User
from forms import UploadForm, LoginForm
from database import init_session
@login_manager.user_loader
def load_user(id):
return User.get(id)
@app.route('/', methods=('GET', 'POST'))
def index():
return flask.render_template('index.html')
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
del form.email # Don't want the email address on the form
if form.validate_on_submit():
session = init_session()
user = session.query(User).filter(User.username == flask.request.form['username']).first()
if user and user.password == flask.request.form['password']:
login_user(user)
flask.flash('Logged in successfully.', 'info')
else:
flask.flash('Username or password incorrect.', 'error')
return flask.redirect(flask.url_for('login'))
return flask.redirect(flask.url_for('index'))
return flask.render_template('login.html', form=form)
@app.route('/logout')
def logout():
logout_user()
return flask.redirect(flask.url_for('index'))
@app.route('/upload/results', methods=('GET', 'POST'))
def upload_results():
form = UploadForm()
if not form.validate_on_submit():
flask.flash('Please fill out all required fields', 'error')
return flask.render_template('upload_results.html', form=form)
@app.route("/settings")
@login_required
def settings():
pass
templates/nav-bar.html
这里我使用的是current_user.id,这很有效。
{% block navbar %}
<nav class="navbar navbar-default" role="navigation">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="{{ url_for('.index') }}"><span class="glyphicon-play" aria-hidden="true"></span>Reportr!</a>
</div>
<div class="navbar-collapse collapse click-nav">
<ul class="nav navbar-nav no-js">
<li class="dropdown">
<a id='browse_menu' href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">Browse <span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li>
<a id='browse_by_project' href="#">By Project</a>
</li>
</ul>
<li class="dropdown">
<a id='upload_menu' href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">Upload <span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li>
<a id='upload_test_results' href="{{ url_for('.upload_results') }}">Test Results</a>
</li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav navbar-right">
{% if current_user.is_authenticated() %}
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">{{ current_user.id }} <span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li><a href="{{ url_for('.settings') }}">Settings</a></li>
<li class="divider"></li>
<li><a href="{{ url_for('.logout') }}">Logout</a></li>
</ul>
</li>
{% else %}
<li>
<a id='login' href="{{ url_for('.login') }}">Login</a>
</li>
{% endif %}
</ul>
</div>
</div>
</nav>
{% endblock %}
我找到了问题的根源。
我的 load_user()
函数不是 return 用户,而是用户 class 的一个实例,只填充了 id
。
我更改了我的 load_user 函数来查询 table 和 return 用户的一个实例,而不是 class,现在它正在工作。
见下文:
@login_manager.user_loader
def load_user(user_id):
try:
return User.query.get(user_id)
except:
return None
我还删除了我模型上的 get()
函数,因为它不需要而且简单得多。