使用 MVC 架构构建 Flask CRUD 应用程序

【转自 Felipe Silveira 的《Build a Flask CRUD Application with MVC Architecture》(翻译)】

如何用 Flask 的 Blueprint 实现一个 CRUD 的应用

使用 MVC 架构构建 Flask CRUD 应用程序

我多年来一直在开发和生产应用程序中使用 Node.js,最近我开始专注于使用 Flask 的全栈 Web 开发。

我记得我的第一个实践 Node.js 项目,现在与 Flask 相比,它的开发速度要快得多。碰巧的是,在使用 Flask 时,我在实现一个简单的 CRUD 应用程序时被卡住了很多次,主要是在如何使用 Python 构建项目方面。

特别是,我已经使用 Python 实现了许多机器学习应用程序。在我看来,它是最好的语言。但是,在实现 CRUD 和/或 API 项目时,我仍然更喜欢 Node.js。

总的来说,请注意本教程的重点不是解释什么是 CRUD 应用程序,也不是它的方法。它只是关于如何按照 MVC 架构实现应用程序的指南。

我试图尽可能地将它与 NodeJS 应用程序相关联,希望你喜欢它。如有任何意见或建议,请随时与我联系。

为了构建这个应用程序,我们首先需要了解 CLIENT/SERVER 的基本思想。

  • 客户端向服务器发送请求。
  • 服务器接收客户端请求,向数据库发送请求,数据库发送回响应。
  • 在操作数据库响应之后,服务器然后向客户端发送响应。

在这种方法中,服务器响应返回客户端请求的整个页面。例如,请求页面会为此/users返回所有 HTML、CSS 和 JS。对它的实际理解是render_template来自烧瓶的方法。

请记住,此格式仅限于特定客户端。由于服务器呈现 HTML、CSS 和 JS,因此 Android 或 iOS 客户端无法处理它。作为一种解决方案,经常使用 RESTful API,从而消除了呈现模板的后端责任。

项目结构

本教程假设您已经在计算机上安装了 Python、PostgreSQL 和 Flask。之后,请在您的项目文件夹中创建以下结构。

project/
|
├── templates/
|   └── index.html
|
├── migrations/ **
|   └── ...
|
├── routes/
|   └── user_bp.py
|
├── models/
|   └── User.py
|
├── controllers/
|   └── UserController.py
|
├── app.py
└── config.py
  • * 从命令自动创建flask db init

如果你从另一个框架,你可能已经注意到了瓶CLI是用来设置的东西,如FLASK_APP=app.pyFLASK_ENV=development,但不会自动为我们创建这个结构。

现在,让我们开始编写代码。

在src/app.py中

from flask import Flask, render_template
from flask_migrate import Migrate

from models.User import db
from routes.user_bp import user_bp

app = Flask(__name__)
app.config.from_object('config')

db.init_app(app)
migrate = Migrate(app, db)
app.register_blueprint(user_bp, url_prefix='/users')

@app.route('/')
def index():
    return render_template('index.html')

if __name__ == '__main__':
    app.debug = True
    app.run()

在src/config.py中:

import os

SECRET_KEY = os.urandom(32)

# Grabs the folder where the script runs.
basedir = os.path.abspath(os.path.dirname(__file__))

# Enable debug mode.
DEBUG = True

# Connect to the database
SQLALCHEMY_DATABASE_URI = 'your psycopg2 URI connection'

# Turn off the Flask-SQLAlchemy event system and warning
SQLALCHEMY_TRACK_MODIFICATIONS = False

在 src/models/User.py中:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class User(db.Model):
    __tablename__ = 'users'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)
    age = db.Column(db.String(120))
    address = db.Column(db.String(120))

    @property
    def serialize(self):
        return {
            'id': self.id,
            'name': self.name,
            'city': self.city,
            'state': self.state,
            'address': self.address
        }

之后,您可以运行以下命令:

  • flask db init: 它将创建带有版本子文件夹的迁移文件夹。
  • flask db migrate: 它将通过升级和降级逻辑设置检测模型更改。
  • flask db upgrade: 它将应用您已实施的模型更改。
  • flask db downgrade: 如果出现问题,您可以使用此命令取消应用您对模型文件所做的更改。

路线:

如您所见,路由通常使用控制器功能编写

@app.route('/', methods =['GET']) 
def index(): 
    ...

@app.route('/create', methods =['POST']) 
def store(): 
    ...

...

但是,由于我们希望按照 MVC 架构来组织它,因此需要进行一些更改。为此,Blueprint可以用作解决方案。它负责将代码拆分为不同的模块,从而更好地维护并提高可扩展性。

在src/routes/user_bp.py 中:

from flask import Blueprint

from controllers.UserController import index, store, show, update, destroy

user_bp = Blueprint('user_bp', __name__)

user_bp.route('/', methods=['GET'])(index)
user_bp.route('/create', methods=['POST'])(store)
user_bp.route('/<int:user_id>', methods=['GET'])(show)
user_bp.route('/<int:user_id>/edit', methods=['POST'])(update)
user_bp.route('/<int:user_id>', methods=['DELETE'])(destroy)

回到app.py,你可能注意到在app.register_blueprint(user_bp, url_prefix='/users')中蓝图正被注册

在src/controllers/UserController.py中

# pseudo code

import sys
from flask import render_template, redirect, url_for, request, abort

from models.User import User
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

def index():
    ...

def store():
    ...

def show(userId):
    ...

def update(userId):
    ...

def delete(userId):
    ...

编写完所有必要的方法后,您可以使用命令flask run或运行项目python app.py。最后,您可以检查您的项目是否在http://localhost:5000/正确运行

本教程侧重于指导您进行后端实现,如果您想了解前端部分的详细信息,请为第二个教程发表评论。

我希望我已经向您展示了使用 Flask 实现 CRUD 应用程序是多么容易,就像使用 Node.js 一样。谢谢阅读!

上一篇:MyBatis(三)CRUD


下一篇:5年crud经验,给大家安排上!