本文首發于公眾號:Hunter后端
原文鏈接:Flask筆記三之連接使用數據庫
這一節介紹 Flask 與數據庫的連接,以及接口里查詢數據的操作。
這里使用的是 SQLAlchemy
+ pymysql
實現與數據庫的連接,SQLAlchemy
的詳細介紹見之前的筆記有過一篇基礎的介紹,這里只介紹與 Flask 的嵌入使用。
本篇筆記的代碼都已經提交到 github 上,可使用下面的操作獲取代碼:
git clone https://github.com/x1204604036/flask_backend.git
以下是本篇筆記目錄:
- 安裝依賴
- 定義和連接數據庫
- 接口使用數據庫
0、安裝依賴
安裝相關依賴:
pip3 install sqlalchemy==2.0.19
pip3 install pymysql==1.1.0
1、定義和連接數據庫
首先,在 app/config/development.py 里定義我們的數據庫相關變量,內容如下:
# app/config/development.pyMYSQL_CONNECT_TYPE = "mysql+pymysql"
MYSQL_USERNAME = "root"
MYSQL_PASSWORD = "123456"
MYSQL_HOST = "192.168.1.3"
MYSQL_PORT = 3306
MYSQL_DB_NAME = "flask_db"
接下來定義 user 相關的 model,在 app/ 文件夾下創建一個 models/ 文件夾,其下創建一個 user.py 文件,內容如下:
# app/models/user.pyfrom sqlalchemy import Column, Integer, String
from app.database import Baseclass User(Base):__tablename__ = "user"id = Column(Integer, primary_key=True, autoincrement=True)username = Column(String(50), unique=True)email = Column(String(120), default="", comment="郵箱")password = Column(String(120))
在 app/ 文件夾下創建一個文件 database.py,其內容如下:
# app/database.py from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from app.config import configengine_str = "%s://%s:%s@%s:%s/%s?charset=utf8" % (config.MYSQL_CONNECT_TYPE,config.MYSQL_USERNAME,config.MYSQL_PASSWORD,config.MYSQL_HOST,config.MYSQL_PORT,config.MYSQL_DB_NAME,
)engine = create_engine(engine_str)db_session = scoped_session(sessionmaker(autocommit=False,autoflush=False,bind=engine,)
)Base = declarative_base()
Base.query = db_session.query_property()def init_db(app):import app.models.userBase.metadata.create_all(bind=engine)
在這里,從 config 配置文件中獲取 MySQL 的連接信息,然后創建 engine
最后定義一個初始化數據庫的函數,用于創建所有定義了的數據庫模型,在這里是引入了 User 這個 model
然后在 app/init.py 里引入數據庫,文件內容如下:
# app/__init__.pyfrom flask import Flaskdef create_app():app = Flask(__name__)app.config.from_object("app.config.config")app.secret_key = b'f0e97d3012eed1c2939ac1a62ce1e8d455e86fa9da47b26c94a9af4119be29d6'from . import databasedatabase.init_db(app)from .user import bp_userapp.register_blueprint(bp_user.bp)return app
啟動 Flask 服務,運行 flask run,就可以看到對應的數據庫下多了我們創建的 user 表了。
接下來,我們改寫上一篇筆記中的接口定義,從數據庫中獲取數據
2、接口使用數據庫
以下是 app/user/bp_user.py 的內容:
from flask import Blueprint, request, session, jsonify
from werkzeug.security import generate_password_hash, check_password_hash
from app.models.user import User
from app.database import db_sessionbp = Blueprint("user", __name__, url_prefix="/user")@bp.route("/register", methods=("POST",))
def register():request_json = request.jsonusername = request_json.get("username")password = request_json.get("password")email = request_json.get("email")if not username or not password or not email:return {"code": -1, "msg": "請傳遞用戶名、密碼、郵件等必要信息"}user = User.query.filter(User.username == username, User.email == email).first()if user:return {"code": -1, "msg": "用戶已存在"}new_user = User(username=username,email=email,password=generate_password_hash(password))db_session.add(new_user)db_session.commit()return {"code": 0, "msg": "注冊成功"}@bp.route("/login", methods=("POST",))
def login():username = request.form.get("username")password = request.form.get("password")if not username or not password:return {"code": -1, "msg": "請上傳用戶名和密碼"}user = User.query.filter(User.username == username).first()if not user:return {"code": -1, "msg": "用戶不存在"}if not check_password_hash(user.password, password):return {"code": -1, "msg": "密碼驗證失敗"}session.clear()session["user_id"] = user.idreturn {"code": 0, "msg": "success"}def login_required(func):def wrapped(*args, **kwargs):if session.get("user_id") is None:return jsonify({"code": -1, "msg": "請先登錄系統"}), 401return func(*args, **kwargs)return wrapped@bp.route("/logout", methods=("POST",))
def logout():session.clear()return {"code": 0, "msg": "logout success"}@bp.route("/user_info", methods=("POST",))
@login_required
def get_user_info():user_id = session.get("user_id")user_info = {"user_id": user_id}return {"code": 0, "msg": "success", "user_info": user_info}
在這里實現了四個接口:
- /register 為注冊接口,用于注冊用戶
- /login 為登錄接口,記錄了登錄信息
- /user_info 為獲取用戶信息接口,使用到自己寫的一個需要登錄的裝飾器
- /logout 為登出接口
以上就完成了 Flask 連接使用數據庫的示例。