在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)