用Flask搭建一个web应用(三)---拆分models.py&解决循环引用

2023-11-19

在app.py同级目录下建立models.py

models.py:

from flask_sqlalchemy import SQLAlchemy
from app import db


class Article(db.Model):
    # 定义表名
    __tablename__ = 'article'
    # 定义字段
    # db.Column 表示是一个字段
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), unique=True)

app.py

from flask import Flask,render_template
from flask import jsonify,request
from flask_admin import Admin
from flask_admin.contrib.sqla import ModelView
import pandas as pd
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
import time
from flask_sqlalchemy import SQLAlchemy
from models import Article
import pymysql

app = Flask(__name__)
admin = Admin(app=app, name='后台管理系统')
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:123@127.0.0.1:3306/JiaBlog"
app.config['SQLALCHEMY_COMMIT_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['JSON_AS_ASCII'] = False
db = SQLAlchemy(app)


# class Article(db.Model):
#     # 定义表名
#     __tablename__ = 'article'
#     # 定义字段
#     # db.Column 表示是一个字段
#     id = db.Column(db.Integer, primary_key=True)
#     name = db.Column(db.String(50), unique=True)


# db.drop_all()     # 删除表
# db.create_all()   # 建表


@app.route('/')
def hello_world():
    return render_template('index.html')


@app.route('/predict',methods=["GET", "POST"])
def predict():
    data = {"success": False}

    params = request.json
    if (params == None):
        params = request.args

    # 若发现参数,则返回预测值
    if (params != None):
        x = pd.DataFrame.from_dict(params, orient='index').transpose()

    return jsonify(data)


@app.route('/detail',methods=["GET","POST"])
def detail():
    articles = Article.query.all()
    print(articles)
    model_to_dict(articles)
    return jsonify(model_to_dict(articles))


def model_to_dict(result):
    from collections import Iterable
    try:
        if isinstance(result, Iterable):
            tmp = [dict(zip(res.__dict__.keys(), res.__dict__.values())) for res in result]
            for t in tmp:
                t.pop('_sa_instance_state')
        else:
            tmp = dict(zip(result.__dict__.keys(), result.__dict__.values()))
            tmp.pop('_sa_instance_state')
        return tmp
    except BaseException as e:
        print(e.args)
        raise TypeError('Type error of parameter')


if __name__ == '__main__':
    app.run(debug=True)

看起来一切都很美好,但是你启动就会报错

ImportError: cannot import name 'db'

这就是循环引用报错,主app需要models.py中的数据库模型,但是models.py启动时发现没有这个db,因为db是在主app中初始化的,解决方法:

新增exts.py

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

先不初始化,即不和app绑定在一起

app.py

from flask import Flask,render_template
from flask import jsonify,request
from flask_admin import Admin
from flask_admin.contrib.sqla import ModelView
import pandas as pd
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
import time
from flask_sqlalchemy import SQLAlchemy
from exts import db
from models import Article
import pymysql

app = Flask(__name__)
admin = Admin(app=app, name='后台管理系统')
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:123@127.0.0.1:3306/JiaBlog"
app.config['SQLALCHEMY_COMMIT_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['JSON_AS_ASCII'] = False
db.init_app(app)  # 注意这里



# class Article(db.Model):
#     # 定义表名
#     __tablename__ = 'article'
#     # 定义字段
#     # db.Column 表示是一个字段
#     id = db.Column(db.Integer, primary_key=True)
#     name = db.Column(db.String(50), unique=True)


# db.drop_all()     # 删除表
# db.create_all()   # 建表


@app.route('/')
def hello_world():
    return render_template('index.html')


@app.route('/predict',methods=["GET", "POST"])
def predict():
    data = {"success": False}

    params = request.json
    if (params == None):
        params = request.args

    # 若发现参数,则返回预测值
    if (params != None):
        x = pd.DataFrame.from_dict(params, orient='index').transpose()

    return jsonify(data)


@app.route('/detail',methods=["GET","POST"])
def detail():
    articles = Article.query.all()
    print(articles)
    model_to_dict(articles)
    return jsonify(model_to_dict(articles))


def model_to_dict(result):
    from collections import Iterable
    try:
        if isinstance(result, Iterable):
            tmp = [dict(zip(res.__dict__.keys(), res.__dict__.values())) for res in result]
            for t in tmp:
                t.pop('_sa_instance_state')
        else:
            tmp = dict(zip(result.__dict__.keys(), result.__dict__.values()))
            tmp.pop('_sa_instance_state')
        return tmp
    except BaseException as e:
        print(e.args)
        raise TypeError('Type error of parameter')


if __name__ == '__main__':
    app.run(debug=True)

然后models.py

from flask_sqlalchemy import SQLAlchemy
from exts import db


class Article(db.Model):
    # 定义表名
    __tablename__ = 'article'
    # 定义字段
    # db.Column 表示是一个字段
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), unique=True)

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用Flask搭建一个web应用(三)---拆分models.py&解决循环引用 的相关文章

