摘要:现在数据获取到了,提示也有了,我们需要把注册的数据写入到数据库,这一步很简单,直接使用之前提到过的方法,但是我们不能直接把明文密码写入到数据库中,那样做是十分不安全的,我们需要将其加密之后再写进去,具体是用到中的这个函数,将字符串变成值。
现在数据获取到了,提示也有了,我们需要把注册的数据写入到数据库,这一步很简单,直接使用之前提到过的方法,但是我们不能直接把明文密码写入到数据库中,那样做是十分不安全的,我们需要将其加密之后再写进去,具体是用到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")
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/41268.html
摘要:在用户注册的时候是为空的,当用户忘记密码在登录页面点击后生成的,用来给用法发送邮件后重置密码时进行验证。如有错误,不吝赐教。 注册 在advanced模板中,进入frontend/index.php?r=site%2Fsignup页面,可以看到框架的注册页面showImg(https://segmentfault.com/img/bVDEaZ?w=300&h=235); 填写完User...
摘要:上面的写法有个问题点击按钮发送请求后,客户端一直收不到响应,就会报错其实传送的时是一个异步的过程,里面还没执行完,外面就已经执行了,这边可以用来解决下这个问题内部返回一个对象,成功调用函数,失败调用函数,这边就默认它会成功。 今天来研究一个小小的功能。当我们进入一个网站,它怎么判断我是不是它的用户?让用户登录呗,如果它能正常登录,它就是我的用户呗?你有没想过它是怎么判断我是不是它用户的...
摘要:文件搜索通过关键字搜索文件,搜索时采用模糊搜索,可以对整个关键字进行模糊搜索,还可以将关键字进行中文分词后再依次模糊搜索。所以需要提供中文分词的功能。 上一篇博客地址:Tshare校园资源分享平台(网站开发三之数据库连接) 功能设计 虽然我们能访问web站点,能连接数据库了,但是并不意味着我们马上就要开始写代码,我们得先分析一下我们的网站都需要实现哪些功能,这样我们才能针对如何实现这些...
阅读 3107·2021-10-15 09:41
阅读 3177·2021-09-22 16:05
阅读 2419·2021-09-22 15:19
阅读 2882·2021-09-02 15:11
阅读 2457·2019-08-30 15:52
阅读 846·2019-08-30 11:06
阅读 1010·2019-08-29 16:44
阅读 1264·2019-08-23 18:18