Flask创建多对多键,配置优化,传递json接口

本文详细介绍了在Flask中如何创建和删除多对多关系的中间键,包括使用原生SQL和模型参数的方式。此外,文章还涵盖了Flask应用的配置优化,如工程文件、配置函数和图形化界面调试。最后,讲解了如何接收和处理JSON接口,包括安装所需库和定义请求处理方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建modles中的多对多键

格式是固定格式:
设置一个表装入两个表的链接参数
注意是设置两个外键和!主键!负责链接两个列表

sc = db.Table('sc'(数据库列表名),
        # 创建两个列,分别设置链接的外键
          db.Column('ss_id', db.Integer, db.ForeignKey('student.s_id')(链接student id的键), 
          primary_key=True),
          db.Column('cc_id', db.Integer, db.ForeignKey('course.c_id'), 
          primary_key=True)

定义的两个类中需要注意:secondary参数表示链接中间列表

#学生类
class Student(db.Model):
    s_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    s_name = db.Column(db.String(20), unique=True)
    s_age = db.Column(db.Integer, default=18)
    __teblename__ = 'student'

    def __init__(self, name, age):
        self.s_name = name
        self.s_age = age


class Course(db.Model):
    c_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    # 两个类任意一个写入字段链接中间键,重要参数secondary
    stus = db.relationship('Student', secondary=sc, backref='cou')

    # 不写名字,系统默认类的名字
    def __init__(self, name):
        self.c_name = name

下面是数据库中创建的表
这里写图片描述

创建中间键

方法一:原生sql语句

if request.method == 'POST':
    # 方法一:
    ss = request.form.get('studen')
    cc = request.form.get('course')
    sql = 'insert into sc values(%s,%s)' % (ss, cc)
    db.session.execute(sql)
    db.session.commit()

方法二:append
利用models中的参数

# 方法二:
        ss = request.form.get('studen')
        cc = request.form.get('course')
        stuq = Student.query.get(ss)
        couq = Course.query.get(cc)

        # couq.students.append(stuq)
        # db.session.add(couq)

        db.session.add(stuq)
        stuq.cou.append(couq)

        db.session.commit()

通过学生.cou找到课程,
通过课程.stus找到学生然后append进去都可以,无论顺序先后
这里写图片描述
当然如果想要同时创建多个参数可以用getlist获取页面传来的参数转化成列表

    #同时获取多个参数传入数据库
    cc = request.form.getlist('course')
    stuq = Student.query.get(ss)

    for i in cc:
        couq = Course.query.get(i)
        couq.students.append(stuq)
        db.session.add(couq)
    db.session.commit()

删除中间键

remove
同理通过定义的不同的两种参数方式删除都可以

def dele_cour(s_id, c_id):
    # 找到队对应的字段
    stuq = Student.query.get(s_id)
    couq = Course.query.get(c_id)
    # 删除
    couq.students.remove(stuq)
    # 通过学生找方向参数删除也可以
    stuq.cou.remove(couq)
    db.session.commit()

美化配置

由于Flask所有都需要自己配置,于是我们可以参照django的框架去配置对应的参数,也就是说最后与其不同之处在于缺少urls文件,因为Flask方法和域名都在一起执行的

配置工程文件

  1. 把我们的配置app的参数调用进来,而不是写在app文件中
  2. 美化app参数
    由于太多重复的参数,比如静态,网络文件参数,配置db,api等我们需要将它单独设置进一个文件里
  3. 写入settings配置的,比如链接数据库,可以写成django类似的模型,避免长格式传参不美观又麻烦
  4. 写入配置时候使用的方式方法,可以直接调用
    效果如下:
    这里写图片描述从上到下依次为:app工程1,静态文件,app工程2,页面,工程文件

配置app

说白了就是之前的Flask(__name__)写到这里来
只不过为了简化,将其中的静态、页面和链接数据库参数单独提出来写入settings中然后调用
这里写图片描述

配置settings

前面说了是将参数写到这里然后引用,类似和django差不多也是在settings中配置参数

import os
from utlis.functions import get_db_url
# 基础路径
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 页面模版
static_dir = os.path.join(BASE_DIR, 'static')
# 静态模版
templates_dir = os.path.join(BASE_DIR, 'templates')
# 数据库配置
DATABASE = {
    # 用户
    'USER': 'root',
    # 密码
    'PASSWORD': '147258',
    # 主机
    'HOST':  'localhost',
    # 端口
    'PORT': '3306',
    # 数据库
    'DB': 'mysql',
    # 驱动
    'DRIVER': 'pymysql',
    # 数据库名字
    'NAME': 'flask3',
}
SQLALCHEMY_DATABASE_URI = get_db_url(DATABASE)

需要注意的是配置数据库的参数,写成这样直接美观,但是注意的是Flask数据库的写法之前我们说过因此下面我们需要对其进行转换

配置function

见名知意,就是写入方法的参数,然后引用他
下面我们写入数据库的方法,通过传入的字典,然后取键值段得到参数,按照对应格式传入进去

# 方法链接数据库
def get_db_url(DATABASE):
    # 使用get与‘【】’区别在于如果没有参数get默认没有不会报错
    user = DATABASE.get('USER')
    password = DATABASE.get('PASSWORD')
    host = DATABASE.get('HOST')
    port = DATABASE.get('PORT')
    dbd = DATABASE.get('DB')
    driver = DATABASE.get('DRIVER')
    name = DATABASE.get('NAME')

    return '{}+{}://{}:{}@{}:{}/{}'.format(dbd, driver,
                                           user, password,
                                           host, port, name)

同理,db参数也可以写进来

from flask_sqlalchemy import SQLAlchemy
db = SQLALchemy()

# 定义调用方法传入app中
def init__ext(app):
    db.init_app(app=app)

这也就是上面创建APP中函数调用的来源

图形化界面显示dbug

安装

pip install flask-debugtoolbar

写入工程目录下的方法里

def init_ext(app):

    db.init_app(app=app)
    dbbugtoolbar.init_app(app=app)

在app文件中加上一句app.debug = True
效果如下:
这里写图片描述

接口传入json

安装

pip install Flask-RESTful
直接传入序列化的json就要安装
pip install flask-marshmallow

同样需要导入方法中

from flask_sqlalchemy import SQLAlchemy
from flask_debugtoolbar import DebugToolbarExtension
from flask_restful import Api
from flask_marshmallow import Marshmallow


db = SQLAlchemy()
dbbugtoolbar = DebugToolbarExtension()
api = Api()
ma = Marshmallow()

def init_ext(app):

    db.init_app(app=app)
    dbbugtoolbar.init_app(app=app)
    api.init_app(app=app)
    ma.init_app(app=app)

创建文件写入传入内容,比如:
这里fields中的参数名要和需要传入数据库参数列表名一致

from utlis.functions import ma
class StuMa(ma.Schema):

    class Meta:

        fields = ('s_name', 's_age')

stumarsh = StuMa()

然后在views方法中写入类,并指定传入url路径
获取学生主键为10的学生:

# 传递json
class Hello(Resource):

    def get(self):
        stuq = Student.query.get(10)
        # 如果不安装序列化就无法读取就需要写下面这种格式
        # return {'name': stuq.s_name,
        #         'age': stuq.s_age}
        # 安装后直接写
        return stumarsh.jsonify(stuq)


# 定义传入json的url
api.add_resource(Hello, '/api/hello/')

效果如下:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值