现在数据获取到了,提示也有了,我们需要把注册的数据写入到数据库,这一步很简单,直接使用之前提到过的方法,但是我们不能直接把明文密码写入到数据库中,那样做是十分不安全的,我们需要将其加密之后再写进去,具体是用到werkzeug.security中的generate_password_hash这个函数,将字符串变成hash值。

我们可以在User模型中重写__init__函数(或__setattr__),当传入password自动调用generate_password_hash进行加密,如:

class Users(db.Model):

__tablename__ = 'users_info'

id = db.Column(db.Integer, primary_key=True, autoincrement=True)

username = db.Column(db.String(32), nullable=False)

password = db.Column(db.String(100), nullable=False)

register_time = db.Column(db.DateTime, nullable=False, default=datetime.now())

avatar_path = db.Column(db.String(256), nullable=False, default='images/doraemon.jpg')

def __init__(self, *args, **kwargs):

self.username = kwargs.get('username')

self.password = generate_password_hash(kwargs.get('password'))

这样每添加一个新用户,在init的时候就自动把密码转为hash值了,但是后续我们还得增加修改密码的功能,所以就直接简单点,在收到POST数据的时候就把密码加密,然后存入数据库中,此时注册的视图函数代码如下:

from flask import Flask, render_template, request, flash, redirect, url_for

from models import db, Users

from werkzeug.security import generate_password_hash

from exts import validate

import config

...

@app.route('/register/', methods=['GET', 'POST'])

def register():

if request.method == 'GET':

return render_template('register.html')

else:

username = request.form.get('username')

password1 = request.form.get('password1')

password2 = request.form.get('password2')

message = validate(username, password1, password2)

flash(message)

if '成功' in message:

new_user = Users(username=username, password=generate_password_hash(password1))

db.session.add(new_user)

db.session.commit()

return redirect(url_for('login'))

else:

return render_template('register.html')

这里获取登录或注册成功的状态,使用了上一篇文章结尾说的方法,简化了代码量。

实际上更简单的方法是,我们直接对传入的{{ message }}进行判断,如果带有'成功'字符串,就显示蓝色,否则就显示红色。上文主要是为了说明@app.context_processor这个装饰器,以及session和g对象的区别。

那么同样的,登录的验证过程,就不能直接去拿数据库加密过的哈希和原始的密码对比了,我们用werkzeug.security的check_password_hash方法,它能验证哈希值是否与原始的密码是匹配的,然后修改validate函数如下:

from models import Users

from werkzeug.security import check_password_hash

def validate(username, password1, password2=None):

user = Users.query.filter(Users.username == username).first()

if password2:

if user:

return '用户名已经存在'

else:

if len(username) < 4:

return '用户名长度至少4个字符'

elif password1 != password2:

return '两次密码不一致'

elif len(password1) < 6:

return '密码长度至少6个字符'

else:

return '注册成功,请登录'

else:

if user:

if check_password_hash(user.password, password1):

return '登录成功'

else:

return '密码错误'

else:

return '用户名不存在'

登录页面的视图函数如下:

@app.route('/login/', methods=['GET', 'POST'])

def login():

if request.method == 'GET':

return render_template('login.html')

else:

username = request.form.get('username')

password = request.form.get('password')

message = validate(username, password)

if '成功' in message:

return redirect(url_for('home'))

else:

flash(message)

return render_template('login.html')

