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那样明确地区分服务层、控制器层等,但在大型项目中,仍然可以采用类似的分层架构。

相关推荐
Ancelin安心3 分钟前
kali-dirsearch的使用
linux·运维·服务器·python·计算机网络·web安全·网络安全
努力学习的小洋7 分钟前
Python训练打卡Day5离散特征的处理-独热编码
人工智能·python·机器学习
Sherry Wangs37 分钟前
【ML】机器学习进阶
人工智能·python·机器学习
X1A0RAN1 小时前
python 借助 paramiko 库执行 SSH命令报错:input is not a terminal 解决方式
开发语言·python·ssh
冰清-小魔鱼1 小时前
各类数据存储结构总结
开发语言·数据结构·数据库
百***78751 小时前
Grok-4.1与GPT-5.2深度对比:技术差异、适用场景及Python集成指南
java·python·gpt
Mr -老鬼2 小时前
Java VS Rust
java·开发语言·rust
北凉军2 小时前
java连接达梦数据库,用户名是其他库的名称无法指定库,所有mapper查询的都是以用户名相同的库内的表
java·开发语言·数据库
沛沛老爹2 小时前
Web转AI架构篇 Agent Skills vs MCP:工具箱与标准接口的本质区别
java·开发语言·前端·人工智能·架构·企业开发
avi91112 小时前
Unity 天命6源码- 商业游戏说明分析
开发语言·unity·c#·游戏开发·游戏源码