您的位置:首页 > 编程语言 > Python开发

Python Flask学习_使用flask-login实现认证蓝本 (三)

2018-06-29 19:19 411 查看

点击打开链接中讲了登录页面的实现。

这篇主要讲实现登录登出的路由和视图函数。

一个登录的URL,可以向服务器发出两种请求,一种是没有表单内容的GET请求,一种是附有 表单内容的POST请求。

因此,登录页面的视图函数也应当分成GET和POST两种情况,分别返回不同的页面 。

一、登入用户

# app/auth/views.py

from flask import render_template,redirect,request,url_for,flash
from flask_login import login_user,logout_user
from . import auth
from ..models import User
from .forms import LoginForm

@auth.route('/login',methods=['GET','POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
user=User.query.filter_by(email=form.email.data).first()
if user is not None and user.verify_password(form.password.data):
login_user(user,form.remember_me.data)
return redirect(request.args.get('next') or url_for('main.index'))
flash('Invalid username or password')
return render_template('auth/login.html',form=form)

auth是BluePrint类的实例。因此,路由装饰器前应当加上"auth."

form是LoginForm类的实例。

分为两种情况:

(1)如果有表单内容提交,即POST请求。

form.validate_on_submit()会返回True。并且form的各属性会有值。

User.query.filter_by(email=form.email.data):查询数据库User表有没有对应的email=form.email.data的,如果有则返回其实例,如果没有则返回None。

if user is not None and user.verify_password(form.password.data):user不为None(数据库有记录),同时调用密码验证正确。

login_user(user,form.remember_me.data):调用Flask-Login的login_user()函数,把用户标记为已登录。如果第二个参数(form.remember_me.data)为True,那么会在用户浏览器中写入一个长期有效的cookies,关闭浏览器再打开也是登录状态;为False,则直接关闭浏览器用户会话就过期,再访问需要重新登录。

return redirect(request.args.get('next') or url_for('main.index')):未登录状态下的用户访问未授权(需要登录)的URL,会显示登录表单,Flask-Login会把目标URL暂时存在request.args的'next'中,此时就重定向到目标URL中。如果'next'为None则 重定向到首页。

(2)没有 表单内容提交,即GET请求

form.validate_on_submit()会返回False。

return render_template('auth/login.html',form=form):form此时并没有赋值,通过没有赋值的form渲染模板。

二、登出用户

# app/auth/views.py

from flask_login import login_user,logout_user
from . import auth

@auth.route('/logout')
def logout():
logout_user()
flash('You have been logged out')                                       #flask消息
return redirect(url_for('main.index'))                                   #重定向至main.index

调用Flask-Login中的logout_user()函数,则直接登出。

flash('You have been logged out')   :显示一条flash消息










阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: