flask笔记:6:用户登入登出

2024-08-27 05:48

本文主要是介绍flask笔记:6:用户登入登出,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

用户登入登出需要用到 Flask-Login 插件

初始化
修改配置文件 app/__init__.py
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
import os
from flask.ext.login import LoginManager
app=Flask(__name__)
app.config.from_object('config')
db=SQLAlchemy(app)
lm = LoginManager()
lm.init_app(app)
lm.login_view = 'login'
from app import views,models
#导入login模块
#flask-lonin需要一个LoginManager( )实例
#init_app(应用名)配置到应用中
#login_view 那个视图允许登入



重构用户模型
修改模型 app/models.py
from app import db
class User(db.Model):id = db.Column(db.Integer, primary_key=True)nickname = db.Column(db.String(64), index=True, unique=True)email = db.Column(db.String(120), index=True, unique=True)posts = db.relationship('Post', backref='author', lazy='dynamic')def is_authenticated (self):return Truedef is_active(self):return Truedef is_anonymous(self):return Falsedef get_id(self):try:return unicode(self.id)  # python 2except NameError:return str(self.id)  # python 3def __repr__(self):return '<User %r>' % (self.nickname)   class Post(db.Model):id = db.Column(db.Integer, primary_key = True)body = db.Column(db.String(140))timestamp = db.Column(db.DateTime)user_id = db.Column(db.Integer, db.ForeignKey('user.id'))def __repr__(self):return '<Post %r>' % (self.body)
# is_authenticated 允许用户验证,只返回True
# is_active 有效账户都返回True,除非禁止账户
# is_anonymous 伪造用户之外都是True
# get_id 返回用户唯一标识符,以unicode格式


登入登出视图
修改视图 app/views.py
from flask import render_template, flash, redirect, session, url_for, request, g
from flask.ext.login import login_user, logout_user, current_user, login_required
from app import app, db, lm, models
from forms import LoginForm
from models import User@lm.user_loader
def load_user(id):return User.query.get(int(id))@app.before_request
def before_request():g.user = current_user@app.route('/')
@app.route('/index')
@login_required
def index ():user=g.userposts=[{'author':{'nickname':'John'},'body':'Beautiful day in Portland!'},{'author':{'nickname':'Susan'},'body':'The Avengers movie was so cool!'}]return render_template("index.html",title="Home",user=user,posts=posts)@app.route('/login', methods = ['GET', 'POST'])
def login():if g.user is not None and g.user.is_authenticated:return redirect(url_for('index'))form = LoginForm()if form.validate_on_submit():if models.User.query.filter_by(nickname=form.openid.data).first():user = User.query.filter_by(nickname=form.openid.data).first_or_404()login_user(user)return redirect(url_for('index'))else:return render_template('login.html',title = 'Sign In',error='[NO]',form = form)return render_template('login.html',title = 'Sign In',form = form)@app.route('/logout')
@login_required
def logout():logout_user()return redirect(url_for('index'))# @user_loader回调, 这个回调从会话中存储的用户 ID 重新加载用户对象, 它应该接受一个用户的 unicodeID 作为参数,并且返回相应的用户对象。 如果 ID 无效的话,它应该返回None (而不是抛出异常)。(在这种情况下,ID 会被手动从会话中移除且处理会继续)
# load_user( )用来返回用户唯一标识# before_request( )用来储存一个标志,判断用户是否登入
# current_user 获取当前登陆用户信息
# 被 @before_request 绑定的函数会在请求收到时执行( 网上说会在请求收到前执行,不太明白)
# g保存的是当前请求的全局变量,不同的请求会有不同的全局变量#用户登入登出视图用@login_required, 有些地方(比如修改密码)方法上需要加上fresh_login_required而不是login_required,两者的区别在于前者必须是用户手动登陆,后者还包含了cookie自动登陆的情况,@login_required还用来确保只有登入用户可见# if g.user is not None and g.user.is_authenticated( ): 的判断用户是否登入,是否允许登入
# if models.User.query.filter_by(nickname=form.openid.data).first( ):判断输入与数据库里是否一致
#User.query.filter_by(nickname=form.openid.data).first_or_404( )如果输入与数据库不一致,请求返回404
#login_user( )是将用户登入(个人理解)#logout_user( )用户登出,并清除cookie
#redirect(url_for('视图处理函数名'))跳转页面



