本来使用flask框架制作网页并实现登录和注册在几天前就已经实现了,不过当时没有设计到一些数据库之间的关联,而且使用了的是pymysql并且反复的打开数据库的方式。现在这次使用的是数据库池的方式,然后不同的数据库之间也设定了外键。

import pymysql
from dbutils.pooled_db import PooledDB

class MysqlConfig(object):

    DEBUG = True
    SECRET_KEY = "whatisyourname"
    '''SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:121061@localhost:3306/mall"
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SQLALCHEMY_ECHO = True'''

'''如果使用的是SQLALchemy的话,然后是“mysql+pymysql//......”这种的话,
 就需要联系上下文来创建数据库'''

POOL = PooledDB(
        creator=pymysql, #使用连接数据库的模块
        maxconnections=6, # 连接池允许的最大链接数
        mincached=2, # 初始化的时候至少创建两个链接
        blocking=True,# 连接池中如果没有可用的链接,就阻塞等待

        host='127.0.0.1',
        port=3306,
        user='root',
        password='139700',
        database='mall',
        charset='utf8'
    )

然后用数据库池设计了一些方法。比如下面的登录功能。

def cursor_login(sql, keyword):
    conn = POOL.connection()
    cursor = conn.cursor()
    cursor.execute(sql, keyword)
    result = cursor.fetchone()
    cursor.close()
    conn.close()
    return result
    #传出来一个查询结果
    #sql需要自己填写,使用sql语句

和注册功能。

def cursor_insert_justid(sql, values):
    conn = POOL.connection()
    cursor = conn.cursor()
    cursor.execute(sql, values)
    conn.commit()
    last_insert_id = cursor.lastrowid #获取最后输入的行的id
    cursor.close()
    conn.close()
    return last_insert_id

def cursor_insert(sql, values):
    conn = POOL.connection()
    cursor = conn.cursor()
    cursor.execute(sql, values)
    conn.commit()
    cursor.close()
    conn.close()

但是注册功能实现的不是很对。因为正常的写法出了一些问题,所以不得不这么写。
下面是本来的程序。

@register.route('/register', methods=['POST'])
def registerlogic():
    if request.method == 'POST':
        account = request.form['account']
        originpassword = request.form['password']
        password = hash_password(originpassword)
        #这一部分是通过sql语句往user表里面写入用户的账户密码信息
        sql = "insert into user(account, password) values(%s, %s)"
        values = (account, password)
        last_id = cursor_insert_justid(sql, values)
        user = User.query.filter(account=account).first()
        user_id = user.id
        sql = "insert into court(user_id) values(%s)"
        values = (user_id, )
        return render_template('login.html')

这里是想着想插入account和password,然后再获取account所在行的id,然后通过cursor_insert方法传输到court表的user_id中。(user_id设定的是court表中的外键)但是频繁的出问题。最后只好将功能分开写。