Flask中mongodb实现flask_login保持登录

最近在学习Flask,使用flask-login时,一直无法完成保持登录的状态,网上的例子都是使用SQLAlchemy,但是我用的是mongodb。

网上的例子使用SQLAlchemy时,定义User类时是这么写的:

class User(UserMixin,db.Model):
    __tablename__ = ‘users‘
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True, index=True)
    role_id = db.Column(db.Integer, db.ForeignKey(‘roles.id‘))

    def __repr__(self):
        return ‘<User %r>‘ % self.username

然后在登陆时用如下语句进行匹配查询:

       user = User.query.filter_by(username=form.name.data).first()

我设置了下断点,发现这个语句返回的是这样的:

从图上能看出来这个语句将整个User类返回了

而我的定义是这样的:

class User():
    def __init__(self, username, email, password):
        self.username = username
        self.email = email
        self.password_hash = self.set_password(password)
        self.db = MongoClient().blog.User

    def new_user(self):
        collection = {
            ‘name‘: self.username,
            ‘email‘: self.email,
            ‘password‘: self.password_hash
        }
        self.db.insert(collection)

    @property
    def password(self, password):
        raise AttributeError(‘password is not a readable attribute‘)

    def set_password(self, password):
        return generate_password_hash(password)

查找匹配语句:

        user = MongoClient().blog.User.find_one({‘email‘: form.email.data})

返回的是一个json格式文档:

那么flask-login是怎么实现在不同页面保持登录的呢?

 Hello,{% if current_user.is_authenticated %}
 {{ current_user.name }}

flask-login是通过load_user将一个帐号导入,然后再通过is_active和is_anonymous等验证显示。

我们必须在mongodb返回的信息中添加这几个bool值,才能完成验证操作。

我的解决方案是另建一个新类,从mongodb查找并导出信息,然后重新创建一个新的类,然后将新创建的类传给load_user。

class temp(UserMixin):
    is_active = True
    is_anonymous = False
    is_authenticated = True

    def __init__(self, id, username, email, password):
        self.id = str(id)
        self.name = username
        self.email = email
        self.password_hash = password

    def get_id(self):
        return self.id

    def __repr__(self):
        return self.username
@login_manager.user_loader
def load_user(user_id):
    user = MongoClient().blog.User.find_one({‘_id‘: ObjectId(user_id)})
    return temp(id=user.get(‘_id‘), username=user.get(‘name‘), email=user.get(‘email‘),
                password=user.get(‘password‘))
时间: 2024-08-27 08:36:25

Flask中mongodb实现flask_login保持登录的相关文章

Python中使用Flask、MongoDB搭建简易图片服务器

1.前期准备 通过 pip 或 easy_install 安装了 pymongo 之后, 就能通过 Python 调教 mongodb 了.接着安装个 flask 用来当 web 服务器. 当然 mongo 也是得安装的. 对于 Ubuntu 用户, 特别是使用 Server 12.04 的同学, 安装最新版要略费些周折, 具体说是 ? 1 2 3 4 sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB

flask中的endpoint、自定义转化器、与djnago中session区别、利用装饰器实现登录认证

flask路由中的endpoint 与自定义转化器 ''' endpoint主要用于 反向解析, 例如:login函数中配的路由是/login,其中endpoint='lg' 则在其他函数,可以用 url=url_for('lg'),redirect(url)直接访问login函数 ''' ''' 自定义转化器,可以用来动态更新url_for 的跳转路由 其中 to_python主要是给后端的,可以对路由参数做修改 to_url是给前端url的,可以更新指定的url ''' flask与djan

Flask中session实现原理

前言 flask_session是flask框架实现session功能的一个插件,用来替代flask自带的session实现机制,flask默认的session信息保存在cookie中,不够安全和灵活. flask的session机制 session是用来干什么的呢?由于http协议是一个无状态的协议,也就是说同一个用户第一次请求和第二次请求是完全没有关系的,但是现在的网站基本上有登录使用的功能,这就要求必须实现有状态,而session机制实现的就是这个功能. 实现的原理: 用户第一次请求后,将

Flask中使用mysql

Flask中使用mysql 先安装相关模块: pip  install  Flask-MySQL 先准备一下数据库 登录: mysql  -u  root  -p 创建Database和创建Table mysql> CREATE DATABASE EmpData; mysql> use EmpData; mysql> CREATE TABLE User( userId INT NOT NULL AUTO_INCREMENT, userName VARCHAR(100) NOT NULL,

flask中的wtforms使用

一.简单介绍flask中的wtforms WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证. 安装: pip3 install wtforms 二.简单使用wtforms组件 1.用户登录 具体代码: from flask import Flask,render_template,request,redirect from wtforms.fields import core from wtforms.fields import html5 from wtfo

用flask开发个人博客(4)—— flask中4种全局变量

https://blog.csdn.net/hyman_c/article/details/53512109 一  current_app current_app代表当前的flask程序实例,使用时需要flask的程序上下文激活,我们以本专栏第一篇文章中写的test.py为例介绍下它的用法: 1.1 激活程序上下文 [python] view plain copy >>> from test import app >>> from flask import curren

Python框架学习之Flask中的常用扩展包

Flask框架是一个扩展性非常强的框架,所以导致它有非常多的扩展包.这些扩展包的功能都很强大.本节主要汇总一些常用的扩展包. 一. Flask-Script pip install flask-script 作用: 1. 可以让我们通过命令行的方式启动服务器,还可以手动指定参数,如ip,port. python hello.py runserver -h 127.0.0.1 -p 6666 2. 结合Flask-Migration扩展包可以实现对数据的迁移 二. Flask-WTF 作用是为了能

flask 中的常用组件的使用 ,virtualenv组件和 pipreqs组件

一  . flask 中连接的数据库的组件 DButils #!/usr/bin/env python # -*- coding:utf-8 -*- import pymysql from DBUtils.PooledDB import PooledDB, SharedDBConnection POOL = PooledDB( creator=pymysql, # 使用链接数据库的模块 maxconnections=20, # 连接池允许的最大连接数,0和None表示不限制连接数 mincach

Flask中的session详细用法教程

**Flask session 概念解释:** session 是基于cookie实现, 保存在服务端的键值对(形式为 {随机字符串:'xxxxxx'}), 同时在浏览器中的cookie中也对应一相同的随机字符串,用来再次请求的 时候验证: 注意 :Flask中的session是存在浏览器中  默认key是session(加密的cookie), 也可以像Django一样基于上述的方式实现保存在数据库 一.配置SECRET_KEY 因为flask的session是通过加密之后放到了cookie中.