前言
之前学习了用flask进行简单的网页展示,并实现了简单的用户登录界面。接下来记录最近学习的flask连接mysql数据库,完善用户登录系统,加入注册和查询用户信息的功能。
由于初次学习,所写的代码和展示的页面都比较简陋,各位大佬就看看图一乐,发现有错误之处请指出。我主要是记录所学历程,总结一下,日后好查漏补缺。
一、MySQL数据库
SQL,结构化查询语言,Structured Query Language。MySQL则是当前使用最广泛的开源关系型数据库,由于有免费的社区版,可供我们进行学习和部署。
1. 准备环境
下载mysql数据库和workbench,在workbench中新建一个数据库user_info,新建一个表user。
2. 基本语法
这次的学习主要用到了mysql的查询数据和增加数据的功能。注意如果用workbench可视化操作数据,需要先双击选中该数据库。接下来是这次用到的几个最基本的语句,当然还有很多其他的SQL语句,这些留着日后再说。
# 查询整个表中的数据,user是表名
select * from user;
# 插入或新增数据
insert into user (username, password) values ("zhangsan", "123456");
#查询特定字段的数据
select * from user where name = "zhangsan";
二、代码展示
主要有三大块,第一个是主程序代码app.py;第二个是连接数据库的代码db.py;最后是模板文件templates,里面有注册登录所用的hello.html和展示用户信息所用的user.html。
1. 主程序app.py
主程序中三个路由分别指向三个函数,分别实现注册,登录,用户信息查看。
# app.py
from flask import Flask, render_template, request, redirect
# 这里把数据库中的方法全部引入
from db import *
app = Flask(__name__)
@app.route('/')
def home():
return '<h1>Home</h1>'
# 注册函数
@app.route('/register', methods=['POST', 'GET'])
def register():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
# write()是数据库中写入数据的函数
write(username, password)
return "<h1>Success!</h1>"
return render_template('hello.html')
# 登录函数
@app.route('/login', methods=['POST', 'GET'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
# is_existed()是数据库中判断用户名或密码是否存在的函数
if is_existed(username, password):
return redirect('https://www.baidu.com')
else:
message = 'Incorrect username or password'
return render_template('hello.html', message=message)
return render_template('hello.html')
# 显示用户信息的函数
@app.route('/user', methods=['POST','GET'])
def show_user():
# show()是展示用户信息的函数
result = show()
return render_template("user.html", datas=result)
if __name__ == '__main__':
app.run()
2. 连接数据库的代码 db.py
此处也有三个函数,同样对应注册,登录,信息展示,同时app.py通过import将这三个方法导入。
# db.py
import pymysql
# conn = pymysql.connect("数据库地址", "用户名", "密码", "数据库名称")
conn = pymysql.connect("localhost", "root", "123456", "user_info")
# 直接conn.cursor()返回的是一个二元元组,加入参数"pymysql.cursors.DictCursor"可以返回一个字典形式类似[{},{},{}]
cur = conn.cursor(pymysql.cursors.DictCursor)
# 注册相关的函数,将用户输入的用户名和密码写入数据库
def write(username, password):
sql = f"insert into user (username, password) values ('{username}', '{password}')"
cur.execute(sql)
conn.commit()
# 登录相关的函数,判断用户名和密码是否存在
def is_existed(username, password):
# 方法一:全部取出一次判断
# sql = "select * from user"
# cur.execute(sql)
# result = cur.fetchall()
# for row in result:
# if row[1] == username and row[2] == password:
# return True
# return False
# 方法二:边取出边判断
sql = f"select * from user where username = '{username}' and password = '{password}'"
cur.execute(sql)
result = cur.fetchall()
if len(result) == 0:
return False
return True
# 展示用户信息的函数
def show():
sql = "select * from user"
cur.execute(sql)
result = cur.fetchall()
return result
'''注:由于三个函数的操作可能是多次进行,每一个函数结束都不可关闭数据库,否则进行下一步就会报错。
但这样一直不关数据库会造成资源浪费,可以把连接数据库的语句写到函数内部,每次运行完关闭,下一次重新连接。
这样不知道怎么样,多次连接数据库是否会使效率变低,后期还需学习。'''
3. templates文件中的代码
这里是两个html页面的展示,分别是用来展示用户注册和登录的hello.html和显示用户信息的user.html。注册和登录页面本应该有所不同,但由于主要探讨方法的实现,我就没有加以区分。
<!--hello.html-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div style="text-align: center;">
<h1>某某网站</h1>
<!--message参数由app.py传入,用来显示错误信息-->
<span style="color: #ff0000;">{% if message %} {{message}} {% endif %}</span>
<form method='post'>
账号<input type="text" name="username" placeholder="username"/>
<br/>
密码<input type="password" name="password" placeholder="password"/>
<br/>
<input type="submit" name="submit" value="提交"/>
<input type="reset" value="重置"/>
</form>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>用户信息</title>
</head>
<body>
<h1>用户信息详情</h1>
<table border="1px">
<tr>
<th>ID</th>
<th>用户名</th>
<th>密码</th>
</tr>
<!--这里的datas是app.py中返回的数据,包含数据库中所有信息-->
{% for i in datas %}
<tr>
<!--
由于之前数据库连接传入参数 pymysql.cursors.DictCursor,返回结果是一个列表中包含字典的
形式,因此可以通过i["id"]这样访问
-->
<td>{{i["id"]}}</td>
<td>{{i["username"]}}</td>
<td>{{i["password"]}}</td>
</tr>
{% endfor %}
</table>
</body>
</html>
三、运行结果
启动程序app.py,地址栏输入http://127.0.0.1:5000/register,进入如下注册页面:
首先数据库中是只有一条数据的:
注册一个lisi,密码123,点击提交。再次进入workbench:
lisi已被成功加入数据库中。同样的方法再添加几条:
可以看到目前一共四条数据。id部分有跳行是因为我之前删过一部分数据。接下来输入http://127.0.0.1:5000/login进行登录,测试均是可以的。如果输入账号或密码错误会报错。
输入http://127.0.0.1:5000/user,可以看到所有用户的信息:
四、总结
通过这次的学习,初步了解了mysql和flask的基本使用,但是正如之前所说,目前的成果还是很简陋的。后期还需深入学习。