Flask -- 使用数据库(Sqlite3)、用户注册、登录注销、修改密码
# 使用sqlite数据库 import sqlite3
from contextlib import closing app.config.update(
DATABASE = 'my.db', #相对于文件所在目录
DEBUG=True,
) def connect_db():
return sqlite3.connect(app.config['DATABASE']) def init_db():
with closing(connect_db()) as db:
with app.open_resource('schema.sql', 'r') as f:
db.cursor().executescript(f.read())
db.commit() def get_db():
db = connect_db()
cur = db.cursor()
return db, cur
# 用户注册
from wtforms import Form, TextField, PasswordField, BooleanField, validators
from passlib.hash import sha256_crypt
import gc
class RegistrationForm(Form): 使用flask-WTF表单系统,可以方便地使用逻辑(pip install flask-WTF)
username = TextField('Username', [validators.Length(min=4, max=20)])
email = TextField('Email', [validators.Length(min=6, max=50)])
password = PasswordField('Password', [validators.Required(), validators.EqualTo('confirm', message='Passwords must match.')])
confirm = PasswordField('Password Again')
accept_tos = BooleanField("<small>I accept it</small>", [validators.Required()])
@app.route('/register/', methods=['POST', 'GET'])
def register():
try:
form = RegistrationForm(request.form)
if request.method == 'POST' and form.validate():
username = form.username.data
email = form.email.data
password = sha256_crypt.encrypt(str(form.password.data)) #对密码加密,生成一个hash值[每次调用生成不同的hash](pip install passlib)
db, cur = get_db()
x = cur.execute(
'SELECT * FROM users WHERE username = ?', [username])
if x.fetchall():
flash("That username is already taken, please choose another")
return render_template('register.html', form=form)
else:
cur.execute("INSERT INTO users (username, password, email) VALUES(?,?,?)", [
username, password, email])
db.commit()
flash("Thanks for registering!")
cur.close()
db.close()
gc.collect() # collect garbage
session['logged_in'] = True
session['username'] = username
return redirect(url_for('dashboard'))
return render_template('register.html', form=form)
except Exception as e:
return str(e)
#register.html <div class="container" style>
<h4>Welcome to register</h4>
<br />
{% from '_formhelpers.html' import render_field %}
<form action="" method="post">
{{ render_field(form.username) }}
{{ render_field(form.email) }}
{{ render_field(form.password) }}
{{ render_field(form.confirm) }}
{{ render_field(form.accept_tos) }} <p><input type="submit" value="Register" /></p>
</form> {% if error %}
<p class="error"><strong>Error: </strong>{{ error }}</p>
{% endif %} </div>
# _formhelper.html
{% macro render_field(field) %} 宏逻辑,相当于一个函数
<dt>{{ field.label }}</dt>
<dd>{{ field(**kwargs) | safe }}
{% if field.errors %}
<ul class="errors">
{% for error in field.errors %}
<li>{{ error }}</li>
{% endfor %}
</ul>
{% endif %}
<dd>
{% endmacro %}
#用户登录
@app.route('/login/', methods=['POST', 'GET'])
def login():
try:
error = None
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
db, cur = get_db()
passwd_hash_tuple = cur.execute(
'SELECT password FROM users WHERE username=?', [username]).fetchone() # return a tuple
if not passwd_hash_tuple:
error = 'Invalid username'
elif not sha256_crypt.verify(password, passwd_hash_tuple[0]):
error = 'Invalid password'
else:
flash('Hey %s, you are in' % username)
session['logged_in'] = True
session['username'] = username
return redirect(url_for('dashboard'))
gc.collect()
return render_template('login.html', error=error)
except Exception as e:
return str(e)
# login.html <div class="container">
{% if error %}
<p class="alert alert-danger">{{ error }}</p>
{% endif %} <h4>Please Login</h4>
<form method="post" action="" class="form-inline">
<input type="text" class="form-control" placeholder="username" name="username" value="{{ request.form.username }}" />
<input type="password" class="form-control" placeholder="password" name="password" value="{{ request.form.password }}" />
<input type="submit" class="btn btn-default" value="Login" />
</form> </div>
# 用户退出
@app.route('/logout/')
@login_required
def logout():
session.pop('logged_in', None)
flash("You have logged out")
return redirect(url_for('dashboard'))
Flask -- 使用数据库(Sqlite3)、用户注册、登录注销、修改密码的更多相关文章
- Web实现数据库链接的登录注册修改密码功能
/** * Copyright (C), 2017-2017 * FileName: User * Author: ichimoku * Date: 2017/12/5 14:31 * version ...
- Android基于XMPP Smack Openfire下学习开发IM(一)实现用户注册、登录、修改密码和注销等
http://blog.csdn.net/h7870181/article/details/8653865 以前学习过用Scoket 建立聊天,简单的建立聊天是没问题的,但如果要实现多人复杂的聊天,后 ...
- openfire Android学习(一)----实现用户注册、登录、修改密码和注销等
以前学习过用Scoket 建立聊天,简单的建立聊天是没问题的,但如果要实现多人复杂的聊天,后台服务器代码就比较复杂,对于我这新手来讲就比较难了.后来在网上看到用openfire做服务器,利用强大的Sm ...
- 传智播客JavaWeb day07、day08-自定义标签(传统标签和简单标签)、mvc设计模式、用户注册登录注销
第七天的课程主要是讲了自定义标签.简单介绍了mvc设计模式.然后做了案例 1. 自定义标签 1.1 为什么要有自定义标签 前面所说的EL.JSTL等技术都是为了提高jsp的可读性.可维护性.方便性而取 ...
- JavaWeb-SpringBoot_使用H2数据库实现用户注册登录
使用Gradle编译项目 传送门 前端资源同:使用MySQL数据库实现用户管理_demo 传送门 H2:SpringBoot内置持久化数据库 使用H2数据库实现用户注册登录 用户可以在index.h ...
- MySql添加用户,新建数据库,用户授权,删除用户,修改密码
转自:http://www.cnblogs.com/fly1988happy/archive/2011/12/15/2288554.html MySql中添加用户,新建数据库,用户授权,删除用户,修改 ...
- node+mysql+express实现登录/注册/修改密码/删除用户 接口
实现用户的注册.登录.修改密码.删除用户操作 用到的数据库:nodecms:表:user 目录结构: db目录下存放数据库操作语句: userSQL.js 用户有关的操作语句 router目录 接口路 ...
- 清除SQL Server 2008记住的数据库地址、登录名和密码
在服务器上登录过数据库信息,并且选择了记住了密码,由于服务器数据库很多人在使用,有必要删除信息 定位到fileC:\Users\%username%\AppData\Roaming\Microsoft ...
- day40——数据库、数据库分类、安装、修改密码、字符集编码、简单语句介绍
day40 详情请看:https://www.cnblogs.com/clschao/articles/9907529.html 数据库 数据库 简而言之可视为电子化的文件柜--存储电子文件的处所,用 ...
- 测试点常用用例设计(登录、修改密码、输入框、上传视频、XSS、URL篡改)
1.无效-视频文件测试点: 视频大小过大 视频大小过小 视频名称过长 视频名称包含特殊字符 视频名称包含中文.中英混合 视频文件格式错误 视频文件重复性上传 2.有效-视频文件测试点: 选择符合要求的 ...
随机推荐
- sharepoint:基于AD的FORM认证
//来源:http://www.cnblogs.com/jindahao/archive/2012/05/07/2487351.html 需求: 1. 认证要基于AD 2. 登入方式要页面的方式(fo ...
- 【for陷阱】遍历的同时删除元素
今晚,哦不,是昨晚了,想删除空行时,给for语句和列表坑得好惨!!! 一般来说,删除字符串的空行有以下几种常见的方法~(然而我竟然想不出来) 假设我们要把下面的字符串之间的空行给去掉 # coding ...
- mob.com Android studio 配置环境
- mysql批量插入之提高插入效率
INSERT INTO insert_table (datetime, uid, content, type) VALUES ('0', 'userid_0', 'content_0', 0); IN ...
- ListView 分页 排序、编辑、插入和删除
摘自网络地址:http://msdn.microsoft.com/zh-cn/magazine/cc337984.aspx ListView 基础 ListView 是模板驱动的控件,这意味着它默认情 ...
- SPA 单页面应用
SPA一般只一个web页面,通过ajax,router等技术实现局部刷新,不会随着用户操作而出现重新加载页面或者页面跳转的功能,所有的用户操作都在一个页面实现. 组件化:UI组件和非UI组件 传统的u ...
- Java 笔试面试 基础篇 一
1. Java 基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法, 线程的语法,集合的语法,io 的语法,虚拟机方面的语法. 1.一个".java& ...
- 4.请求方式为application/json时的接口测试要如何做?
1.单独新建一个线程组, 在信息头管理器中增加: 在Body Data中,添加json格式的内容(我不会写,直接用fiddler抓包,然后把TextView中的数据复制过来). 2.然后因为登录状态, ...
- ZOJ 2710 Two Pipelines
计算几何+贪心 #include<cstdio> #include<cstring> #include<cmath> #include<algorithm&g ...
- USACO 2.4 Cow Tours
Cow Tours Farmer John has a number of pastures on his farm. Cow paths connect some pastures with cer ...