一、Flask对数据库的支持
Flask是一个使用Python编写的Web应用框架,它基于Werkzeug工具箱和Jinja2模板引擎。与Django不同的是,Flask并不内置ORM,但是可以通过扩展外部包实现数据过滤、查询和逻辑操作。
Flask应用程序中,与数据库相关的操作需要使用某种数据库API,比如MySQLdb、psycopg2、SQLite等。这些API允许Flask与不同类型的数据库通信。
Flask支持以下数据库:
- SQLite
- PostgreSQL
- MySQL
- Oracle
- Microsoft SQL Server
二、使用SQLite作为Flask应用程序的数据库
SQLite是一种轻量级数据库管理系统,适合于小型的应用程序和嵌入式设备。在Flask应用程序中使用SQLite非常简单,只需安装SQLite驱动程序即可。可以使用pip工具进行安装,命令为:
pip install sqlite3
在Flask应用程序中,连接SQLite数据库的代码如下:
import sqlite3
from flask import Flask
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your secret key'
def connect_db():
"""连接SQLite数据库"""
conn = sqlite3.connect('database.db')
conn.row_factory = sqlite3.Row
return conn
这里使用了Flask提供的app.config字典属性,定义了一个名为'SECRET_KEY'的全局变量。secret key在Flask应用程序中用于加密Session和CSRF数据。这个全局变量可以在应用程序任何地方获取。
函数connect_db()用于连接SQLite数据库。函数内部使用sqlite3模块提供的connect()方法创建一个名为'database.db'的数据库文件,并将文件对象存储在变量conn中。row_factory属性设置为sqlite3.Row,它将返回每一行作为一个可访问属性的对象。
在Flask应用程序中使用SQLite数据库的一个简单示例如下:
# -*- coding: utf-8 -*-
from flask import Flask, request, session, g, redirect, url_for, \
abort, render_template, flash
from contextlib import closing
import sqlite3
# 配置数据库连接
DATABASE = '/path/to/your/database.db'
DEBUG = True
SECRET_KEY = 'development key'
USERNAME = 'admin'
PASSWORD = 'default'
app = Flask(__name__)
app.config.from_object(__name__)
# 连接数据库
def connect_db():
"""连接数据库,返回SQLite数据库连接对象"""
return sqlite3.connect(app.config['DATABASE'])
# 初始化数据库
@app.before_request
def before_request():
"""在请求之前建立数据库连接"""
g.db = connect_db()
# 关闭数据库连接
@app.teardown_request
def teardown_request(exception):
"""随请求结束时关闭数据库连接"""
db = getattr(g, 'db', None)
if db is not None:
db.close()
# 显示所有条目
@app.route('/')
def show_entries():
"""显示所有条目"""
cur = g.db.execute('select title, text from entries order by id desc')
entries = [dict(title=row[0], text=row[1]) for row in cur.fetchall()]
return render_template('show_entries.html', entries=entries)
# 添加新条目
@app.route('/add', methods=['POST'])
def add_entry():
"""新增条目"""
if not session.get('logged_in'):
abort(401)
g.db.execute('insert into entries (title, text) values (?, ?)',
[request.form['title'], request.form['text']])
g.db.commit()
flash('New entry was successfully posted')
return redirect(url_for('show_entries'))
# 登录页面
@app.route('/login', methods=['GET', 'POST'])
def login():
"""用户登录"""
error = None
if request.method == 'POST':
if request.form['username'] != app.config['USERNAME']:
error = 'Invalid username'
elif request.form['password'] != app.config['PASSWORD']:
error = 'Invalid password'
else:
session['logged_in'] = True
flash('You were logged in')
return redirect(url_for('show_entries'))
return render_template('login.html', error=error)
# 注销
@app.route('/logout')
def logout():
"""注销"""
session.pop('logged_in', None)
flash('You were logged out')
return redirect(url_for('show_entries'))
# 启动应用程序
if __name__ == '__main__':
app.run()
这个示例应用程序包括一些基本的页面,例如显示所有条目、新增条目、用户登录、注销等。在打开应用程序时,连接到SQLite数据库,并使用在before_request中定义的connect_db()函数,随后显示所有的条目。在提交new entry请求时,将使用add_entry()函数将数据添加到数据库中。
三、使用其他类型的数据库
除了SQLite,Flask还支持其他类型的数据库,例如PostgreSQL、MySQL、Oracle和Microsoft SQL Server。在使用这些数据库之前,需要安装相应的数据库驱动程序。
以MySQL为例,要连接MySQL需要安装mysql-connector-python模块。可以使用pip工具进行安装,命令为:
pip install mysql-connector-python
在Flask应用程序中连接MySQL的方法如下:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://username:password@hostname/database'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
这里使用了Flask_SQLAlchemy扩展。后面的URI指定了MySQL服务器的连接地址,其中包括用户名、密码和数据库名称。
连接其他类型的数据库的方法也类似,只需根据数据库API和安装的驱动程序,进行相应的配置即可。