Python Flask管理应用程序文件分离
我想知道如何将应用程序分为不同的文件,我知道这些文件是什么,但我想知道代码的哪些方面,所以我现在有, 烧瓶管理员/ 静止的/ 模板/ ---App.py 烧瓶管理员/ ---配置 ---跑 应用程序/ -静止的/ -模板/ ---观点 ---模型 ---Int ---形式 ---装饰师Python Flask管理应用程序文件分离,python,flask,flask-sqlalchemy,flask-admin,Python,Flask,Flask Sqlalchemy,Flask Admin,我想知道如何将应用程序分为不同的文件,我知道这些文件是什么,但我想知道代码的哪些方面,所以我现在有, 烧瓶管理员/ 静止的/ 模板/ ---App.py 烧瓶管理员/ ---配置 ---跑 应用程序/ -静止的/ -模板/ ---观点 ---模型 ---Int ---形式 ---装饰师 import os import os.path as op from flask import Flask from flask_sqlalchemy import SQLAlchemy from w
import os
import os.path as op
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from wtforms import validators
import flask_admin as admin
from flask_admin.contrib import sqla
from flask_admin.contrib.sqla import filters
# Create application
app = Flask(__name__)
# Create dummy secrey key so we can use sessions
app.config['SECRET_KEY'] = '123456790'
# Create in-memory database
app.config['DATABASE_FILE'] = 'sample_db.sqlite'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + app.config['DATABASE_FILE']
app.config['SQLALCHEMY_ECHO'] = True
db = SQLAlchemy(app)
# Create models
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
first_name = db.Column(db.String(100))
last_name = db.Column(db.String(100))
username = db.Column(db.String(80), unique=True)
email = db.Column(db.String(120), unique=True)
def __str__(self):
return self.username
# Create M2M table
post_tags_table = db.Table('post_tags', db.Model.metadata,
db.Column('post_id', db.Integer, db.ForeignKey('post.id')),
db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'))
)
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(120))
text = db.Column(db.Text, nullable=False)
date = db.Column(db.DateTime)
user_id = db.Column(db.Integer(), db.ForeignKey(User.id))
user = db.relationship(User, backref='posts')
tags = db.relationship('Tag', secondary=post_tags_table)
def __str__(self):
return self.title
class Tag(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Unicode(64))
def __str__(self):
return self.name
class UserInfo(db.Model):
id = db.Column(db.Integer, primary_key=True)
key = db.Column(db.String(64), nullable=False)
value = db.Column(db.String(64))
user_id = db.Column(db.Integer(), db.ForeignKey(User.id))
user = db.relationship(User, backref='info')
def __str__(self):
return '%s - %s' % (self.key, self.value)
class Tree(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64))
parent_id = db.Column(db.Integer, db.ForeignKey('tree.id'))
parent = db.relationship('Tree', remote_side=[id], backref='children')
def __str__(self):
return self.name
# Flask views
@app.route('/')
def index():
return '<a href="/admin/">Click me to get to Admin!</a>'
# Customized User model admin
class UserAdmin(sqla.ModelView):
inline_models = (UserInfo,)
# Customized Post model admin
class PostAdmin(sqla.ModelView):
# Visible columns in the list view
column_exclude_list = ['text']
# List of columns that can be sorted. For 'user' column, use User.username as
# a column.
column_sortable_list = ('title', ('user', 'user.username'), 'date')
# Rename 'title' columns to 'Post Title' in list view
column_labels = dict(title='Post Title')
column_searchable_list = ('title', User.username, 'tags.name')
column_filters = ('user',
'title',
'date',
'tags',
filters.FilterLike(Post.title, 'Fixed Title', options=(('test1', 'Test 1'), ('test2', 'Test 2'))))
# Pass arguments to WTForms. In this case, change label for text field to
# be 'Big Text' and add required() validator.
form_args = dict(
text=dict(label='Big Text', validators=[validators.required()])
)
form_ajax_refs = {
'user': {
'fields': (User.username, User.email)
},
'tags': {
'fields': (Tag.name,)
}
}
def __init__(self, session):
# Just call parent class with predefined model.
super(PostAdmin, self).__init__(Post, session)
class TreeView(sqla.ModelView):
form_excluded_columns = ['children', ]
# Create admin
admin = admin.Admin(app, name='Example: SQLAlchemy', template_mode='bootstrap3')
# Add views
admin.add_view(UserAdmin(User, db.session))
admin.add_view(sqla.ModelView(Tag, db.session))
admin.add_view(PostAdmin(db.session))
admin.add_view(TreeView(Tree, db.session))
if __name__ == '__main__':
# Build a sample db on the fly, if one does not exist yet.
app_dir = op.realpath(os.path.dirname(__file__))
database_path = op.join(app_dir, app.config['DATABASE_FILE'])
if not os.path.exists(database_path):
build_sample_db()
# Start app
app.run(debug=True)
导入操作系统
将os.path导入为op
从烧瓶进口烧瓶
从flask_sqlalchemy导入sqlalchemy
从wtforms导入验证程序
以管理员身份导入您的管理员
从flask_admin.contrib导入sqla
从flask_admin.contrib.sqla导入筛选器
#创建应用程序
app=烧瓶(名称)
#创建虚拟secrey密钥以便我们可以使用会话
app.config['SECRET_KEY']='123456790'
#创建内存数据库
app.config['DATABASE_FILE']='sample_db.sqlite'
app.config['SQLALCHEMY\u DATABASE\u URI']='sqlite://'+app.config['DATABASE\u FILE']
app.config['SQLALCHEMY_ECHO']=True
db=SQLAlchemy(应用程序)
#创建模型
类用户(db.Model):
id=db.Column(db.Integer,主键=True)
first_name=db.Column(db.String(100))
last_name=db.Column(db.String(100))
username=db.Column(db.String(80),unique=True)
email=db.Column(db.String(120),unique=True)
定义(自我):
返回self.username
#创建M2M表
post_tags_table=db.table('post_tags',db.Model.metadata,
db.Column('post_id',db.Integer,db.ForeignKey('post.id')),
db.Column('tag_id',db.Integer,db.ForeignKey('tag.id'))
)
班级职位(db.Model):
id=db.Column(db.Integer,主键=True)
title=db.Column(db.String(120))
text=db.Column(db.text,null=False)
date=db.Column(db.DateTime)
user_id=db.Column(db.Integer(),db.ForeignKey(user.id))
user=db.relationship(user,backref='posts')
tags=db.relationship('Tag',secondary=post\u tags\u table)
定义(自我):
返回自己的标题
类标记(db.Model):
id=db.Column(db.Integer,主键=True)
name=db.Column(db.Unicode(64))
定义(自我):
返回self.name
类用户信息(db.Model):
id=db.Column(db.Integer,主键=True)
key=db.Column(db.String(64),null=False)
value=db.Column(db.String(64))
user_id=db.Column(db.Integer(),db.ForeignKey(user.id))
user=db.relationship(user,backref='info')
定义(自我):
返回“%s-%s%”(self.key,self.value)
类树(db.Model):
id=db.Column(db.Integer,主键=True)
name=db.Column(db.String(64))
parent_id=db.Column(db.Integer,db.ForeignKey('tree.id'))
parent=db.relationship('Tree',remote_-side=[id],backref='children')
定义(自我):
返回self.name
#烧瓶视图
@应用程序路径(“/”)
def index():
返回“”
#自定义用户模型管理员
类UserAdmin(sqla.ModelView):
内联_模型=(用户信息,)
#自定义后模型管理员
类PostAdmin(sqla.ModelView):
#列表视图中的可见列
列排除列表=['text']
#可以排序的列的列表。对于“用户”列,使用user.username作为
#专栏。
列可排序列表=('title',('user','user.username'),'date')
#在列表视图中将“标题”列重命名为“文章标题”
列标签=dict(title='Post title')
列\可搜索\列表=('title',User.username',tags.name')
列过滤器=('user',
“头衔”,
“日期”,
“标签”,
filters.FilterLike(Post.title,'Fixed title',options=(('test1','test1'),('test2','test2'))
#将参数传递给WTForms。在这种情况下,将文本字段的标签更改为
#使用“大文本”并添加必需的()验证器。
form_args=dict(
text=dict(label='Big text',validators=[validators.required()])
)
表单\u ajax\u参考={
“用户”:{
“字段”:(User.username,User.email)
},
“标签”:{
“字段”:(Tag.name,)
}
}
定义初始化(self,session):
#只需使用预定义的模型调用父类。
超级(PostAdmin,self)。\uuuu init\uuuu(Post,session)
类TreeView(sqla.ModelView):
表单_排除_列=[‘子项’,]
#创建管理员
admin=admin.admin(app,name='Example:SQLAlchemy',template\u mode='bootstrap3')
#添加视图
admin.add_视图(UserAdmin(User,db.session))
admin.add_视图(sqla.ModelView(Tag,db.session))
管理员添加视图(后管理员(数据库会话))
管理添加视图(树视图(树,数据库会话))
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
#如果还不存在示例数据库,则动态构建示例数据库。
app_dir=op.realpath(os.path.dirname(_文件__))
database_path=op.join(app_dir,app.config['database_FILE'])
如果不存在os.path(数据库路径):
构建示例数据库()
#启动应用程序
app.run(debug=True)
基本原则遵循此格式
-Main
run.py
-App
-Static
-Templates
__init__.py
config.py
models.py
views.py
run.py
#!flask/bin/python
from app import app
app.run(debug=True)
init.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
# Create application
app = Flask(__name__)
app.config.from_pyfile('config.py')
# app.config.from_pyfile('config_file.cfg')
db = SQLAlchemy(app)
@app.route('/', methods=['GET', 'POST'])
def index():
return '<a href="/admin/">Click me to get to Home!</a>'
import views
import models
models.py
# Create models
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
first_name = db.Column(db.String(100))
last_name = db.Column(db.String(100))
username = db.Column(db.String(80), unique=True)
email = db.Column(db.String(120), unique=True)
def __str__(self):
return self.username
# Create M2M table
post_tags_table = db.Table('post_tags', db.Model.metadata,
db.Column('post_id', db.Integer, db.ForeignKey('post.id')),
db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'))
)
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(120))
text = db.Column(db.Text, nullable=False)
date = db.Column(db.DateTime)
user_id = db.Column(db.Integer(), db.ForeignKey(User.id))
user = db.relationship(User, backref='posts')
tags = db.relationship('Tag', secondary=post_tags_table)
def __str__(self):
return self.title
class Tag(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Unicode(64))
def __str__(self):
return self.name
class UserInfo(db.Model):
id = db.Column(db.Integer, primary_key=True)
key = db.Column(db.String(64), nullable=False)
value = db.Column(db.String(64))
user_id = db.Column(db.Integer(), db.ForeignKey(User.id))
user = db.relationship(User, backref='info')
def __str__(self):
return '%s - %s' % (self.key, self.value)
class Tree(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64))
parent_id = db.Column(db.Integer, db.ForeignKey('tree.id'))
parent = db.relationship('Tree', remote_side=[id], backref='children')
def __str__(self):
return self.name
views.py
# Customized User model admin
class UserAdmin(sqla.ModelView):
inline_models = (UserInfo,)
# Customized Post model admin
class PostAdmin(sqla.ModelView):
# Visible columns in the list view
column_exclude_list = ['text']
# List of columns that can be sorted. For 'user' column, use User.username as
# a column.
column_sortable_list = ('title', ('user', 'user.username'), 'date')
# Rename 'title' columns to 'Post Title' in list view
column_labels = dict(title='Post Title')
column_searchable_list = ('title', User.username, 'tags.name')
column_filters = ('user',
'title',
'date',
'tags',
filters.FilterLike(Post.title, 'Fixed Title', options=(('test1', 'Test 1'), ('test2', 'Test 2'))))
# Pass arguments to WTForms. In this case, change label for text field to
# be 'Big Text' and add required() validator.
form_args = dict(
text=dict(label='Big Text', validators=[validators.required()])
)
form_ajax_refs = {
'user': {
'fields': (User.username, User.email)
},
'tags': {
'fields': (Tag.name,)
}
}
def __init__(self, session):
# Just call parent class with predefined model.
super(PostAdmin, self).__init__(Post, session)
class TreeView(sqla.ModelView):
form_excluded_columns = ['children', ]
# Create admin
admin = admin.Admin(app, name='Example: SQLAlchemy', template_mode='bootstrap3')
# Add views
admin.add_view(UserAdmin(User, db.session))
admin.add_view(sqla.ModelView(Tag, db.session))
admin.add_view(PostAdmin(db.session))
admin.add_view(TreeView(Tree, db.session))
很遗憾,您在models.py中遗漏了导入,因为不清楚如何在那里导入db。
# Customized User model admin
class UserAdmin(sqla.ModelView):
inline_models = (UserInfo,)
# Customized Post model admin
class PostAdmin(sqla.ModelView):
# Visible columns in the list view
column_exclude_list = ['text']
# List of columns that can be sorted. For 'user' column, use User.username as
# a column.
column_sortable_list = ('title', ('user', 'user.username'), 'date')
# Rename 'title' columns to 'Post Title' in list view
column_labels = dict(title='Post Title')
column_searchable_list = ('title', User.username, 'tags.name')
column_filters = ('user',
'title',
'date',
'tags',
filters.FilterLike(Post.title, 'Fixed Title', options=(('test1', 'Test 1'), ('test2', 'Test 2'))))
# Pass arguments to WTForms. In this case, change label for text field to
# be 'Big Text' and add required() validator.
form_args = dict(
text=dict(label='Big Text', validators=[validators.required()])
)
form_ajax_refs = {
'user': {
'fields': (User.username, User.email)
},
'tags': {
'fields': (Tag.name,)
}
}
def __init__(self, session):
# Just call parent class with predefined model.
super(PostAdmin, self).__init__(Post, session)
class TreeView(sqla.ModelView):
form_excluded_columns = ['children', ]
# Create admin
admin = admin.Admin(app, name='Example: SQLAlchemy', template_mode='bootstrap3')
# Add views
admin.add_view(UserAdmin(User, db.session))
admin.add_view(sqla.ModelView(Tag, db.session))
admin.add_view(PostAdmin(db.session))
admin.add_view(TreeView(Tree, db.session))