头图

本文首发于公众号:Hunter后端

原文链接:Flask笔记三之连接使用数据库

这一节介绍 Flask 与数据库的连接,以及接口里查询数据的操作。

这里使用的是 SQLAlchemy + pymysql 实现与数据库的连接,SQLAlchemy 的详细介绍见之前的笔记有过一篇基础的介绍,这里只介绍与 Flask 的嵌入使用。

本篇笔记的代码都已经提交到 github 上,可使用下面的操作获取代码:

git clone https://github.com/x1204604036/flask_backend.git

以下是本篇笔记目录:

  1. 安装依赖
  2. 定义和连接数据库
  3. 接口使用数据库

0、安装依赖

安装相关依赖:

pip3 install sqlalchemy==2.0.19
pip3 install pymysql==1.1.0

1、定义和连接数据库

首先,在 app/config/development.py 里定义我们的数据库相关变量,内容如下:

# app/config/development.py

MYSQL_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.py

from sqlalchemy import Column, Integer, String
from app.database import Base

class 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 config


engine_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.user
    Base.metadata.create_all(bind=engine)

在这里,从 config 配置文件中获取 MySQL 的连接信息,然后创建 engine

最后定义一个初始化数据库的函数,用于创建所有定义了的数据库模型,在这里是引入了 User 这个 model

然后在 app/__init__.py 里引入数据库,文件内容如下:

# app/__init__.py

from flask import Flask

def create_app():
    app = Flask(__name__)

    app.config.from_object("app.config.config")

    app.secret_key = b'f0e97d3012eed1c2939ac1a62ce1e8d455e86fa9da47b26c94a9af4119be29d6'

    from . import database
    database.init_db(app)

    from .user import bp_user
    app.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_session


bp = Blueprint("user", __name__, url_prefix="/user")


@bp.route("/register", methods=("POST",))
def register():
    request_json = request.json
    username = 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.id


    return {"code": 0, "msg": "success"}


def login_required(func):
    def wrapped(*args, **kwargs):
        if session.get("user_id") is None:
            return jsonify({"code": -1, "msg": "请先登录系统"}), 401
        return 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}

在这里实现了四个接口:

  1. /register 为注册接口,用于注册用户
  2. /login 为登录接口,记录了登录信息
  3. /user_info 为获取用户信息接口,使用到自己写的一个需要登录的装饰器
  4. /logout 为登出接口

以上就完成了 Flask 连接使用数据库的示例。

如果想获取更多后端相关文章,可扫码关注阅读:


Hunter
27 声望12 粉丝