Flask学习笔记--9

124 篇文章 0 订阅

写到用户注册的部分了
遇到一个小问题,浪费了几乎两天的时间.

不算浪费时间,以后肯定会遇到类似的问题
要习惯这种情况,不要着急,不要放弃

Version –10 :

首先,是flask_mysqldb, passlib 第三方库的安装
flask_mysqldb 是mysqldb库的flask扩展包,用来连接flask和MySql.
passlib库用来对password进行包装,在数据库中不直接显示密码,密码成了一堆不认识的东西,像下面这样:

mysql> SELECT * FROM users;
+----+------------+---------------------+-----------+-------------------------------------------------------------------------------+---------------------+
| id | name       | email               | username  | password                                                                      | register_date       |
+----+------------+---------------------+-----------+-------------------------------------------------------------------------------+---------------------+
|  1 | FengWeilei | 18790166674@163.com | mio230002 | $5$rounds=535000$feIqCnPH1qb6Avmj$W.4N8bQUZSbmcyM3TbVFSAkJCL1a4.mGgQa2JKXf0w6 | 2017-07-29 16:36:24 |
+----+------------+---------------------+-----------+-------------------------------------------------------------------------------+---------------------+
1 row in set (0.11 sec)

然后,
flaskapp.py:

from flask import Flask,render_template,request,flash,redirect,url_for
from wtforms import StringField, SubmitField,validators, PasswordField
from flask_wtf import FlaskForm
from flask_mysqldb import MySQL
from passlib.hash import sha256_crypt

app = Flask(__name__)

#Config to mysql
app.config['MYSQL_HOST'] = 'localhost'
app.config['MYSQL_USER'] = 'root'
app.config['MYSQL_PASSWORD'] = 'abc230002'
app.config['MYSQL_DB'] = 'FLASKAPP'
app.config['MYSQL_CURSORCLASS'] = 'DictCursor'

#Initialize the extension
mysql = MySQL(app)

@app.route('/')
def index():
    return render_template("index.html")


class RegisterForm(FlaskForm):
    name = StringField('Name', [validators.Length(min=1, max=50)])
    username = StringField('Username', [validators.Length(min=4, max=25)])
    email = StringField('Email', [validators.Length(min=6, max=50)])
    password = PasswordField('Password', [
        validators.DataRequired(),
        validators.EqualTo('confirm', message='Passwords do not match')
    ])
    confirm = PasswordField('Confirm Password')

@app.route('/register',methods=["GET","POST"])
def register():
    form = RegisterForm(request.form)
    if request.method == 'POST' and form.validate_on_submit():
        name = form.name.data
        email = form.email.data
        username = form.username.data
        password = sha256_crypt.encrypt(str(form.password.data))

        ##Creat cursor
        cur = mysql.connection.cursor()

        #Execute query
        cur.execute("INSERT INTO users(name, email, username, password) VALUES(%s, %s, %s, %s)",(name, email,username,password))

        #Commit to DB
        mysql.connection.commit()

        #Close connection
        cur.close()

        flash("You are now registered.Please log in.",'success')

        return redirect(url_for('index'))

    return render_template('register.html',form=form)

#CSRF
#app.config.from_object('config')

if __name__ == "__main__":
    app.secret_key="It doesn't matter"
    app.run(debug=True)

注:


  1. 首先,mysql = MySQL(app) 来实例化一个mysql对象,但在这之前要进行一些简单的配置:

app.config['MYSQL_HOST'] = 'localhost'
app.config['MYSQL_USER'] = 'root'
app.config['MYSQL_PASSWORD'] = 'abc230002'
app.config['MYSQL_DB'] = 'FLASKAPP'
app.config['MYSQL_CURSORCLASS'] = 'DictCursor'

前几个没什么好说的,host,user,password,db 按照要求填写localhost,用户名,MySql密码和这次需要用的数据库(上次已经建立了FLASKAPP数据库,还建立了一个users表)

最后这个DictCursor,网站上有介绍:
This is a Cursor class that returns rows as dictionaries and stores the result set in the client.

