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.有效-视频文件测试点: 选择符合要求的 ...
随机推荐
- 负载均衡lvs_dr_tcp_http单调度
准备三台虚拟,均为CentOS6.5 x86_64注意,配置过程中,保持端口的一致性.director (eth0 192.168.1.189, vip eth0:0: 192.168.1.18) D ...
- sublime插件(配合nodejs环境)
一.首先先安装nodejs,从nodejs官网下载 www.nodejs.cn 下载完成后直接安装,选择npm package版本的进行安装,安装完成后无需配置环境变量,nodejs会自动进行配置. ...
- 防范XSS
.net framework4.5 提供了AntiXss类,来防范XSS攻击. 在开放指令的同时过滤危险字符串,使用AntiXss.GetSafeHtmlFragment(html)方法,具体可以参照 ...
- myeclipse6.0安装svn插件
myeclipse6.0安装svn插件 转载地址:http://www.cnblogs.com/danica/archive/2011/07/12/2104323.html myeclipse6.0安 ...
- C++虚函数继承的bug
闲来无事想测试一下:如果在派生类中重写基类的虚函数,那么允不允许改变虚函数的访问权限,结果颠覆了三观..... 基类Base,拥有public方法test(),test()为虚函数 派生类Derive ...
- QT 报错:Project ERROR: Xcode not set up properly. You may need to confirm the license agreement by running /usr/bin/xcodebuild.
1.打开终端,输入指令并按回车键: sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer 2.如果电脑设置有密码,终 ...
- 超链接解决头部fixed问题
///////////超链接解决头部fixed问题 $('a[href*=#]').click(function () { var top1 = $(".header").heig ...
- ManyToMany OrderBy
有A.B表和A_B中间表,A_B中间表只有A.B表的id,想让A中的bs以date列排序: @Entity @Table(name="A") public class A impl ...
- 数据库中,char 与 varchar2 的区别
区别1: char 是定长的字符串 varchar2 是变长的字符串 区别2: name char(10) zhangsan__ 如果实际长度不足10,使用空格补齐 name varchar2 ...
- 【Sort】QuickSort
快速排序,平均运行时间O(N log N),最坏运行时间O(N^2). 我觉得先看Python版的快排算法(http://www.cnblogs.com/fcyworld/p/6160558.html ...