Python Flask

下面将使用Flask框架来演示一个具有分页和查询条件的简单REST API。

Flask应用结构

plaintext 复制代码
project/
│
├── app/
│   ├── __init__.py
│   ├── models.py
│   ├── services.py
│   └── controllers.py
│
└── run.py

__init__.py

这是Flask应用的初始化文件。

python 复制代码
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_marshmallow import Marshmallow

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
db = SQLAlchemy(app)
ma = Marshmallow(app)

from app import controllers

models.py

定义数据库模型。

python 复制代码
from . import db, ma

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100))
    email = db.Column(db.String(120), unique=True)

    def __init__(self, name, email):
        self.name = name
        self.email = email

class UserSchema(ma.Schema):
    class Meta:
        fields = ('id', 'name', 'email')

user_schema = UserSchema()
users_schema = UserSchema(many=True)

services.py

定义服务层。

python 复制代码
from . import db, models

def get_all_users(page, per_page):
    return models.User.query.paginate(page, per_page, error_out=False)

def get_user_by_id(user_id):
    return models.User.query.get_or_404(user_id)

def add_user(name, email):
    new_user = models.User(name=name, email=email)
    db.session.add(new_user)
    db.session.commit()
    return new_user

def update_user(user_id, name, email):
    user = models.User.query.get(user_id)
    if user:
        user.name = name
        user.email = email
        db.session.commit()
        return user
    return None

def delete_user(user_id):
    user = models.User.query.get(user_id)
    if user:
        db.session.delete(user)
        db.session.commit()
        return True
    return False

controllers.py

定义控制器层,处理HTTP请求。

python 复制代码
from flask import Blueprint, request, jsonify
from . import models, services

bp = Blueprint('users', __name__, url_prefix='/api/users')

@bp.route('/', methods=['GET'])
def search_users():
    page = request.args.get('page', 1, type=int)
    per_page = request.args.get('per_page', 10, type=int)
    name = request.args.get('name', '')

    users = services.get_all_users(page, per_page)
    if name:
        users.items = [user for user in users.items if name.lower() in user.name.lower()]

    return make_response(200, 'Users fetched successfully.', {
        'total': users.total,
        'pages': users.pages,
        'page': page,
        'per_page': per_page,
        'items': models.users_schema.dump(users.items)
    })

@bp.route('/', methods=['POST'])
def add_user():
    name = request.json.get('name')
    email = request.json.get('email')
    if not name or not email:
        return make_response(400, 'Name and email are required.')

    new_user = services.add_user(name, email)
    return make_response(201, 'User created successfully.', models.user_schema.dump(new_user))

@bp.route('/<int:user_id>', methods=['PUT'])
def update_user(user_id):
    name = request.json.get('name')
    email = request.json.get('email')
    if not name or not email:
        return make_response(400, 'Name and email are required.')

    updated_user = services.update_user(user_id, name, email)
    if updated_user:
        return make_response(200, 'User updated successfully.', models.user_schema.dump(updated_user))
    else:
        return make_response(404, 'User not found.')

# 定义的通用响应函数如下:
def make_response(code, message, data=None):
    response = {
        'code': code,
        'message': message,
        'data': data
    }
    return jsonify(response)

run.py

运行Flask应用的入口。

python 复制代码
from app import app

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

请注意,上述Python代码使用了Flask、Flask-SQLAlchemy和Flask-Marshmallow库,它们提供了类似Spring Boot的功能,但语法和结构有所不同。在Python中,我们通常不会像Java那样明确地区分服务层、控制器层等,但在大型项目中,仍然可以采用类似的分层架构。

相关推荐
珹洺14 分钟前
JSP技术入门指南【一】利用IDEA从零开始搭建你的第一个JSP系统
java·开发语言·前端·html·intellij-idea·jsp
·醉挽清风·1 小时前
学习笔记—C++—模板初阶
开发语言·c++·笔记·学习
User_芊芊君子1 小时前
跨平台开发选Java还是C?应用场景与性能深度对比
java·c语言·开发语言
一只小松许️2 小时前
Rust泛型与特性
java·开发语言·rust
搬砖工程师Cola4 小时前
<C#>在 C# .NET 6 中,使用IWebHostEnvironment获取Web应用程序的运行信息。
开发语言·c#·.net
八了个戒6 小时前
「数据可视化 D3系列」入门第三章:深入理解 Update-Enter-Exit 模式
开发语言·前端·javascript·数据可视化
失去妙妙屋的米奇6 小时前
matplotlib数据展示
开发语言·图像处理·python·计算机视觉·matplotlib
夏天的阳光吖6 小时前
C++蓝桥杯实训篇(四)
开发语言·c++·蓝桥杯
搞不懂语言的程序员7 小时前
备忘录模式深度解析与实战案例
数据库·python·备忘录模式
angushine7 小时前
Gateway获取下游最终响应码
java·开发语言·gateway