修改模板 app/templates/base.html
<html><head>{% if title %}<title>{{title}} - myblog</title>{% else %}<title>Welcome - myblog</title>{% endif %}</head><body><div>MyBlog:<a href="{{url_for('index')}}">Home</a>{% if g.user.is_authenticated %}|<a href="{{url_for('logout')}}">Logout</a>{% endif %}</div><hr>{% with messages=get_flashed_messages() %}{% if messages %}<ul>{% for message in messages %}<li>{{message}}</li>{% endfor %}</ul>{% endif %}{% endwith %}{% block content %}{% endblock%}</body>
</html>


#if g.user.is_authenticated 判断用户登入就显示登出链接

修改 app/templates/login.html
{% extends "base.html" %}
{% block content %}
<h1>Sign In</h1>
<form action="" method="post" name="login">{{form.hidden_tag()}}<p>Please enter your OpenID, or select one of the providers below:<br>{{form.openid(size=80)}}<span style="color: red;">{{error}}</span><br></p><p>{{form.remember_me}} Remember Me</p><p><input type="submit" value="Sign In"></p>
</form>
{% endblock %}



显示:
没有登入,index的URL会自动跳转到登入界面


输入数据库里没有的用户名会显示[NO]


登入成功会返回index页面,并显示出登出链接


登出后跳转到登入界面

#出现 Please log in to access this page. 可能是flask-login 自带一个flash,然后被get_flashed_messages( )这个函数捕捉到了( 猜的 )
#本来应该跳转到 index界面,只是index有 @login_required,只有登入用户可见,所以指向了登入界面

这篇关于flask笔记:6:用户登入登出的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1110812

相关文章

Python 安装和配置flask, flask_cors的图文教程

《Python安装和配置flask,flask_cors的图文教程》:本文主要介绍Python安装和配置flask,flask_cors的图文教程,本文通过图文并茂的形式给大家介绍的非常详细,... 目录一.python安装:二,配置环境变量,三:检查Python安装和环境变量,四:安装flask和flas

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth

mysql删除无用用户的方法实现

《mysql删除无用用户的方法实现》本文主要介绍了mysql删除无用用户的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 1、删除不用的账户(1) 查看当前已存在账户mysql> select user,host,pa

Flask 验证码自动生成的实现示例

《Flask验证码自动生成的实现示例》本文主要介绍了Flask验证码自动生成的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习... 目录生成图片以及结果处理验证码蓝图html页面展示想必验证码大家都有所了解,但是可以自己定义图片验证码

Flask解决指定端口无法生效问题

《Flask解决指定端口无法生效问题》文章讲述了在使用PyCharm开发Flask应用时,启动地址与手动指定的IP端口不一致的问题,通过修改PyCharm的运行配置,将Flask项目的运行模式从Fla... 目录android问题重现解决方案问题重现手动指定的IP端口是app.run(host='0.0.

Python结合Flask框架构建一个简易的远程控制系统

《Python结合Flask框架构建一个简易的远程控制系统》这篇文章主要为大家详细介绍了如何使用Python与Flask框架构建一个简易的远程控制系统,能够远程执行操作命令(如关机、重启、锁屏等),还... 目录1.概述2.功能使用系统命令执行实时屏幕监控3. BUG修复过程1. Authorization

TP-Link PDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务

《TP-LinkPDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务》近期,路由器制造巨头普联(TP-Link)在用户群体中引发了一系列重要变动,上个月,公司发出了一则通知,明确要求所... 路由器厂商普联(TP-Link)上个月发布公告要求所有用户必须完成实名认证后才能继续使用普联提供的 D

Oracle数据库如何切换登录用户(system和sys)

《Oracle数据库如何切换登录用户(system和sys)》文章介绍了如何使用SQL*Plus工具登录Oracle数据库的system用户,包括打开登录入口、输入用户名和口令、以及切换到sys用户的... 目录打开登录入口登录system用户总结打开登录入口win+R打开运行对话框,输php入:sqlp

数据库oracle用户密码过期查询及解决方案

《数据库oracle用户密码过期查询及解决方案》:本文主要介绍如何处理ORACLE数据库用户密码过期和修改密码期限的问题,包括创建用户、赋予权限、修改密码、解锁用户和设置密码期限,文中通过代码介绍... 目录前言一、创建用户、赋予权限、修改密码、解锁用户和设置期限二、查询用户密码期限和过期后的修改1.查询用