登录 获取用户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)

原文地址:https://www.cnblogs.com/kaibindirver/p/12945501.html