Flask文件目录----- auth/blog 文件
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 文件的更多相关文章
- flask控制上传文件的大小
1.flask控制上传文件的大小的方案是全局控制:http://docs.jinkan.org/docs/flask/patterns/fileuploads.html from flask impo ...
- Flask文件目录----- __init__ 文件
import os from flask import Flask def create_app(test_config=None): # 创建和设置app app = Flask(name, ins ...
- Flask文件目录----- db文件
import sqlite3 import click from flask import current_app, g from flask.cli import with_appcontext d ...
- Flask Web 发送邮件单文件
import os from flask import Flask, render_template, session, redirect, url_for from flask_script imp ...
- 多文件目录下makefile文件递归执行编译所有c文件
首先说说本次嵌套执行makefile文件的目的:只需make根目录下的makefile文件,即可编译所有c文件,包括子目录下的. 意义:自动化编译行为,以后编译自己的c文件时可把这些makefile文 ...
- 【转】多文件目录下makefile文件递归执行编译所有c文件
首先说说本次嵌套执行makefile文件的目的:只需make根目录下的makefile文件,即可编译所有c文件,包括子目录下的. 意义:自动化编译行为,以后编译自己的c文件时可把这些makefile文 ...
- flask 之(七) --- 认证|文件|部署
登陆注册 说明: 令牌Token认证,在对HTTP形式的API发请求时,大部分情况我们不是通过用户名密码做验证,而是通过一个令牌[Token来做验证]. RESTful API无法使用Flask-Lo ...
- python2.7.13标准库文件目录操作与文件操作
标准库的中文参考文档: http://python.usyiyi.cn/translate/python_278/library/index.html 官方标准库文档:https://docs.pyt ...
- PHP 简易读取文件目录下的文件,生成css spirte图片
因为个人不是对PS熟悉,不清楚如何在PS中生成一张横向有序的spirte图片,使用了"css sprite V4.3"版本,生成的图片会出现压缩图片大小的情况,本想修改原作者开发的 ...
随机推荐
- Mysql 别名
一.列别名 1.要给列添加别名,可以使用AS关键词后跟别名,例:SELECT [column_1 | expression] AS descriptive_name FROM table_name; ...
- 第一章:初识JAVA
一:计算机语言发展史 机器语言:典型的二进制文件和计算机交流. 汇编语言: 通过大量的标识符表示一些基本操作来和计算机做交流. 高级语言:通过常见的英语指令来编写程序,完成沟通 常见高级语言 Java ...
- 如何实现 MySQL 的读写分离?MySQL 主从复制原理的是啥?如何解决 MySQL 主从同步的延时问题?
如何实现 MySQL 的读写分离? 其实很简单,就是基于主从复制架构,简单来说,就搞一个主库,挂多个从库,然后我们就单单只是写主库,然后主库会自动把数据给同步到从库上去. MySQL 主从复制原理的是 ...
- C++基础学习2:命名空间
C++语言引入命名空间(Namespace)这一概念主要是为了避免命名冲突,其关键字为 namespace. 科技发展到如今,一个系统通常都不会仅由一个人来开发完成,不同的人开发同一个系统,不可避免地 ...
- 详解linux下批量替换文件内容的三种方法(perl,sed,shell)
在建设本网站的时候,发现新建了很多的网页,突然发现,每个文件都需要进行修改一样的内容,一个一个打开很是麻烦,所以,总结了一下如何快速修改一个目录下多个文件进行内容替换.第三种方法用的不多 方法一 使用 ...
- Android----获取包名和sh1
第一种:使用java的一个工具---keytool工具(jdk目录下) SHA1叫安全哈希算法用于签名 keytool -list -v -keystore 签名证书所在位置path 第二种:通过An ...
- STP-6-快速生成树协议-新端口角色,状态和类型以及新链路类型
IEEE 802.1w快速生成树协议(RSTP)增强了802.1D标准,在设计合理的网络中收敛时间远少于1秒. 端口状态从5个减少到3个 丢弃状态是在端口刚启用时的默认状态,边界端口除外,它的 ...
- 【笔记】MySQL学习之索引
[笔记]MySQL学习之索引 一 索引简单介绍 索引,是数据库中专门用于帮助用户快速查询数据的一种数据结构.类似于字典中的目录,查找字典内容时可以根据目录查找到数据的存放位置,然后直接获取即可. 普通 ...
- SQL-Error-1
错误描述:String or binary data would be truncated. 原因:字段长度不够
- 洛谷U41492(树上启发式合并)
提交通道 洛谷日报 考虑非\(O(n^2)\)的预处理.一遍dfs时,check某颜色有没有的数组何时清空很尴尬:得到某树答案后如果不清,则影响接下来兄弟树的搜索:如果清了,父亲节点又难以收集答案. ...