MYSQL_HOSTname of host to connect to. Default: use the local host via a UNIX socket (where applicable)
MYSQL_USERuser to authenticate as. Default: current effective user.
MYSQL_PASSWORDpassword to authenticate with. Default: no password.
MYSQL_DBdatabase to use. Default: no default database.
MYSQL_PORTTCP port of MySQL server. Default: 3306.
MYSQL_UNIX_SOCKETlocation of UNIX socket. Default: use default location or TCP for remote hosts.
MYSQL_CONNECT_TIMEOUTAbort if connect is not completed within given number of seconds. Default: 10
MYSQL_READ_DEFAULT_FILEMySQL configuration file to read; see the MySQL documentation for mysql_options().
MYSQL_USE_UNICODEIf True, CHAR and VARCHAR and TEXT columns are returned as Unicode strings, using the configured character set.
MYSQL_CHARSETIf present, the connection character set will be changed to this character set, if they are not equal. Default: ‘utf-8’
MYSQL_SQL_MODEIf present, the session SQL mode will be set to the given string.
MYSQL_CURSORCLASSIf present, the cursor class will be set to the given string.

表格来自Welcome to Flask-MySQLdb’s documentation!-Configuration

2.mysql = MySQL(app) 实例化了一个mysql对象,等下视图函数中可以用来创建指针,上传数据到MySQL 等

视图函数这一块儿:

def register():
    form = RegisterForm(request.form)
    if request.method == 'POST' and form.validate_on_submit():
        name = form.name.data
        email = form.email.data
        username = form.username.data
        password = sha256_crypt.encrypt(str(form.password.data))

        ##Creat cursor
        cur = mysql.connection.cursor()

        #Execute query
        cur.execute("INSERT INTO users(name, email, username, password) VALUES(%s, %s, %s, %s)",(name, email,username,password))

        #Commit to DB
        mysql.connection.commit()

        #Close connection
        cur.close()

        flash("You are now registered.Please log in.",'success')

        return redirect(url_for('index'))

    return render_template('register.html',form=form)

注:
1. form = RegisterForm(request.form) 实例化一个Web表单,接收用户提交的数据,这里传递了request.form参数,根据用户输入的值来创建form表单
2. form.name.data 可以访问表单中单个值 name = form.name.data 表示访问表单中name的值,存储在name变量里 等下会把这个变量里的数据写入MySQL数据库中
3. request.method == ‘POST’ 判断数据是不是通过 HTTP POST 方法提交的,在register.html文件里有相应的代码
4. form.validate_on_submit() 用来判断数据是否被提交而且能不能通过验证函数(创建class RegisterForm(FlaskForm)时每个字段都有验证函数)
5. cur = mysql.connection.cursor() 创建了一个指针
6. 剩余的代码都不难理解,但是我找不到具体出处
7. flash方法设置了一条注册之后的欢迎信息
8. if条件语句最后用redirect()方法返回到了index页面
9. 如果不执行if条件不通过,不执行if 语句剩下的内容,直接留在了原页面

#CSRF
#app.config.from_object('config')

if __name__ == "__main__":
    app.secret_key="It doesn't matter"
    app.run(debug=True)

CSRF 密钥也能直接写在程序中,不过,还是像之前的写一个单独的文件比较好.

然后,网页中的效果:
(慕喊寒是因为那首歌【想你想你】里的念白自称是慕喊寒。)
这里写图片描述

这里写图片描述

MySql中查看:
这里下午注册了一次,这次是第二个用户,对应的id=2
(这个mysql的用法昨天有记录,下次可以翻看昨天的笔记)

mysql> SELECT * FROM users WHERE id=2;
+----+----------+----------------+----------+-------------------------------------------------------------------------------+---------------------+
| id | name     | email          | username | password                                                                      | register_date       |
+----+----------+----------------+----------+-------------------------------------------------------------------------------+---------------------+
|  2 | MUHANHAN | muhan@0502.com | muhan    | $5$rounds=535000$Z0nF2EdORZxh7i33$El12wZejA8kP.EEYZZZ6icr5dXPrE7B1BhslprljtM7 | 2017-07-29 22:27:52 |
+----+----------+----------------+----------+-------------------------------------------------------------------------------+---------------------+
1 row in set (0.21 sec)

下一次就该写用户登录页面的代码了
这一篇中间还有很多知识点,下次遇到了再记笔记

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值