随机推荐

  • 深度学习如何集成领域知识?IBM研究等《知识增强深度学习》综述,全面阐述科学与经验知识增强的深度学习...

    来源 专知 尽管在过去的几年里 深度学习模型在许多不同的领域取得了巨大的成功 但通常数据匮乏 在不可见的样本上表现不佳 而且缺乏可解释性 目标领域往往存在各种先验知识 利用这些先验知识可以弥补深度学习的不足 为了更好地模仿人类大脑的行为 人
  • 下面是两种解决Redis击穿问题的方法,并给出相应的Java代码实现。

    Redis击穿问题指的是当一个key在缓存中过期时 恰好有大量并发请求访问该key 导致请求直接打到数据库 引起数据库压力过大 甚至宕机 方法一 使用互斥锁 在访问缓存之前 首先获取一个互斥锁 防止多个请求同时访问数据库 只有一个请求可以访
  • 转 用十条命令在一分钟内检查Linux服务器性能

    如果你的Linux服务器突然负载暴增 告警短信快发爆你的手机 如何在最短时间内找出Linux性能问题所在 来看Netflix性能工程团队的这篇博文 看它们通过十条命令在一分钟内对机器性能问题进行诊断 概述 通过执行以下命令 可以在1分钟内对
  • 开发百度地图定位APP(LBS)

    一 注册成为百度地图开发者 并获取开发密钥 获取密钥时需要进入Android studio使用keytool文件获取SHA1码 二 下载开发包解压并导入Android studio 选择自己需要的开发包下载 这里我选择的是基础地图基础定位J
  • C#类和对象--习题(2)成绩管理

    老师口中说 少用static 然后有习题要我们用static来写 实现简单学生成绩管理 两个类 方法带static 1 学生及信息录入 id name grade 2 输出成绩 3 修改成绩 4 查询成绩 5 显示成绩 6 退出系统 Met
  • 卓越性能代码_教你Win10启用卓越性能模式,效果明显!

    本文授权转载自公众号 labulac 当Windows 10更新到内部版本17333后 一些朋友可能发现 以往电源管理模式有节能 标准和高性能三个选项 现在装完系统默认启用的是标准选项 剩下的两个模式被隐藏了 当然我们也可以将这些电源模式找
  • Vue插槽用法,在JSX中的用法

    注意 scopedSlots会包含 slots里面的内容 所以我们两个一起使用的时候 名字要不一样 scopedSlots 里面的属性值是函数 可以调用这个函数进行渲染 scopedSlots会包含 slots slots 里面的属性值是一
  • Java如何设置线程的优先级呢?

    转自 Java如何设置线程的优先级呢 线程 thread 是操作系统能够进行运算调度的最小单位 它被包含在进程之中 是进程中的实际运作单位 一条线程指的是进程中一个单一顺序的控制流 一个进程中可以并发多个线程 每条线程并行执行不同的任务 在
  • 从零开始搭建uni-app框架的小程序开发环境

    个人主页 个人主页 推荐专栏 小程序开发成神之路 作者简介 一个读研中创业 打工中学习的能搞全栈 也搞算法 目前在搞大数据的奋斗者 您的小小关注是我持续输出的动力 文章目录 一 小程序账号的开通 1 注册小程序账号 2 获取小程序身份证 A
  • 寒假小复习2

    package demo public class Demo public static void main String args int i 2 switch i case 1 System out println System out
  • Pytorch学习笔记(二)

    后续遇到一些函数等知识 还会进行及时的补充 tensor的创建 使用pytorch中的列表创建tensor tensor torch Tensor 1 1 0 2 print
  • python 基础

    条件表达式 if 1 gt 2 print 111 elif 2 gt 3 print 222 else print 333 for循环 for i in range 3 10 print i 输出结果 for循环 步长为2 for i i
  • QStyle 自定义QSpinBox外观

    点击查看详细介绍 头文件 ifndef SPINBOX STYLE 1 H define SPINBOX STYLE 1 H include
  • 【高等数学基础知识篇】——函数,极限与连续

    本文仅用于个人学习记录 使用的教材为汤家凤老师的 高等数学辅导讲义 本文无任何盈利或者赚取个人声望的目的 如有侵权 请联系删除 文章目录 一 函数基础知识 1 1 基本初等函数和初等函数 1 2 函数的初等特性 1 3 特殊函数 二 函数题
  • PageHelper的order by方法可替代mybatis中order by必须使用$来避免sql注入

    PageHelper的order by方法可替代mybatis中order by必须使用 来避免sql注入 在my batis中 我们通常使用 字符 来传值 在mybatis中使用order by排序时也习惯性的使用 然后发现sql错误 后
  • 【数学建模笔记 24】数学建模的时间序列模型

    24 时间序列模型 定义 时间序列是按时间顺序排列的 随时间变化且相互关联的数据序列 分析时间序列的方法构成数据分析的一个重要领域 即时间序列分析 一个时间序列往往是以下几类变化形式的叠加 长期趋势变动 T t T t Tt 朝一定方向的变
  • zabbix 通过import批量导入新增主机和批量删除旧的主机

    通过import批量导入新增主机 本文采用zabbix的hosts页面的import 批量导入 zabbix3 2版本批量导入模板 bin bash filename zbx xml echo
  • 『sklearn学习』多种模型预测脸的下半部分的结果对比

    预测脸的下半部分 import numpy as np import matplotlib pyplot as plt from sklearn datasets import fetch olivetti faces from sklea
  • Opencv载取任意长度视频

    文章目录 使用Opencv截取仍意长度视频 使用Opencv截取仍意长度视频 import cv2 import sys def select video input path output path start 1 end 1 input
  • 用Flask搭建一个web应用(三)---拆分models.py&解决循环引用

    在app py同级目录下建立models py models py from flask sqlalchemy import SQLAlchemy from app import db class Article db Model 定义表名