本来使用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表中的外键)但是频繁的出问题。最后只好将功能分开写。