# 使用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)、用户注册、登录注销、修改密码的更多相关文章

  1. Web实现数据库链接的登录注册修改密码功能

    /** * Copyright (C), 2017-2017 * FileName: User * Author: ichimoku * Date: 2017/12/5 14:31 * version ...

  2. Android基于XMPP Smack Openfire下学习开发IM(一)实现用户注册、登录、修改密码和注销等

    http://blog.csdn.net/h7870181/article/details/8653865 以前学习过用Scoket 建立聊天,简单的建立聊天是没问题的,但如果要实现多人复杂的聊天,后 ...

  3. openfire Android学习(一)----实现用户注册、登录、修改密码和注销等

    以前学习过用Scoket 建立聊天,简单的建立聊天是没问题的,但如果要实现多人复杂的聊天,后台服务器代码就比较复杂,对于我这新手来讲就比较难了.后来在网上看到用openfire做服务器,利用强大的Sm ...

  4. 传智播客JavaWeb day07、day08-自定义标签(传统标签和简单标签)、mvc设计模式、用户注册登录注销

    第七天的课程主要是讲了自定义标签.简单介绍了mvc设计模式.然后做了案例 1. 自定义标签 1.1 为什么要有自定义标签 前面所说的EL.JSTL等技术都是为了提高jsp的可读性.可维护性.方便性而取 ...

  5. JavaWeb-SpringBoot_使用H2数据库实现用户注册登录

    使用Gradle编译项目 传送门 前端资源同:使用MySQL数据库实现用户管理_demo 传送门 H2:SpringBoot内置持久化数据库  使用H2数据库实现用户注册登录 用户可以在index.h ...

  6. MySql添加用户,新建数据库,用户授权,删除用户,修改密码

    转自:http://www.cnblogs.com/fly1988happy/archive/2011/12/15/2288554.html MySql中添加用户,新建数据库,用户授权,删除用户,修改 ...

  7. node+mysql+express实现登录/注册/修改密码/删除用户 接口

    实现用户的注册.登录.修改密码.删除用户操作 用到的数据库:nodecms:表:user 目录结构: db目录下存放数据库操作语句: userSQL.js 用户有关的操作语句 router目录 接口路 ...

  8. 清除SQL Server 2008记住的数据库地址、登录名和密码

    在服务器上登录过数据库信息,并且选择了记住了密码,由于服务器数据库很多人在使用,有必要删除信息 定位到fileC:\Users\%username%\AppData\Roaming\Microsoft ...

  9. day40——数据库、数据库分类、安装、修改密码、字符集编码、简单语句介绍

    day40 详情请看:https://www.cnblogs.com/clschao/articles/9907529.html 数据库 数据库 简而言之可视为电子化的文件柜--存储电子文件的处所,用 ...

  10. 测试点常用用例设计(登录、修改密码、输入框、上传视频、XSS、URL篡改)

    1.无效-视频文件测试点: 视频大小过大 视频大小过小 视频名称过长 视频名称包含特殊字符 视频名称包含中文.中英混合 视频文件格式错误 视频文件重复性上传 2.有效-视频文件测试点: 选择符合要求的 ...

随机推荐

  1. SharePoint:备份和还原

    注意事项: 1.备份和还原最好都用PowerShell,用时候用管理中心会遇到错误. 2.备份PowerShell要注意数据库服务器名,要与管理中心的数据库服务器一致,用ip可能会报错. Restor ...

  2. js的兼容技巧

    javascript原生代码中经常会遇到各式各样浏览器不兼容的问题,浏览器真是倔强,解决浏览器的兼容是前端猿们的一大难题 为了避免在工作中遇到这些简单的问题.节约开发时间,在这里总结一些常用的浏览器兼 ...

  3. 手动安装VS code 插件

    现在安装包: 通过修改下面的地址参数:https://${publisher}.gallery.vsassets.io/_apis/public/gallery/publisher/${publish ...

  4. 1张图看懂RAID功能,6张图教会配置服务器【转】

    RAID 包含一组或者一个集合甚至一个阵列.使用一组磁盘结合驱动器组成 RAID 阵列或 RAID 集.将至少两个磁盘连接到一个 RAID 控制器,而成为一个逻辑卷,也可以将多个驱动器放在一个组中.一 ...

  5. IE8下 Select文字垂直居中的办法

    .select { padding: 4px 0; height: 30px; line-height: 26px; vertical-align: middle;} 处理前: 处理后:

  6. 记录下actionbar的翻译

    http://blog.csdn.net/xyz_lmn/article/details/8132420 嗯,actionbarSherLock不错,viewpagerIndicator也不错.

  7. 32bit程序在64bit操作系统下处理重定向细节(转自http://bbs.pediy.com/showthread.php?t=89054)

    1. 64bit操作系统的重定向机制以及目的 在64bit操作系统中,为了无缝兼容32bit程序的运行,64bit的Windows操作系统采用重定向机制.目的是为了能让32bit程序在64bit的操作 ...

  8. POJ - 1330 Nearest Common Ancestors(基础LCA)

    POJ - 1330 Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 10000KB   64bit IO Format: %l ...

  9. hdu 1531 King

    首先吐槽一下这个题目的题意描述,我看了半天才明白. 下标全部都是乱标的!!!!出题者能不能规范一点下标的写法!!!! 差分约束系统 #include<cstdio> #include< ...

  10. ajax 跨域携带COOKIE

    这个问题属于Ajax跨域携带Cookie的问题,找了一篇博文的解决方案. 原生ajax请求方式: var xhr = new XMLHttpRequest(); xhr.open("POST ...