Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Flask管理应用程序文件分离_Python_Flask_Flask Sqlalchemy_Flask Admin - Fatal编程技术网

Python Flask管理应用程序文件分离

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

我想知道如何将应用程序分为不同的文件,我知道这些文件是什么,但我想知道代码的哪些方面,所以我现在有, 烧瓶管理员/ 静止的/ 模板/ ---App.py

烧瓶管理员/ ---配置 ---跑 应用程序/ -静止的/ -模板/ ---观点 ---模型 ---Int ---形式 ---装饰师

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