python - flask-login中的current_user.username没有数据的问题
问题描述
采用flask写一个登陆页面,代码如下:
# -*- coding:utf-8 -*-from flask import Flask,render_template,session,redirect,url_for,flash,requestfrom flask_login import LoginManager,login_required,UserMixin,login_user,logout_userfrom flask_bootstrap import Bootstrapfrom flask_sqlalchemy import SQLAlchemyfrom flask_wtf.file import FileFieldfrom flask_wtf import Formfrom wtforms import StringField,PasswordField,SubmitField,BooleanFieldfrom wtforms.validators import Requiredfrom werkzeug.security import generate_password_hash,check_password_hashimport pymssqlapp = Flask(__name__)app.config[’SQLALCHEMY_DATABASE_URI’] = ’mysql://root:password@localhost:3306/dh_inf_manage’app.config[’SQLALCHEMY_COMMIT_ON_TEARDOWN’] = Trueapp.config[’SQLALCHEMY_TRACK_MODIFICATIONS’] = Falseapp.config[’SECRET_KEY’] = ’hard to guess string’login_manager = LoginManager()login_manager.session_protection = ’strong’login_manager.login_view = ’login’login_manager.init_app(app)db=SQLAlchemy(app)bootstrap = Bootstrap()bootstrap.init_app(app)class NameForm(Form): name = StringField(u’用户名:’,validators = [Required()]) password = PasswordField(u’密码:’) submit = SubmitField(’Log In’) class LoginForm(Form): name = StringField(u’用户名:’,validators = [Required()]) password = PasswordField(u’密码’,validators = [Required()]) submit = SubmitField(u’登陆’) class User(UserMixin,db.Model): __tablename__ = ’dic_user’emp_sn = db.Column(db.String(50),primary_key = True) name = db.Column(db.String(45)) password = db.Column(db.String(128)) emp_dept_sn = db.Column(db.String(45),db.ForeignKey(’dic_dept.dept_sn’)) py_code = db.Column(db.String(50)) wb_code = db.Column(db.String(50)) autograph = db.Column(db.LargeBinary)def verify_password(self, password):return check_password_hash(self.password, password)@property def password_hash(self):raise AttributeError(’password is not a readable attribute’)@password_hash.setter def password_hash(self, password):self.password = generate_password_hash(password) def get_id(self):return unicode(self.emp_sn) def __repr__(self):return ’<User %r>’ % self.name@login_manager.user_loaderdef load_user(user_id): return User.query.get(int(user_id)) @app.route (’/’,methods=[’GET’,’POST’])def index(): return render_template(’index.html’)@app.route(’/login’, methods=[’GET’, ’POST’])def login(): form = LoginForm() if form.validate_on_submit():user = User.query.filter_by(emp_sn = form.name.data).first()if user is not None and user.verify_password(form.password.data): login_user(user) return redirect(url_for(’index’))flash (u’用户名或密码不正确’) return render_template(’login.html’,form = form)@app.route(’/logout’)@login_requireddef logout(): logout_user() flash(u’你已经注销!’) return redirect(url_for(’index’)) @app.errorhandler(404)def page_not_found(e): return render_template(’404.html’),404@app.errorhandler(500)def internal_server_error(e): return render_template(’500.html’),500if __name__ == ’__main__’: app.run(host = ’192.168.199.203’,port = 8035,debug = True)
index.html代码:
{% extends 'base.html' %}{% block title %}Flasky{% endblock %}{% block page_content %}<p class='page-header'> <h1>Hello, {% if current_user.is_authenticated %}{{ current_user.username }}{% else %}Stranger{% endif %}!</h1></p>{% endblock %}
现在问题是点击登陆后,index页面没有显示用户名称。如下图所见:
感觉好像login_user没有获取到用户一样
问题解答
回答1:呃,你仔细看看吧,你的model里面的是name,而你的模板里面用的是username:
class User(UserMixin,db.Model): __tablename__ = ’dic_user’emp_sn = db.Column(db.String(50),primary_key = True)name = db.Column(db.String(45)) //你这里是namepassword = db.Column(db.String(128)) emp_dept_sn = db.Column(db.String(45),db.ForeignKey(’dic_dept.dept_sn’)) py_code = db.Column(db.String(50)) wb_code = db.Column(db.String(50)) autograph = db.Column(db.LargeBinary)
在你的模板里面你用的是username:
{% extends 'base.html' %}{% block title %}Flasky{% endblock %}{% block page_content %}<p class='page-header'> {# 这下面应该改成current.name #} <h1>Hello, {% if current_user.is_authenticated %}{{ current_user.username }}{% else %}Stranger{% endif %}!</h1></p>{% endblock %}回答2:
应该是User.name 和current_user.username 名字不一致所致!
class User(UserMixin,db.Model): __tablename__ = ’dic_user’emp_sn = db.Column(db.String(50),primary_key = True) name = db.Column(db.String(45)) password = db.Column(db.String(128)) emp_dept_sn = db.Column(db.String(45),db.ForeignKey(’dic_dept.dept_sn’)) py_code = db.Column(db.String(50)) wb_code = db.Column(db.String(50)) autograph = db.Column(db.LargeBi<p class='page-header'> <h1>Hello, {% if current_user.is_authenticated %}{{ current_user.username }}{% else %}Stranger{% endif %}!</h1></p>nary
相关文章:
1. TP5.1教程第十章三小节的用户注册章节,不能显示bootstrap的菜单下拉,也不能script验2. 怎样使留言的数据与登录的用户名,密码保持一致(在数据库上是一行的)。3. html - css气泡,实现“倒三角(不知道算不算三角了)”可透明的。4. angular.js - vue or angular.2 or react5. win10 Apache24+PHP8.0,Apache不能正常加载php.ini。6. 前端 - 访问Apache文档目录下的HTML文件变成了下载该页面?7. 如何通过Java编码生成Jmeter仪表板报告(不是Windows或Shell命令)8. css - sudo gem install jekyII 出现错误9. PHP中的$this代表当前的类还是方法?10. javascript - 关于clone vue2.0项目,运行不了的问题
