Flask中如何在蓝图中使用sqlalchemy

博客强调在Flask程序中,引入蓝图的位置需在初始化db之后,否则会报错。还介绍了程序结构,包括建立mysql和app的连接,需在config.py中加入两项配置,以及主要的两个蓝图及其注册。

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

 

原文地址:https://www.cnblogs.com/diaosir/p/6351721.html

主要是要注意引入蓝图的位置一定要是在初始化db之后才行;

下程序结构:

1.建立mysql和app的连接

在config.py中加入以下两项配置:

SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:xxxxx@localhost:3306/test?charset=utf8'
SQLALCHEMY_TRACK_MODIFICATIONS = True

如此在app/__init__.py中加入
app.config.from_object('config')
db = SQLAlchemy(app)
就可以完成app和数据的关联,并生成一个可以操作app数据库的SQLAlchemy实例db

蓝图的引入要放在初始化DB之后,不然会报错;

 

完整的app/__init__.py代码如下:
from flask import Flask, url_for, request, redirect, render_template
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config.from_object('config')
db = SQLAlchemy(app)
# 这里引入蓝图的配置
from app import models,views

接下来就是主要的两个蓝图,以及他们的注册

#app/user.py

from flask import Blueprint, render_template, redirect,request
from app import db
from .models import User
user = Blueprint('user',__name__)

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

@user.route('/add/',methods=['GET','POST'])
def add():
    if request.method == 'POST':
        p_user = request.form.get('username',None)
        p_email = request.form.get('email',None)
        p_password = request.form.get('password',None)

        if not p_user or not p_email or not p_password:
            return 'input error'

        newobj = User(username=p_user, email=p_email, password=p_password)
        db.session.add(newobj)
        db.session.commit()
        users = User.query.all()
        return render_template('user/add.html',users=users)
    users = User.query.all()
    return render_template('user/add.html',users=users)

@user.route('/show')
def show():
    return 'user_show'

#app/admin.py

#admin.py
from flask import Blueprint,render_template, request, redirect
from app import db
from .models import Admin

admin = Blueprint('admin',__name__)

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

@admin.route('/add/',methods=['POST','GET'])
def add():
    if request.method == 'POST':
        p_admin = request.form.get('username',None)
        p_email = request.form.get('email',None)
        p_password = request.form.get('password',None)

        if not p_admin or not p_email or not p_password:
            return 'input error'

        newobj = Admin(username=p_admin, email=p_email, password=p_password)
        db.session.add(newobj)
        db.session.commit()
        admins = Admin.query.all()
        return render_template('admin/add.html',admins=admins)
    admins = Admin.query.all()
    return render_template('admin/add.html',admins=admins)

@admin.route('/show')
def show():
    return 'admin_show'

 

#app/views.py

from app import app
from .admin import admin
from .user import user

app.register_blueprint(admin,url_prefix='/admin')
app.register_blueprint(user, url_prefix='/user')

#run.py

from app import app
app.run()
<think>嗯,用户现在问的是如何用Flask框架搭建一个简单的高铁售票系统。之前他们问过关于整个系统的设计和开发,现在具体到了技术实现,特别是Flask的应用。我需要先回想一下之前的回答,看看有没有已经提到的模块或者结构,可以在这里展开。 首先,用户可能已经了解系统的大致模块划分,比如用户界面、业务逻辑、数据存储。现在需要具体到Flask的实现步骤。我应该从基础开始,分步骤讲解,比如环境搭建、项目结构、数据库设计、路由和视图函数、模板渲染等。 用户可能对Flask有一定的了解,但可能还是新手,所以步骤需要详细,但不过于复杂。比如,安装FlaskSQLAlchemy,创建基本的路由,设计数据库模型,然后实现具体的功能如车次查询、购票、订单管理等。 需要考虑用户可能遇到的问题,比如如何连接数据库,如何处理表单数据,如何实现用户认证。可能需要提到扩展库,比如Flask-SQLAlchemyFlask-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、付费专栏及课程。

余额充值