Python Flask app.run是否创建实体副本?
我使用了Python(3.6.4)、Flask(0.12.2)、Flask_admin(1.5.1)和Flask_sqlalchemy(2.3.2)的简单堆栈。我选择SQLite作为我的数据库 我的项目结构相当简单: 1) shared_db.pyPython Flask app.run是否创建实体副本?,python,sqlite,flask,flask-sqlalchemy,flask-admin,Python,Sqlite,Flask,Flask Sqlalchemy,Flask Admin,我使用了Python(3.6.4)、Flask(0.12.2)、Flask_admin(1.5.1)和Flask_sqlalchemy(2.3.2)的简单堆栈。我选择SQLite作为我的数据库 我的项目结构相当简单: 1) shared_db.py from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() from shared_db import db class City(db.Model): id = db.Colum
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
from shared_db import db
class City(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
def fill_data(app):
with app.app_context():
db.create_all()
db.session.add(City(name="Moscow"))
db.session.add(City(name="New York"))
db.session.add(City(name="London"))
db.session.add(City(name="Paris"))
db.session.commit()
from flask_admin.contrib.sqla import ModelView
from models import City
class CityView(ModelView):
column_display_pk = True # to force ids to appear in the Admin panel
column_hide_backrefs = False
column_list = ("id", "name")
def create_views(admin, db):
admin.add_view(CityView(City, db.session))
import os
from flask_admin import Admin
from flask import Flask, jsonify, make_response, request
from shared_db import db
from models import fill_data
from model_views import create_views
app = Flask(__name__)
app.config["SECRET_KEY"] = "123456790"
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////<path to the project>/myDB'
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
db.init_app(app)
fill_data(app)
admin = Admin(app, 'My app')
create_views(admin, db)
if __name__ == "__main__":
port = int(os.environ.get('PORT', 5000))
app.run(host='0.0.0.0', port=port, debug=True)
2) 型号.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
from shared_db import db
class City(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
def fill_data(app):
with app.app_context():
db.create_all()
db.session.add(City(name="Moscow"))
db.session.add(City(name="New York"))
db.session.add(City(name="London"))
db.session.add(City(name="Paris"))
db.session.commit()
from flask_admin.contrib.sqla import ModelView
from models import City
class CityView(ModelView):
column_display_pk = True # to force ids to appear in the Admin panel
column_hide_backrefs = False
column_list = ("id", "name")
def create_views(admin, db):
admin.add_view(CityView(City, db.session))
import os
from flask_admin import Admin
from flask import Flask, jsonify, make_response, request
from shared_db import db
from models import fill_data
from model_views import create_views
app = Flask(__name__)
app.config["SECRET_KEY"] = "123456790"
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////<path to the project>/myDB'
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
db.init_app(app)
fill_data(app)
admin = Admin(app, 'My app')
create_views(admin, db)
if __name__ == "__main__":
port = int(os.environ.get('PORT', 5000))
app.run(host='0.0.0.0', port=port, debug=True)
3) 模型视图.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
from shared_db import db
class City(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
def fill_data(app):
with app.app_context():
db.create_all()
db.session.add(City(name="Moscow"))
db.session.add(City(name="New York"))
db.session.add(City(name="London"))
db.session.add(City(name="Paris"))
db.session.commit()
from flask_admin.contrib.sqla import ModelView
from models import City
class CityView(ModelView):
column_display_pk = True # to force ids to appear in the Admin panel
column_hide_backrefs = False
column_list = ("id", "name")
def create_views(admin, db):
admin.add_view(CityView(City, db.session))
import os
from flask_admin import Admin
from flask import Flask, jsonify, make_response, request
from shared_db import db
from models import fill_data
from model_views import create_views
app = Flask(__name__)
app.config["SECRET_KEY"] = "123456790"
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////<path to the project>/myDB'
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
db.init_app(app)
fill_data(app)
admin = Admin(app, 'My app')
create_views(admin, db)
if __name__ == "__main__":
port = int(os.environ.get('PORT', 5000))
app.run(host='0.0.0.0', port=port, debug=True)
4) app.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
from shared_db import db
class City(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
def fill_data(app):
with app.app_context():
db.create_all()
db.session.add(City(name="Moscow"))
db.session.add(City(name="New York"))
db.session.add(City(name="London"))
db.session.add(City(name="Paris"))
db.session.commit()
from flask_admin.contrib.sqla import ModelView
from models import City
class CityView(ModelView):
column_display_pk = True # to force ids to appear in the Admin panel
column_hide_backrefs = False
column_list = ("id", "name")
def create_views(admin, db):
admin.add_view(CityView(City, db.session))
import os
from flask_admin import Admin
from flask import Flask, jsonify, make_response, request
from shared_db import db
from models import fill_data
from model_views import create_views
app = Flask(__name__)
app.config["SECRET_KEY"] = "123456790"
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////<path to the project>/myDB'
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
db.init_app(app)
fill_data(app)
admin = Admin(app, 'My app')
create_views(admin, db)
if __name__ == "__main__":
port = int(os.environ.get('PORT', 5000))
app.run(host='0.0.0.0', port=port, debug=True)
导入操作系统
从flask_admin导入admin
从烧瓶导入烧瓶,jsonify,作出响应,请求
从共享数据库导入数据库
从模型导入填充数据
从模型视图导入创建视图
app=烧瓶(名称)
app.config[“密钥”]=“123456790”
app.config['SQLALCHEMY\u DATABASE\u URI']='sqlite://///myDB'
app.config[“SQLALCHEMY\u TRACK\u MODIFICATIONS”]=False
db.init_应用程序(应用程序)
填充数据(应用程序)
admin=admin(应用程序“我的应用程序”)
创建视图(管理员、数据库)
如果名称=“\uuuuu main\uuuuuuuu”:
port=int(os.environ.get('port',5000))
app.run(host='0.0.0.0',port=port,debug=True)
最后,我删除了
myDB
-文件(如果存在),并使用python3app.py
运行该应用程序
令人惊讶的是,我最终得到了8个城市,而不是4个城市!我用DB Browser进行了一些调试,发现重复的4个城市就在最后一行代码--app.run(…)
执行之后创建
如何使用预填充的数据库正确运行flask应用程序 如果每次应用程序启动时都需要对数据库进行种子设定,则需要进行填充数据库幂等元的操作。换句话说,在创建对象之前,您需要检查对象是否已经存在(因为当您没有删除数据库时,应用程序完全有可能重新启动)。可能会帮助您通过SQLAlchemy完成此行为