python数据库实现注册函数_10.注册和登录功能实现(3)—— 注册数据写入数据库...相关推荐

  1. JavaWeb实现注册登录功能并将用户数据写进数据库(商城系统第一部分)

    JavaWeb实现注册登录功能并将用户数据写进数据库(商城系统第一部分) 声明:本人并非项目原创,该商城系统原创来自撩课高新强老师:https://study.163.com/course/intro ...

  2. uni-app利用uniCloud获取微信步数并将数据写入数据库

    uni-app利用uniCloud获取微信步数并将数据写入数据库 本项目依赖了uni-id 只是毕业设计,想法不完善,没有对用户授权失败做处理,如果编写的时候需要注意 第一步:调用wx.login() ...

  3. 将json文件里面的数据写入数据库

    {"title_": "需要电脑/招视频剪辑学徒>18岁", "area_": " 不限区域", "vi ...

  4. 将数据写入数据库:打开数据库,建库建表,通过php访问后台服务器(连接服务器(三种),选择数据库,设置字符集:防止数据乱码),通过php对数据库进行:增,删,改,查,操作

    前端表单设计以后,需要把数据写入数据库 将数据写入数据库:         如果涉及php.sql,wamp服务器必须打开         wamp里面有一个专门,图形化的移动窗口:          ...

  5. jsp oracle 登录页面,Oracle数据库之ORACLE+Myeclipse+jsp实现简单登录功能

    本文主要向大家介绍了Oracle数据库之ORACLE+Myeclipse+jsp实现简单登录功能,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. Oracle数据库表的建立: c ...

  6. 根据现有的API接口将获取JSON数据写入数据库

    根据现有的API接口将获取JSON数据写入数据库 利用API将获取数据存入数据库 获取API的URl 的原则 例如网址API的网址为:https://wuliang.art/ncov/doc.html ...

  7. python实现qq登录注册_python实现QQ批量登录功能

    本文实例为大家分享了python实现QQ批量登录功能的具体代码,供大家参考,具体内容如下 小编收集整理的第一份代码: python3.6批量登陆QQ import os import time imp ...

  8. java写数据进mysql_java怎样将读取数据写入数据库

    展开全部 Java可以使用JDBC对数32313133353236313431303231363533e4b893e5b19e31333366306566据库进行读写.JDBC访问一般分为如下流程: ...

  9. SSM Mybatis将新增数据写入数据库时出现的500状态码:Error updating database.的可能...

    关于maven下ssm整合的项目推荐这篇博客:https://www.cnblogs.com/yiye/p/5969157.html 今日在ssm下的将新增数据写回数据库时遇到不少的问题,现作记录 如 ...

最新文章

  1. 目标检测--RON: Reverse Connection with Objectness Prior Networks for Object Detection
  2. 文档管理服务器文件的脱机编辑选项无法编辑,让MOSS2007文档的存取更具个性
  3. java从尾到头打印链表数据_Java编程实现从尾到头打印链表代码实例
  4. 5.8 程序示例--线性分类-机器学习笔记-斯坦福吴恩达教授
  5. 在git bush中如何退出vim编辑器
  6. Qt Creator和Visual Studio双环境开发技能攻略
  7. jitter 如何优化网络_如何做好关键词优化网络?
  8. Java文档阅读笔记-JDBC Driver
  9. html表格中插入单行文本框,el-table复选框选中单行或多行点击按钮禁用el-table里面的input输入框该怎么判断?...
  10. 《Effective C#》Item 7:推荐使用不可改变的原子值类型
  11. 报错:Avoid adding reactive properties to a Vue instance or its root $data at runtime - declare it upfr
  12. fatal error LNK1281: 无法生成 SAFESEH 映像
  13. Atitit java zip compress use apache tool jar 压缩的问题 static void zip(java.lang.String zipFileName,
  14. 正常查看网页中压缩的js代码
  15. 交通仿真 | SUMO第一步
  16. MacOS 开发 - isFlipped(坐标系)
  17. 百战RHCE(第一战:Linux基础命令1)
  18. vim:修改vim录制的宏
  19. 274. H 指数----中等
  20. 【基础强训】day4

热门文章

  1. java 输入任何字符继续_Thinking in Java 4th chap13笔记-字符串
  2. 微信小程序性别代码对应描述
  3. java绘制一个饼图_一个简单的绘制饼图的 Java Bean 实例
  4. java与php链条遇到的坑,记一次Java加密加签算法到php的坑
  5. python莫比乌斯内接矩形_莫比乌斯反演例题集 ^_^(示例代码)
  6. python矩阵赋值提高速度_Numpy大规模矩阵运算优化加速技巧
  7. java监听文件改名字_java监听文件目录的改变
  8. 管状合金电阻和片状合金电阻的区别_合金采样电阻的特点及作用
  9. 如何区分两列中不同数据_如何区分原装数据线和山寨数据线
  10. 判断 小程序_怎么判断小程序开发公司靠不靠谱?