flask session_Flask学习笔记(四)

前言

前面我们学习了Flask如何构建一个程序的流程,又研究了它的路由如何设定,还对如何获取模板表单数据进行了梳理,这一篇文章来研究一下如何将Flask与数据库连接。 在这个系列的第一篇文章中,就已经提到之所以选择Flask的一个很重要的原因就是它和SQLAlchemy的对接做得比较好,而DjangoORM部分相对封闭了些,再加上之前自己的一个系统中用的也是SQLAlchemy的缘故。

这里稍插入一点题外话:家里的计算机上安装的是Lubuntu19.10,但在安装Mariadb数据库时,始终提示ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2)这个错误,研究了网上能找得到的方案都无助于解决,前后也完全删除并重装了数次,依旧没有效果,后想起是否可借助tasksel工具将LAMP直接安装上去,结果提示LAMP安装成功,但运行时依然有同样的错误发生,所以无奈之下准备卸载LAMP,但恰恰就是利用tasksel来取消勾选框后,卸载是卸载了,可系统重起后始终定于openbox登录界面无法加载成功,试了数次后,无奈只得用liveCD备份系统数据,并重新安装,之后直接升级到Lubuntu20.04版本,再安装Mariadb,然后运行mysql_secure_installation,竟然成功了,然而终究是无法知道原版本为何出问题了,鉴于在这个小问题上纠缠了两个小时,颇有些郁闷,故记于此,以期某天能知道是哪里出了故障。

连接数据的准备工作

刚才提到在系统中安装了Mariadb数据库,这个数据库是mysql的一个衍生版本,关于两者的恩怨同学们可以去网格上搜索,这里就不再重述了。 通过root帐号进入数据库中,创建新的数据库:
 create database mydb default character set utf8mb4 collate utf8mb4_unicode_ci;
这语句后面的 character 是设定数据库字符集。 准备好数据库后,要安装flask-sqlalchemy,这是Flask的一个插件,也相当于FlaskSQLAlchemy的一个接口,安装代码如下:
 pip3 install flask-sqlalchemy
为了使 Python 能和 mariadb 数据库连接起来,这里用的是 pymysql 驱动:
 pip3 install pymysql
创建数据表 首先要导入相应的包:
 from flask import Flask from flask_sqlalchemy import SQLAlchemy
接着创建与数据库的接口:
 app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@localhost:3306/mydb?charset=utf8' app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True db= SQLAlchemy(app)
上述代码中 app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True 这一行如果不添加,程序会报警告。 db=SQLAlchemy(app) 这一句即完成了将Flask与数据库的连接,所创建的db就是一个抽象的数据库对象。 下面我们来基于刚才创建的db对象构造一个User类:
class User(db.Model):     id     = db.Column(db.Integer, primary_key = True)     name   = db.Column(db.String(100))     email = db.Column(db.String(100))       passwd = db.Column(db.String(200))     demo   = db.Column(db.String(100))     def __init__(self, name, email, passwd, demo):         self.name = name         self.email = email         self.passwd = passwd         self.demo = demo
在上述类中,我们为 User 创建了五个字段,下面可以通过运行一句语句来将上述类映射到数据库中:
 db.create_all()
这时我们来 mysql 看看我们创建的表是否存在,如下图所示:

3c72dfeacfbf6f229b6663f44649750c.png

向数据库添加数据 在创建完成后,要开始对数据库进行操作,首先来添加数据,为了用户添加方便,我们需要添加一个用户输入界面,这个可以借鉴之前的用户登录页面设置:
<html>    <body>       <h3>用户信息录入h3>       <hr/>       <form action = "{{ request.path }}" method = "post">           <label for = "name">用户名:label>           <input type = "text" name = "name" placeholder = "用户名" /><br>           <label for = "email">邮 箱:label>           <input type = "text" name = "email" placeholder = "" /><br>           <label for = "passwd">密 码:label>           <input type ="password" name = "passwd" placeholder = "" /><br>           <label for = "demo">备 注:label>           <textarea name = "demo" placeholder = "">textarea><br>           <input type = "submit" value = "添加" />       form>    body> html>
这一次我们将表单的 action 直接指向当前路径,这就要求在当前路径所对应的函数中,对 POST 数据进行处理:
@app.route('/newuser/', methods = ['GET', 'POST'])def newuser():    if request.method == 'POST':        if request.form['name'] and request.form['email'] and request.form['passwd']:            curuser = User(request.form['name'], request.form['email'], request.form['passwd'], request.form['demo'])            db.session.add(curuser)            db.session.commit()            return redirect(url_for('dispAllUser'))    return render_template('newuser.html')
如果熟悉 SQLAlchemy 的同学,肯定对 session.add 以及 session.commit 这两个方法很熟悉,在 SQLAlchemy 中, session 是通过 sessionmakeengine 进行绑定后的实例化对象,而在 flask-sqlalchemy 中,这个 session 就直接通过 db 就可以访问,关于 db 的创建在上文中有提及。 注意:上述代码中,url_for()后面跟的函数必须与实际的函数相对应,而不是和路由一致。 显示的界面如下:

43cf95f1d7485d49fe31a9cf947cb8e8.png

将数据库的数据显示出来 在上述newuser的路由函数中,当用户添加成功后,会将页面重定向至显示所有用户页面的函数中,这就需要再来写一个页面,关于这一个可参考上一篇文章中显示所有用户的页面模板:
<html>   <head>head>   <body>      <h3>所有用户信息h3>      <h3>新建 (<a href = "{{ url_for('newuser') }}">增加用户a>)h3>      <table border="1">         <thead>            <tr>               <th>姓名th>               <th>邮箱th>               <th>密码th>               <th>备注th>            tr>         thead>                  <tbody>            {% for user in users %}               <tr>                  <td>{{ user.name }}td>                  <td>{{ user.email }}td>                  <td>{{ user.passwd }}td>                  <td>{{ user.demo }}td>               tr>            {% endfor %}         tbody>      table>   body>html>
当然,对于显示所有用户信息需要单独用一个路由来实现:
@app.route('/dispalluser/')def dispAllUser():   return render_template('dispalluser.html', users = User.query.all() )
上述代码中,我们向模板增加了一个User的变量,该变量将数据查询信息传递给模板dispalluser.html。 显示的结果如下:

829bec340c96e831abd2c4ab72c0e493.png

在数据库中查询的结果如下:

faab933df59c1202e9bc504eff620a20.png

小结 本文对 Flask 如何连接 mariadb 数据库进行了分析,并实现了一个用户信息的增加和查询功能,在接下来的学习中,我们将对该程序进行更好的完善。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值