flask + vue + postgres 前后端分离实例

配置数据库

  • 新建exts.py import数据库
    from flask_sqlalchemy import SQLAlchemy
    
    db = SQLAlchemy()
    
  • 在app.py中配置数据库
    from exts import db
    
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:Password@hostip:5432/postgres'
    app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    app.config["SQLALCHEMY_ECHO"] = True
    db.init_app(app)
    
  • 新建models.py, 创建数据库模型
    from exts import db
    
    
    class Books(db.Model):
        __tablename__ = 'books'
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(64))
        author = db.Column(db.String(64), nullable=False)
        category = db.Column(db.String(64), nullable=False)
        def __repr__(self):
            return '<Book %r>' % self.name
    
  • 新建create_db.py
    from exts import db
    from models import Books
    
    db.create_all()
    
  • 执行create_db.py python create_db.py, 在数据库中创建数据表
    flask + vue + postgres 前后端分离实例

例子

  • app.py

    import json
    from models import *
    from flask import Flask
    from flask_cors import *
    from exts import db
    
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://postgres:Password@hostip:5432/postgres'
    app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    app.config["SQLALCHEMY_ECHO"] = True
    db.init_app(app)
    CORS(app, resources=r'/*')
    
    
    def query2dict(model_list):
        if isinstance(model_list, list):
            if isinstance(model_list[0], db.Model):
                lst = []
                for model in model_list:
                    dic = {}
                    for col in model.__table__.columns:
                        dic[col.name] = getattr(model, col.name)
                    lst.append(dic)
                return lst
            else:
                lst = []
                for result in model_list:
                    lst.append([dict(zip(result.keys, r)) for r in result])
                return lst
        else:
            if isinstance(model_list, db.Model):
                dic = {}
                for col in model_list.__table__.columns:
                    dic[col.name] = getattr(model_list, col.name)
                return dic
            else:
                return dict(zip(model_list.keys(), model_list))
    
    @app.route('/', methods=["POST"])
    def query_books():
        books = Books.query.all()
        books = query2dict(books)
        return json.dumps(books)
    
  • index.vue

    <template>
        <div>
            <div>
                <el-row>
                    <el-button type="primary" icon="el-icon-edit" circle />
                    <el-button type="primary" icon="el-icon-delete" circle />
                    <el-button type="primary" icon="el-icon-document-add" circle />
                </el-row>
            </div>
            <div>
            <el-table
                :key="itemKey"
                :data="tableData"
                :header-cell-style="{background:'#eef1f6',color:'#606266'}"
                border
                :row-style="{height: '50px'}"
                @selection-change="handleSelectionChange"
                >
                <el-table-column type="selection" width="40" />
                <el-table-column prop="id" label="ID" align="center" />
                <el-table-column prop="name" label="Name" align="center" />
                <el-table-column prop="author" label="Author" align="center" />
                <el-table-column prop="category" label="Category" align="center" />
                </el-table>
            </div>
        </div>
    </template>
    <script>
    export default {
        data () {
            return {
                itemKey: 0,
                tableData: [],
                selectData: []
            }
        },
        created () {
            this.getData()
        },
        methods: {
            getData () {
                this.axios.post(
                    'http://127.0.0.1:5000/'
                ).then(res => {
                    const data = res.data
                    data.forEach((item) => {
                        this.tableData.push(item)
                        this.itemKey = Math.random()
                    })
                })
            },
            handleSelectionChange (val) {
                this.selectedData = val
            }
        }
    }
    </script>
    
  • 效果
    flask + vue + postgres 前后端分离实例

上一篇:手把手教你 win10 安装Paddlepaddle-GPU


下一篇:1、项目准备