Flask restful api与blueprint结合实践

本文档介绍了如何在Flask中结合Flask-RESTful创建RESTful API,并使用Blueprint进行模块化管理。内容包括:初始化Blueprint,定义资源类及HTTP方法,注册路由,以及通过curl命令进行API测试。示例展示了获取、新增、修改和删除资源的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

所需依赖:

Flask
Flask-RESTful
Python2.7
备注:flask-restful不能和flask的render_template模板结合使用,因为restfulapi的设计不是为了在flask里直接返回html。
在使用restful时,使用前后端分离模式。

本文档不包含flask的认证登陆功能
restful说明

restful把所有url请求当做资源, 资源下的get方法对应get请求,post方法对应post请求,put方法对应put请求,delete方法对应delete请求。

get请求,post新增, put修改, delete删除

具体的url设计模式,参考文章:RESTful API 设计指南

1、目录结构

.
├── assets
│ ├── init.py
│ ├── server.py
│ ├── urls.py
├── run.py
2、assets下文件配置

init.py

from flask import Blueprint
assets_page = Blueprint(‘assets_page’, name)
import urls
urls.py

#coding:utf-8
from assets import assets_page
from flask_restful import Resource, Api
from server import Servers

<think>嗯,用户现在问的是如何用Flask框架搭建一个简单的高铁售票系统。之前他们问过关于整个系统的设计和开发,现在具体到了技术实现,特别是Flask的应用。我需要先回想一下之前的回答,看看有没有已经提到的模块或者结构,可以在这里展开。 首先,用户可能已经了解系统的大致模块划分,比如用户界面、业务逻辑、数据存储。现在需要具体到Flask的实现步骤。我应该从基础开始,分步骤讲解,比如环境搭建、项目结构、数据库设计、路由和视图函数、模板渲染等。 用户可能对Flask有一定的了解,但可能还是新手,所以步骤需要详细,但不过于复杂。比如,安装Flask和SQLAlchemy,创建基本的路由,设计数据库模型,然后实现具体的功能如车次查询、购票、订单管理等。 需要考虑用户可能遇到的问题,比如如何连接数据库,如何处理表单数据,如何实现用户认证。可能需要提到扩展库,比如Flask-SQLAlchemy、Flask-Login、Flask-WTF,这些能简化开发过程。 另外,用户可能想知道如何组织代码结构,比如使用蓝图来模块化应用,或者如何确保数据的高效访问,尤其是在处理大量数据时。但问题主要是搭建一个简单的系统,所以可能不需要深入优化,但需要提到关键点,比如索引的使用,避免重复代码等。 还要注意安全问题,比如用户密码的哈希存储,防止SQL注入,表单的CSRF保护。这些虽然对简单系统来说可能不是最紧急的,但作为最佳实践应该提到。 最后,用户可能需要示例代码,比如模型定义、路由函数、模板示例,这样他们可以跟着步骤实际操作。测试部分也是重要的,比如使用Flask的测试客户端或者Postman来测试API。 总结下来,回答需要结构清晰,分步骤讲解,包含必要的代码示例,同时提到关键的技术点和扩展库,帮助用户一步步实现基础功能,并给出进一步优化的方向。</think>以下是一个基于Flask框架搭建高铁售票系统的实现步骤和技术要点,采用分层结构讲解: --- ### **一、环境准备** ```python # 安装核心库 pip install flask flask-sqlalchemy flask-wtf flask-login ``` --- ### **二、项目结构** ``` /train_ticket ├── app.py # 主程序入口 ├── config.py # 数据库配置 ├── /models │ ├── user.py # 用户模型 │ └── ticket.py # 车票模型 ├── /routes │ ├── auth.py # 登录注册路由 │ └── ticket.py # 票务路由 ├── /templates # HTML模板 └── /static # CSS/JS静态文件 ``` --- ### **三、关键技术实现** #### **1. 数据库设计(SQLAlchemy ORM)** ```python # models/ticket.py from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() class Train(db.Model): __tablename__ = 'trains' id = db.Column(db.Integer, primary_key=True) train_number = db.Column(db.String(20), unique=True) # 车次号 G1234 departure = db.Column(db.String(50)) # 出发站 destination = db.Column(db.String(50)) # 到达站 departure_time = db.Column(db.DateTime) # 发车时间 seats_total = db.Column(db.Integer) # 总座位数 seats_remaining = db.Column(db.Integer) # 剩余座位 ``` #### **2. 用户认证系统(Flask-Login)** ```python # models/user.py from werkzeug.security import generate_password_hash, check_password_hash class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True) password_hash = db.Column(db.String(128)) def set_password(self, password): self.password_hash = generate_password_hash(password) def check_password(self, password): return check_password_hash(self.password_hash, password) ``` #### **3. 票务核心逻辑** ```python # routes/ticket.py from flask import Blueprint, render_template, request from models.ticket import Train ticket_bp = Blueprint('ticket', __name__) @ticket_bp.route('/search', methods=['GET']) def search_trains(): # 获取查询参数 departure = request.args.get('departure') destination = request.args.get('destination') date = request.args.get('date') # 数据库查询 trains = Train.query.filter( Train.departure == departure, Train.destination == destination, func.date(Train.departure_time) == date ).all() return render_template('search_results.html', trains=trains) ``` --- ### **四、关键功能实现** #### **1. 购票事务处理** ```python # 使用数据库事务确保数据一致性 from sqlalchemy.exc import SQLAlchemyError @ticket_bp.route('/book/<int:train_id>', methods=['POST']) @login_required def book_ticket(train_id): train = Train.query.get_or_404(train_id) try: if train.seats_remaining > 0: train.seats_remaining -= 1 order = Order(user_id=current_user.id, train_id=train.id) db.session.add(order) db.session.commit() return redirect(url_for('ticket.order_detail', order_id=order.id)) else: flash('当前车次已无余票') except SQLAlchemyError as e: db.session.rollback() flash('订票失败,请重试') return redirect(url_for('ticket.search')) ``` #### **2. 余票缓存优化** ```python # 使用Redis缓存高频查询(需安装redis-py) import redis r = redis.Redis(host='localhost', port=6379, db=0) def get_seats_remaining(train_id): cache_key = f"train:{train_id}:seats" seats = r.get(cache_key) if not seats: seats = Train.query.get(train_id).seats_remaining r.setex(cache_key, 300, seats) # 缓存5分钟 return int(seats) ``` --- ### **五、安全防护措施** 1. **CSRF保护**:启用Flask-WTF的CSRF保护 2. **SQL注入防御**:使用ORM代替原生SQL 3. **密码安全**:强制密码复杂度校验 4. **会话管理**:设置`SESSION_COOKIE_SECURE=True` --- ### **六、测试部署** 1. **单元测试**:使用`pytest`编写测试用例 2. **压力测试**:Locust模拟并发订票场景 3. **部署方案**: - 生产环境:Nginx + Gunicorn - 容器化:Docker + Kubernetes - 监控:Prometheus + Grafana --- ### **七、扩展方向** - 对接第三方支付(支付宝/微信支付) - 实现候补购票功能 - 开发手机APP接口(RESTful API) - 加入机器学习预测余票动态调价 --- 通过以上步骤即可构建一个基础可用的高铁售票系统,实际开发中需根据具体需求补充异常处理、日志记录等企业级功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值