热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

用户登入登出需要用到Flask-Login插件初始化修改配置文件app__init__.pyfromflaskimpor
用户登入登出需要用到 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 True

def is_active(self):
return True

def is_anonymous(self):
return False

def get_id(self):
try:
return unicode(self.id) # python 2
except NameError:
return str(self.id) # python 3

def __repr__(self):
return '' % (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 '' % (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.user
posts=[
{'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


{% if title %}

{% else %}

{% endif %}


MyBlog:Home
{% if g.user.is_authenticated %}
|Logout
{% endif %}



{% with messages=get_flashed_messages() %}
{% if messages %}

    {% for message in messages %}
  • {{message}}

  • {% endfor %}

{% endif %}
{% endwith %}
{% block content %}
{% endblock%}



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

修改 app/templates/login.html
{% extends "base.html" %}
{% block content %}

Sign In



{{form.hidden_tag()}}


Please enter your OpenID, or select one of the providers below:

{{form.openid(size=80)}}
{{error}}



{{form.remember_me}} Remember Me




{% endblock %}



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


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


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


登出后跳转到登入界面

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


推荐阅读
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • 本文提供了关于数据库设计的建议和注意事项,包括字段类型选择、命名规则、日期的加入、索引的使用、主键的选择、NULL处理、网络带宽消耗的减少、事务粒度的控制等方面的建议。同时还介绍了使用Window Functions进行数据处理的方法。通过遵循这些建议,可以提高数据库的性能和可维护性。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 本文介绍了在使用Laravel和sqlsrv连接到SQL Server 2016时,如何在插入查询中使用输出子句,并返回所需的值。同时讨论了使用CreatedOn字段返回最近创建的行的解决方法以及使用Eloquent模型创建后,值正确插入数据库但没有返回uniqueidentifier字段的问题。最后给出了一个示例代码。 ... [详细]
  • 如何更改电脑系统的自动校时服务器地址?
    本文介绍了如何通过注册表编辑器更改电脑系统的自动校时服务器地址。通过修改注册表中的数值数据或新建字符串数值的方式,可以将默认的时钟同步服务器地址更改为自己所需要的域名或IP地址。详细步骤包括双击时间区域,点击internet时间,勾选自动校正域名设置定时等操作。 ... [详细]
author-avatar
恨透这一切_249
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有