一、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和安裝的驅動程序,進行相應的配置即可。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/204338.html