Flask 全栈学习指南

一、Flask 基础核心

1. 核心概念与启动流程
  • WSGI 与 Werkzeug

    • Flask 基于 Werkzeug 实现 WSGI 协议,处理 HTTP 请求到响应的全流程。
    • 手动实现 WSGI 应用示例:
      def simple_app(environ, start_response):
          status = '200 OK'
          headers = [('Content-type', 'text/plain')]
          start_response(status, headers)
          return [b'Hello, WSGI World!']
      
  • 最小化 Flask 应用

    from flask import Flask
    app = Flask(__name__)
    
    @app.route('/')
    def home():
        return 'Hello, Flask!'
    
    if __name__ == '__main__':
        app.run(debug=True)  # 开发模式启动
    

二、路由系统详解

1. 路由规则与动态参数
  • 参数类型限定

    @app.route('/user/<int:user_id>')      # 只匹配整数
    @app.route('/path/<path:subpath>')     # 匹配含斜杠的子路径
    @app.route('/uuid/<uuid:uuid_val>')    # 必须符合 UUID 格式
    
  • HTTP 方法控制

    @app.route('/api', methods=['GET', 'POST'])
    def handle_api():
        if request.method == 'POST':
            return 'Received data'
        return 'Send data here'
    
2. URL 构建与反向解析
from flask import url_for

@app.route('/user/<username>')
def profile(username):
    return f'User {username}'

# 在代码或模板中生成 URL
url_for('profile', username='alice')  # 输出 /user/alice

三、请求与响应对象

1. 请求数据获取
  • 表单与文件上传

    from flask import request
    
    username = request.form.get('username')
    uploaded_file = request.files['file']
    uploaded_file.save('/path/to/save')
    
  • JSON 数据与请求头

    data = request.get_json()
    user_agent = request.headers.get('User-Agent')
    
2. 自定义响应
  • 设置 Cookie 与 Header
    from flask import make_response
    
    @app.route('/set-cookie')
    def set_cookie():
        resp = make_response('Cookie set')
        resp.set_cookie('theme', 'dark')
        resp.headers['X-Custom-Header'] = '123'
        return resp
    

四、Jinja2 模板引擎

1. 模板继承与复用
  • 基础模板 (base.html)

    <!DOCTYPE html>
    <html>
    <head>
        <title>{% block title %}{% endblock %}</title>
    </head>
    <body>
        {% block content %}{% endblock %}
    </body>
    </html>
    
  • 子模板扩展 (child.html)

    {% extends "base.html" %}
    {% block title %}Home Page{% endblock %}
    {% block content %}
      <h1>Welcome, {{ username }}</h1>
    {% endblock %}
    
2. 高级模板功能
  • 宏定义(类似函数)

    {% macro render_comment(comment) %}
      <div class="comment">
        <p>{{ comment.text }}</p>
        <small>By {{ comment.author }}</small>
      </div>
    {% endmacro %}
    
    {{ render_comment(comment) }}
    
  • 过滤器与全局变量

    # Python 中注册自定义过滤器
    @app.template_filter('reverse')
    def reverse_filter(s):
        return s[::-1]
    
    # 模板中使用
    {{ "hello" | reverse }}  <!-- 输出 "olleh" -->
    

五、数据库与 ORM(Flask-SQLAlchemy)

