【问题标题】:Flask Admin App files seperationFlask Admin App 文件分离
【发布时间】:2017-07-18 12:07:16
【问题描述】:

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

FlaskAdmin/ ---配置 - -跑 应用程序/ -静止的/ -模板/ ---观点 - -楷模 ---诠释 - -形式 ---装饰器

    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)

【问题讨论】:

    标签: python flask flask-sqlalchemy flask-admin


    【解决方案1】:

    基本原则遵循这种格式。

      -Main
       run.py
       -App
        -Static
        -Templates
         __init__.py
         config.py
         models.py
         views.py
    

    运行.py

    #!flask/bin/python
    from app import app
    app.run(debug=True)
    

    初始化.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
    

    config.py

    import os
    import configuration
    basedir = os.path.abspath(os.path.dirname(__file__))
    
    # Create dummy secrey key so we can use sessions
    app.config['SECRET_KEY'] = '123456790'
    
    app.config['DATABASE_FILE'] = 'sample_db.sqlite'
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + 
    app.config['DATABASE_FILE']
    app.config['SQLALCHEMY_ECHO'] = True
    

    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。
    • 在视图中还有什么是 sqla 对象?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 2020-05-15
    相关资源
    最近更新 更多