写到用户注册的部分了
遇到一个小问题,浪费了几乎两天的时间.
不算浪费时间,以后肯定会遇到类似的问题
要习惯这种情况,不要着急,不要放弃
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)
注:
- 首先,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_HOST | name of host to connect to. Default: use the local host via a UNIX socket (where applicable) |
MYSQL_USER | user to authenticate as. Default: current effective user. |
MYSQL_PASSWORD | password to authenticate with. Default: no password. |
MYSQL_DB | database to use. Default: no default database. |
MYSQL_PORT | TCP port of MySQL server. Default: 3306. |
MYSQL_UNIX_SOCKET | location of UNIX socket. Default: use default location or TCP for remote hosts. |
MYSQL_CONNECT_TIMEOUT | Abort if connect is not completed within given number of seconds. Default: 10 |
MYSQL_READ_DEFAULT_FILE | MySQL configuration file to read; see the MySQL documentation for mysql_options(). |
MYSQL_USE_UNICODE | If True, CHAR and VARCHAR and TEXT columns are returned as Unicode strings, using the configured character set. |
MYSQL_CHARSET | If present, the connection character set will be changed to this character set, if they are not equal. Default: ‘utf-8’ |
MYSQL_SQL_MODE | If present, the session SQL mode will be set to the given string. |
MYSQL_CURSORCLASS | If 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)
下一次就该写用户登录页面的代码了
这一篇中间还有很多知识点,下次遇到了再记笔记