1. 模型定义与CRUD
  • 定义数据模型

    from flask_sqlalchemy import SQLAlchemy
    
    db = SQLAlchemy(app)
    
    class User(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        username = db.Column(db.String(80), unique=True)
        email = db.Column(db.String(120), unique=True)
    
    # 创建表(首次运行)
    with app.app_context():
        db.create_all()
    
  • 增删改查操作

    # 添加用户
    new_user = User(username='alice', email='alice@example.com')
    db.session.add(new_user)
    db.session.commit()
    
    # 查询用户
    user = User.query.filter_by(username='alice').first()
    
2. 高级功能
  • 多数据库绑定

    app.config['SQLALCHEMY_BINDS'] = {
        'users': 'sqlite:///users.db',
        'posts': 'sqlite:///posts.db'
    }
    
    class Post(db.Model):
        __bind_key__ = 'posts'
        id = db.Column(db.Integer, primary_key=True)
    
  • 数据库事件监听

    from sqlalchemy import event
    
    def before_insert_listener(mapper, connection, target):
        target.created_at = datetime.utcnow()
    
    event.listen(User, 'before_insert', before_insert_listener)
    

六、用户认证(Flask-Login)

1. 基础配置
  • 初始化与用户加载
    from flask_login import LoginManager, UserMixin
    
    login_manager = LoginManager(app)
    login_manager.login_view = 'login'
    
    class User(UserMixin, db.Model):
        # ... 模型字段 ...
    
    @login_manager.user_loader
    def load_user(user_id):
        return User.query.get(int(user_id))
    
2. 权限控制
  • 路由保护装饰器

    from flask_login import login_required, current_user
    
    @app.route('/dashboard')
    @login_required
    def dashboard():
        return f'Welcome, {current_user.username}'
    
  • 角色权限管理

    from functools import wraps
    
    def admin_required(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
            if not current_user.is_admin:
                abort(403)
            return f(*args, **kwargs)
        return decorated_function
    

七、大型项目架构

1. 工厂模式与蓝图
  • 工厂函数 (create_app)

    # app/__init__.py
    from flask import Flask
    from .config import Config
    
    def create_app(config_class=Config):
        app = Flask(__name__)
        app.config.from_object(config_class)
    
        # 初始化扩展
        db.init_app(app)
        login.init_app(app)
    
        # 注册蓝图
        from .auth import bp as auth_bp
        app.register_blueprint(auth_bp, url_prefix='/auth')
    
        return app
    
  • 蓝图模块化示例

    # app/auth/routes.py
    from flask import Blueprint
    
    bp = Blueprint('auth', __name__)
    
    @bp.route('/login')
    def login():
        return 'Login Page'
    
2. 数据库迁移(Flask-Migrate)
  • 迁移命令流程
    # 初始化迁移仓库
    flask db init
    
    # 生成迁移脚本
    flask db migrate -m "Initial migration"
    
    # 应用迁移
    flask db upgrade
    
    # 回滚迁移
    flask db downgrade
    

八、RESTful API 开发(Flask-RESTful)

1. 基础 API 设计
  • 资源类与路由绑定
    from flask_restful import Resource, Api
    
    api = Api(app)
    
    class UserAPI(Resource):
        def get(self, user_id):
            user = User.query.get_or_404(user_id)
            return {'username': user.username}
    
    api.add_resource(UserAPI, '/api/users/<int:user_id>')
    
2. 高级功能
  • 请求解析与数据验证
    from flask_restful import reqparse
    
    parser = reqparse.RequestParser()
    parser.add_argument('username', type=str, required=True)
    parser.add_argument('email', type=str, required=True)
    
    class UserListAPI(Resource):
        def post(self):
            args = parser.parse_args()
            new_user = User(username=args['username'], email=args['email'])
            db.session.add(new_user)
            db.session.commit()
            return {'message': 'User created'}, 201
    

九、生产部署与优化

1. WSGI 服务器配置
  • Gunicorn 启动命令
    gunicorn --workers 4 --bind 0.0.0.0:5000 "app:create_app()"
    
2. Nginx 反向代理
server {
    listen 80;
    server_name yourdomain.com;

    location / {
        proxy_pass http://localhost:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    location /static {
        alias /path/to/static;
        expires 30d;
    }
}
3. Docker 容器化
FROM python:3.9-slim

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["gunicorn", "--workers=4", "--bind=0.0.0.0:5000", "app:create_app()"]

十、扩展学习路线

1. 企业级实践
  • 异步任务(Celery)

    from celery import Celery
    
    celery = Celery(app.name, broker=app.config['CELERY_BROKER_URL'])
    
    @celery.task
    def send_email_async(recipient, message):
        # 异步发送邮件逻辑
        pass
    
  • 微服务通信(gRPC/HTTP)

    import requests
    
    @app.route('/aggregate')
    def aggregate_data():
        user_service = requests.get('http://user-service:5000/users')
        return user_service.json()
    
2. 性能监控(Prometheus)
from prometheus_flask_exporter import PrometheusMetrics

metrics = PrometheusMetrics(app)
metrics.info('app_info', 'Application Info', version='1.0.0')

十一、学习资源推荐

  • 官方文档
    Flask Documentation | SQLAlchemy Docs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/984547.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【解决哈希冲突】

哈希冲突 如果两个不同的 key 通过哈希函数得到了相同的索引&#xff0c;这种情况就叫做「哈希冲突」。 哈希冲突不可能避免&#xff0c;只能在算法层面妥善处理出现哈希冲突的情况。 哈希冲突是一定会出现的&#xff0c;因为这个 hash 函数相当于是把一个无穷大的空间映射到…

基于LabVIEW的脚本化子VI动态生成

该示例展示了一种利用LabVIEW VI脚本&#xff08;VI Scripting&#xff09;技术&#xff0c;通过程序化方式动态生成并替换子VI的解决方案。核心逻辑为&#xff1a;基于预定义的模板VI&#xff0c;根据用户选择的数学操作&#xff08;加法或乘法&#xff09;&#xff0c;自动生…

谷歌AI最新发布的可微分逻辑元胞自动机(DiffLogic CA)

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

如何使用Postman,通过Mock的方式测试我们的API

这篇文章将教会大家如何利用 postman&#xff0c;通过 Mock 的方式测试我们的 API。 什么是 Mock Mock 是一项特殊的测试技巧&#xff0c;可以在没有依赖项的情况下进行单元测试。通常情况下&#xff0c;Mock 与其他方法的主要区别就是&#xff0c;用于取代代码依赖项的模拟对…

pytest基础知识

pytest知识了解 pytest的基础知识了解&#xff1a;Python测试框架之pytest详解_lovedingd的博客-CSDN博客_pytest框架 (包含设置断点&#xff0c;pdb&#xff0c;获取最慢的10个用例的执行耗时) pytest-pytest.main()运行测试用例&#xff0c;pytest参数&#xff1a; pytest-…

LM Studio 替换源的方式解决huggingface.co无法访问的问题

安装软件完成之后&#xff0c;不要打开&#xff0c;打开了就直接关闭 在安装目录下&#xff0c;比如我安装在E:\Program Files\LM Studio 下面三个文件中的huggingface.co全部替换为hf-mirror.com然后再打开即可。 E:\Program Files\LM Studio\resources\app\.webpack\rende…

【含文档+PPT+源码】基于微信小程序的乡村振兴民宿管理系统

项目介绍 本课程演示的是一款基于微信小程序的乡村振兴民宿管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.该…

五、OpenGL中Shader与C++数据传输

文章目录 一、概述二、Shader 代码文件的基本格式三、Shader的向量语法介绍四、Shader之间的数据传输五、Shader与C的数据传输uniform六、完整示例 一、概述 在 OpenGL 中&#xff0c;Shader&#xff08;着色器&#xff09;使用 GLSL&#xff08;OpenGL Shading Language&…

docker不停机部署

背景 最近做大疆项目时&#xff0c;后台更新部署时&#xff0c;机场和无人机就会掉线。设备自动重连注册时间比较长&#xff0c;应用长时间不可用。所以需要灰色发布服务。docker-compose的swarm模式可解决此问题。 服务构建脚本Dockerfile # 使用官方Java基础镜像&#xff…

工作记录 2016-12-22

工作记录 2016-12-22 更新的问题 1、修改了Job Summary的Bill Amount的Bug。 2、修改了Account #的宽度。 3、修改了Clearinghouse Status的默认查询的条件。 4、修改了Upload Files的Add File的bug。 5、Pending Pool、Missing Infos加了Write Off&#xff0c;修改了Histor…

QLoggingCategory类使用

QLoggingCategory类使用 QLoggingCategory的概述 QLoggingCategory是Qt的日志策略类&#xff1b;可以通过声明不同的日志策略对象来输出不同的日志信息。打印信息类型如下&#xff1a;宏 Q_DECLARE_LOGGING_CATEGORY(name) 定义一个返回QLoggingCategory对象函数&#xff0c;…

Linux红帽:RHCSA认证知识讲解(五)从红帽和 DNF 软件仓库下载、安装、更新和管理软件包

Linux红帽&#xff1a;RHCSA认证知识讲解&#xff08;五&#xff09;从红帽和 DNF 软件仓库下载、安装、更新和管理软件包 前言一、DNF 软件包管理基础1.1 核心操作命令安装软件包卸载软件包重新安装软件包 1.2 软件仓库原理 二、配置自定义软件仓库步骤 1&#xff1a;清理默认…

Go本地缓存设计与实现

本地缓存是一个项目中很常见的组件。在很多人的眼中就是一个简单的key-value的map存储即可实现&#xff0c;但实际上&#xff0c;设计一个本地缓存需要考虑的问题远比你想象的多&#xff0c;比如说&#xff0c;本地缓存是将数据存储在内存&#xff0c;若数据量激增突破了内存限…

通义万相2.1开源版本地化部署攻略,生成视频再填利器

2025 年 2 月 25 日晚上 11&#xff1a;00 通义万相 2.1 开源发布&#xff0c;前两周太忙没空搞它&#xff0c;这个周末&#xff0c;也来本地化部署一个&#xff0c;体验生成效果如何&#xff0c;总的来说&#xff0c;它在国内文生视频、图生视频的行列处于领先位置&#xff0c…

Jetson Xavier NX安装CUDA加速的OpenCV

我们使用SDKManager刷机完成后&#xff0c;使用jtop查看&#xff0c;发现OpenCV 是不带CUDA加速的&#xff0c;因此&#xff0c;我们需要安装CUDA加速的OpenCV&#xff0c;这样后续在使用的时候速度会快很多。 首先我们先卸载默认OpenCV sudo apt purge libopencv* -y sudo …

基于PaddleNLP使用DeepSeek-R1搭建智能体

基于PaddleNLP使用DeepSeek-R1搭建智能体 最近在学习DeepSeek&#xff0c;找到了PaddleNLP星河社区大模型&#xff0c;跟着敲写了一遍。内容来源&#xff1a;DeepSeek实战训练营&#xff1a;从云端模型部署到应用开发 - 飞桨AI Studio星河社区-人工智能学习与实训社区 本项目基…

给大家推荐8个好玩有趣的网站

1、Home Apothecary 家庭药房 https://apothecary.tips/zh Home Apothecary&#xff08;家庭药房&#xff09;结合传统中医智慧与现代科学验证&#xff0c;提供涵盖睡眠改善、免疫力提升、肠胃调理、活力增强等健康需求的天然养生饮品配方。精选安神助眠、四季调养、舒缓压力…

使用Beanshell前置处理器对Jmeter的请求body进行加密

这里我们用HmacSHA256来进行加密举例&#xff1a; 步骤&#xff1a; 1.先获取请求参数并对请求参数进行处理&#xff08;处理成String类型&#xff09; //处理请求参数的两种方法&#xff1a; //方法一&#xff1a; //获取请求 Arguments args sampler.getArguments(); //转…

利用paddleocr解决图片旋转问题

由于之前使用easyocr识别图片的时候发现旋转的图片或者倒置的图片效果很差&#xff0c;来利用 cv2.minAreaRect()获取旋转角度&#xff0c;只能解决0-90&#xff0c;对于倒置的图片不能很好解决&#xff0c;因此使用paddleocr中方向分类检测&#xff08;只能返回0&#xff0c;1…

数据结构(蓝桥杯常考点)

数据结构 前言&#xff1a;这个是针对于蓝桥杯竞赛常考的数据结构内容&#xff0c;基础算法比如高精度这些会在下期给大家总结 数据结构 竞赛中&#xff0c;时间复杂度不能超过10的7次方&#xff08;1秒&#xff09;到10的8次方&#xff08;2秒&#xff09; 空间限制&#x…