登录 \获取用户id
from flask_login import LoginManager
login_manager=LoginManager()
def create_app():
app = Flask(__name__)
app.config.from_object("setting")
app.config.from_object("secure")
app.config['JSON_AS_ASCII'] = False
#登录插件
login_manager.init_app(app)
login_manager.login_view='web.login' #访问要cookie的url 没有登陆态度要重定向的视图,下面闪现的信息会出现在这个登录页面上
login_manager.login_message='请先登录或注册' # 没有身份态访问 提示信息设置 原理,当访问没有权限访问的页面,flask会自动闪现一条文本提示
return app
数据库模型
#coding=utf-8
from sqlalchemy import Column,Integer,String,Boolean,Float
from models.base import db
from werkzeug.security import generate_password_hash,check_password_hash
from models.base import Base
from flask_login import UserMixin
from app import login_manager
#book模型,传入db核心对象把Book插入db
class User(UserMixin,Base): #UserMixin这个类是flask_login里面需要定义的东西,导入后就执行是默认定义
__tablename__ = 'user'
id = Column(Integer,primary_key=True)
nickname = Column(String(24), nullable=False)
email = Column(String(50), unique=True, nullable=False)
@property
def password(self):
return self._password
@password.setter
def password(self,raw):
self._password=generate_password_hash(raw)
def check_password(self,raw):
return check_password_hash(self._password,raw)
# # 定义用户唯一标示id如果id不是用户唯一标示,这里需要更改,如果id是,那么不需要写
#def get_id(self):
# return self.id
@login_manager.user_loader #不加这个会写入cookie异常,注意他是一个独立的函数
def get_user(uid):
return User.query.get(int(uid))
视图
from flask_login import login_user
@web.route('/login', methods=['GET', 'POST'])
def login():
form=LoginForm(request.form)
if request.method =="POST" and form.validate():
user= User.query.filter_by(email=form.email.data).first()
if user and user.check_password(form.password.data):
login_user(user,remember=True) #remember为登录态是否要记住,关闭浏览器后还记住为Ture,记住的时间可以在falsk配置文件中设置 默认为365天
flash("登录成功")
else:
flash("账号不存在或密码错误")
return render_template("auth/login.html",form=form)
更改登录态记住的时长,在flask配置文件里面增加一个值去设置
让视图函数 没有登录态不能访问的方法 加上插件的装饰器
from flask_login import login_required
@web.route('/my/gifts')
@login_required
def my_gifts():
return "访问成功"
当访问了没有权限的页面,跳转到登录页面后,用户登录后跳转回原来页面的方法:
访问没有权限的页面跳转到登录页面 url 自动带上原来访问的uri http://000:5000/login?next=/mygift 我们获取next后面的uri进行跳转
@web.route('/login', methods=['GET', 'POST'])
def login():
form=LoginForm(request.form)
if request.method =="POST" and form.validate():
user= User.query.filter_by(email=form.email.data).first()
if user or user.check_password(form.password.data):
login_user(user)
flash("登录成功")
next=request.args.get('next')
if not next and not next.startswith("/"): #这里加个逻辑uri要/开头的,防止重定向攻击 如别人在后面输出http://baidu.com 别人登录后就跳百度去了
next=url_for("web.index")
return redirect(next)
else:
flash("账号不存在或密码错误")
return render_template("auth/login.html",form=form)
用户登出
from flask_login import logout_user
@web.route('/logout')
def logout():
logout_user() #删除cookie
return redirect(url_for("web.index"))
获取当前访问用户的id 写入数据库的方法:
from flask_login import login_required,current_user
from flask import current_app
from app.models.gift import Gift
from models.base import db
@web.route('/gifts/book/<isbn>')
@login_required
def save_to_gifts(isbn):
gift = Gift()
gift.isbn=isbn
#获取当前用户的id
gift.uid=current_user.id #current_user 实际就是 User表的类
#获取配置文件 BEANS_UPLOAD_ONE_BOOK 数值的方法 参考:https://www.cnblogs.com/kaibindirver/p/12643665.html
current_user.beans += current_app.config["BEANS_UPLOAD_ONE_BOOK"] #获取当前这个用户 user表里面的鱼豆 beans,这里去配置文件获取 鱼豆默认变量 2
db.session.add(gift)
db.session.commit()
return "完成"
判断用户是否登录
if current_user.is_authenticated: #登录了返回ture
注册视图
@web.route('/register', methods=['GET', 'POST'])
def register():
form=RegisterForm(request.form)
if request.method =="POST" and form.validate():
user=User()
user.set_attrs(form.data)
db.session.add(user)
db.session.commit()
return redirect(url_for("web.login"))
return render_template("auth/register.html",form=form)