python web学习2-连接数据库


前言

之前学习了用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的基本使用,但是正如之前所说,目前的成果还是很简陋的。后期还需深入学习。

Python中,我们可以使用许多不同的库来读写数据库。其中最常用的是Python的标准库中的sqlite3模块,它可以用于与SQLite数据库进行交互。 要使用sqlite3模块,我们首先需要导入它: ```python import sqlite3 ``` 接下来,我们可以使用connect()函数连接到一个数据库文件,如果该文件不存在,它将创建一个新的数据库文件: ```python conn = sqlite3.connect('database.db') ``` 在数据库中创建一个新的表格非常简单。我们可以使用execute()函数执行SQL语句来创建一个新的表格,并使用commit()函数提交更改: ```python conn.execute('''CREATE TABLE students (id INT PRIMARY KEY NOT NULL, name TEXT NOT NULL, age INT NOT NULL);''') conn.commit() ``` 要在表格中插入数据,我们可以使用execute()函数执行INSERT INTO语句,并使用commit()函数提交更改: ```python conn.execute("INSERT INTO students (id, name, age) VALUES (1, 'John', 20)") conn.execute("INSERT INTO students (id, name, age) VALUES (2, 'Mary', 22)") conn.execute("INSERT INTO students (id, name, age) VALUES (3, 'Tom', 18)") conn.commit() ``` 查询数据非常简单。我们可以使用execute()函数执行SELECT语句,并使用fetchall()函数检索所有的结果: ```python cursor = conn.execute("SELECT * FROM students") results = cursor.fetchall() for row in results: print("ID:", row[0]) print("Name:", row[1]) print("Age:", row[2]) ``` 最后,我们还需要关闭数据库连接: ```python conn.close() ``` 这只是使用Python和sqlite3模块进行数据库读写的基本示例。实际上,我们还可以使用其他库(如PyMySQL、psycopg2等)与不同类型的数据库(如MySQL、PostgreSQL等)进行交互,但基本原理是类似的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值