2017-07-18 81 views
0

我想知道如何將應用程序分成不同的文件,但是我知道這些文件是什麼,但是我想知道代碼的哪個方面是,所以我現在有, FlaskAdmin/ 靜態/ 模板/ ---App.pyFlask Admin App files seperation

FlaskAdmin/ ---配置 ---運行 應用/ - 靜態/ -templates/ ---瀏覽次數 ---型號 - - 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) 

回答

0

的基本原則遵循以下格式。

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

初始化的.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)) 
+0

這是你在models.py冷落進口可惜,因爲目前還不清楚如何導入數據庫存在。 –

+0

沒關係,我不能這是一箇舊版本,對不起 – ghost