import functools

from flask import (Blueprint, flash, g, redirect, render_template, url_for, request, session)

from werkzeug.security import check_password_hash, generate_password_hash

from flaskr.db import get_db

bp = Blueprint('auth', name, url_prefix='/auth')

注册视图

@bp.route('/register', methods=('GET', 'POST'))

def register():

if request.method == 'POST':

# 获取用户提交的表单信息

username = request.form.get('username')

password = request.form.get('password')

# 连接数据库

db = get_db()

# 定义错误信息

error = None

# 逻辑判断

if not username:

error = 'Username is required.'

elif not password:

error = 'Password is required.'

# 查询用户名是否已经存在

elif db.execute(

'SELECT id FROM user WHERE username = ?',(username, )

).fetchone() is not None:

error = 'User {} is already registered'.format(username)

# 用户提交表单信息经过验证后执行, 向数据库中插入数据, 对密码进行加密

if error is None:

db.execute(

'INSERT INTO user (username, password) VALUES (?, ?)',

(username, generate_password_hash(password))

)

return redirect(url_for('auth.login'))

# 将错误信息flash到下一个呈现的模板内, 模板中使用 get_flashed_messages 方法

flash(error)

return render_template('auth/register.html')

登录视图

@bp.route('/login', methods=('GET', 'POST'))

def login():

if request.method == 'POST':

# 取出用户提交的form表单数据

username = request.form.get('username')

password = request.form.get('password')

print(username, password)

# 连接数据库

db = get_db()

# 定义错误信息

error = None

# 在数据库中查询用户(execute方法 防止SQL注入)

user = db.execute(

'SELECT * FROM user WHERE username = ?' ,(username, )

).fetchone()

print(user)

# 逻辑判断

if user is None:

error = 'Incorrect username.'

elif not check_password_hash(user['password'], password):

error = 'Incorrect password.'

if error is None:

session.clear()

session['user_id'] = user['id']

return redirect(url_for('index'))

# 将错误信息flash 到下一次呈现的模板中 (get_flashed_message 方法)

flash(error)

return render_template('auth/login.html')

在本次请求注册一个g.user对象 方便以后调用, 'g': 上下文中存储数据的一个对象

@bp.before_app_request

def load_logged_in_user():

user_id = session.get('user_id')

if user_id is None:
g.user = None
else:
g.user = get_db().execute(
'SELECT * FROM user WHERE id = ?', (user_id, )
).fetchone()

注销视图

@bp.route('/logout')

def logout():

session.clear()

return redirect(url_for('index'))

对是否登陆进行认证的装饰器

def login_required(view):

# 保留装饰器装饰的函数的原始名字

@functools.wraps(view)

def wrapped_view(**kwargs):

if g.user is None:

return redirect(url_for('auth.login'))

    return view(**kwargs)

return wrapped_view

Flask文件目录----- auth/blog 文件的更多相关文章

  1. flask控制上传文件的大小

    1.flask控制上传文件的大小的方案是全局控制:http://docs.jinkan.org/docs/flask/patterns/fileuploads.html from flask impo ...

  2. Flask文件目录----- __init__ 文件

    import os from flask import Flask def create_app(test_config=None): # 创建和设置app app = Flask(name, ins ...

  3. Flask文件目录----- db文件

    import sqlite3 import click from flask import current_app, g from flask.cli import with_appcontext d ...

  4. Flask Web 发送邮件单文件

    import os from flask import Flask, render_template, session, redirect, url_for from flask_script imp ...

  5. 多文件目录下makefile文件递归执行编译所有c文件

    首先说说本次嵌套执行makefile文件的目的:只需make根目录下的makefile文件,即可编译所有c文件,包括子目录下的. 意义:自动化编译行为,以后编译自己的c文件时可把这些makefile文 ...

  6. 【转】多文件目录下makefile文件递归执行编译所有c文件

    首先说说本次嵌套执行makefile文件的目的:只需make根目录下的makefile文件,即可编译所有c文件,包括子目录下的. 意义:自动化编译行为,以后编译自己的c文件时可把这些makefile文 ...

  7. flask 之(七) --- 认证|文件|部署

    登陆注册 说明: 令牌Token认证,在对HTTP形式的API发请求时,大部分情况我们不是通过用户名密码做验证,而是通过一个令牌[Token来做验证]. RESTful API无法使用Flask-Lo ...

  8. python2.7.13标准库文件目录操作与文件操作

    标准库的中文参考文档: http://python.usyiyi.cn/translate/python_278/library/index.html 官方标准库文档:https://docs.pyt ...

  9. PHP 简易读取文件目录下的文件,生成css spirte图片

    因为个人不是对PS熟悉,不清楚如何在PS中生成一张横向有序的spirte图片,使用了"css sprite V4.3"版本,生成的图片会出现压缩图片大小的情况,本想修改原作者开发的 ...

随机推荐

  1. UVa_Live 3664(精度坑)

    题意很好理解的贪心题,然而却卡疯了的精度坑. 再次理解一下double小数运算时可能导致的精度问题,本题为避免该问题可以将小数乘以100化为整数进行比较,输出的时候再除以100就ok: 思路也很好想, ...

  2. SQL基础(一)

    经过这段时间对SQL的基础学习,下面对自己的学习做个总结或者也可以说是个回顾吧! 我练习的是在oracle数据库平台上,并且安装了PLSQL Developer工具.下面是我从小白开始一路学习的回顾: ...

  3. asyncjs,waterfall的使用

    waterfall waterfall(tasks, [callback]) (多个函数依次执行,且前一个的输出为后一个的输入) 按顺序依次执行多个函数.每一个函数产生的值,都将传给下一个函数.如果中 ...

  4. 有趣的数 zoj 月赛

    题目描述 让我们来考虑1到N的正整数集合.让我们把集合中的元素按照字典序排列,例如当N=11时,其顺序应该为:1,10,11,2,3,4,5,6,7,8,9. 定义K在N个数中的位置为Q(N,K),例 ...

  5. [SDOI2009]HH的项链 树状数组 BZOJ 1878

    题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链 ...

  6. freemarker常用标签解释三

    1 date,time,datetime 日期,时间,时间日期 <#assign test1 = "10/25/1995"?date("MM/dd/yyyy&quo ...

  7. C语言单片机中延时程序的实现

    在单片机或嵌入式系统的程序,常常用规定次数的空循环来实现延时 /** * 通过一个空循环体循环让程序运行一段时间.在嵌入式系统中,这个函数用来实现延时. * * 参数: *    u16 i -- 循 ...

  8. 洛谷U41492(树上启发式合并)

    提交通道 洛谷日报 考虑非\(O(n^2)\)的预处理.一遍dfs时,check某颜色有没有的数组何时清空很尴尬:得到某树答案后如果不清,则影响接下来兄弟树的搜索:如果清了,父亲节点又难以收集答案. ...

  9. 使用YARN修改中国镜像

    官网地址 下载安装 https://yarnpkg.com/zh-Hans/   查看仓库使用地址 yarn config set registry 设置为淘宝镜像 yarn config set r ...

  10. linux系统延时和定时任务

    系统延时任务延时任务:只做一次的at命令: 系统定时及延时任务 延时任务:**有输出任务**不会输出到终端上而是发送邮件给你/var/mail/root/执行 mail at          时间 ...