创建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方法和域名都在一起执行的
配置工程文件
- 把我们的配置app的参数调用进来,而不是写在app文件中
- 美化app参数
由于太多重复的参数,比如静态,网络文件参数,配置db,api等我们需要将它单独设置进一个文件里 - 写入settings配置的,比如链接数据库,可以写成django类似的模型,避免长格式传参不美观又麻烦
- 写入配置时候使用的方式方法,可以直接调用
效果如下:
从上到下依次为: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/')
效果如下: