# 使用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. linux 下执行.sh文件提示permission denied

    linux 下执行.sh文件提示permission denied 在脚本文件目录下运行命令,赋予权限: chmod 777 *.sh or chmod +x  *.sh

  2. PHP程序员的技术成长规划(转)

    按照了解的很多PHP/LNMP程序员的发展轨迹,结合个人经验体会,抽象出很多程序员对未来的迷漫,特别对技术学习的盲目和慌乱,简单梳理了这个每个阶段PHP程序员的技术要求,来帮助很多PHP程序做对照设定 ...

  3. 【Python之路】第七篇--Python基础之面向对象及相关

    面向对象基础 基础内容介绍详见一下两篇博文: 面向对象初级篇 面向对象进阶篇 其他相关 一.isinstance(obj, cls) 检查obj是否是类 cls 的对象 class Foo(objec ...

  4. 2px边框,4分之1内边框实现选中功能实现

    有时候我们要实现如下选中效果: 我给出一种解决办法: 首先选中的时候,加一个class(active),未选中的全部加一个class(inactive),外层给一个1px border,每个选项给一个 ...

  5. .net中读取xml文件中节点的所有属性信息

    功能描述: 将数据以xml的格式记录成配置文件,需要获取配置文件中的数据时,则获取对应的配置文件,读取配置文件里对应节点的所有属性. 逻辑实现: 1.将数据配置好在xml文件中. 2.获取xml文件中 ...

  6. 关于linux修改max user processes limits的问题

    我们都知道,ulimit -u 可以设置max user processes limits,但是往往在设置的过程中,这样直接修改,不仅只能临时生效,重启之后又无效了,而且老是会失败. 而一般来说,修改 ...

  7. 项目管理-SVN服务器的搭建

    Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站上了,下载地址: http:// ...

  8. USACO 2.3 Cow Pedigrees

    Cow Pedigrees Silviu Ganceanu -- 2003 Farmer John is considering purchasing a new herd of cows. In t ...

  9. Java中ArrayList的使用

    //创建ArrayList ArrayList arr  = new ArrayList(); //ArrayList添加数据 arr.add("123"); arr.add(&q ...

  10. 《JS权威指南学习总结--9.3 JS中JAVA式的类继承》

    内容要点: 一.JS中的类 1.JAVA或其他类似强类型 面向对象语言的 类成员的模样 实例字段:它们是基于实例的属性或变量,用以保存独立对象的状态. 实例方法: 它们是类的所有实例所共享的方法,由每 ...