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 requestusername = 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 SQLAlchemydb = 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 eventdef 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, UserMixinlogin_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 wrapsdef 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 Configdef 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_bpapp.register_blueprint(auth_bp, url_prefix='/auth')return app
    
  • 蓝图模块化示例

    # app/auth/routes.py
    from flask import Blueprintbp = 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, Apiapi = 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 reqparseparser = 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-slimWORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txtCOPY . .CMD ["gunicorn", "--workers=4", "--bind=0.0.0.0:5000", "app:create_app()"]

十、扩展学习路线

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

    from celery import Celerycelery = 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 PrometheusMetricsmetrics = PrometheusMetrics(app)
metrics.info('app_info', 'Application Info', version='1.0.0')

十一、学习资源推荐

  • 官方文档
    Flask Documentation | SQLAlchemy Docs

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java开发指南 | 第三十四篇】IDEA没有Java Enterprise——解决方法

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 1、新建Java项目2、单击项目名&#xff0c;并连续按两次shift键3、在搜索栏搜索"添加框架支持"4、勾选Web应用程序5、最终界面6、添加Tomcat 1、新建Java项目 2、单击项目名&#xff0c;并连续按两次…

深度学习原理与Pytorch实战

深度学习原理与Pytorch实战 第2版 强化学习人工智能神经网络书籍 python动手学深度学习框架书 TransformerBERT图神经网络&#xff1a; 技术讲解 编辑推荐 1.基于PyTorch新版本&#xff0c;涵盖深度学习基础知识和前沿技术&#xff0c;由浅入深&#xff0c;通俗易懂&#xf…

uniapp项目运行失败Error: getaddrinfo *.bspapp.com 文件查找失败uview-ui及推荐MarkDown软件 Typora

一、uniapp项目运行失败Error: getaddrinfo *.bspapp.com 文件查找失败uview-ui 在运行一个uniapp项目时&#xff0c;出现报错 文件查找失败&#xff1a;uview-ui&#xff0c;Error: getaddrinfo ENOTFOUND 960c0a.bspapp.com。hostname异常&#xff0c;报错的详细信息如下&…

什么是vue的keep-alive?它是如何实现的?具体缓存了什么内容?

文章目录 一、keep-alive 的核心作用二、实现原理1. 缓存管理策略2. 核心源码解析&#xff08;Vue 2.x 简化版&#xff09;3. 缓存生命周期 三、缓存的具体内容1. 缓存对象结构2. 具体缓存内容 四、使用示例1. 基础用法2. 配置缓存策略 五、注意事项六、实现流程图解 Vue 的 k…

pytest基础知识

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

Liunx(CentOS-6-x86_64)使用Nginx部署Vue项目

一&#xff1a;编译vue项目和上传到linux系统 通过本地编译器编译后的文件 上传服务器后的 二&#xff1a;安装 node&#xff08;版本 v16.20.2&#xff09;和npm&#xff08; 8.19.4或 9.6.5&#xff09; 备注一&#xff1a;安装nodejs就是安装node和npm&#xff0c; su…

分布式锁—Redisson的同步器组件

1.Redisson的分布式锁简单总结 Redisson分布式锁包括&#xff1a;可重入锁、公平锁、联锁、红锁、读写锁。 (1)可重入锁RedissonLock 非公平锁&#xff0c;最基础的分布式锁&#xff0c;最常用的锁。 (2)公平锁RedissonFairLock 各个客户端尝试获取锁时会排队&#xff0c;按照队…

2025年渗透测试面试题总结-字某某动-安全研究实习生(一面)(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 字某某动-安全研究实习生&#xff08;一面&#xff09; 一、岗位认知与方向选择 1. 对公司业务的理解 …

Dify平台部署记录

安装dify项目 官网地址&#xff1a;http://difyai.com/ github地址&#xff1a;https://github.com/langgenius/dify 下载项目&#xff1a; git clone https://github.com/langgenius/dify.git下载过慢&#xff0c;直接访问网页下载zip压缩包&#xff1a; 解压&#xff0c;…

串口数据记录仪DIY,体积小,全开源

作用 产品到客户现场出现异常情况&#xff0c;这个时候就需要一个日志记录仪、黑匣子&#xff0c;可以记录产品的工作情况&#xff0c;当出现异常时&#xff0c;可以搜集到上下文的数据&#xff0c;从而判断问题原因。 之前从网上买过&#xff0c;但是出现过丢数据的情况耽误…

如何用HTML5 Canvas实现电子签名功能✍️

&#x1f916; 作者简介&#xff1a;水煮白菜王&#xff0c;一位资深前端劝退师 &#x1f47b; &#x1f440; 文章专栏&#xff1a; 前端专栏 &#xff0c;记录一下平时在博客写作中&#xff0c;总结出的一些开发技巧和知识归纳总结✍。 感谢支持&#x1f495;&#x1f495;&a…

Uniapp项目运行到微信小程序、H5、APP等多个平台教程

摘要&#xff1a;Uniapp作为一款基于Vue.js的跨平台开发框架&#xff0c;支持“一次开发&#xff0c;多端部署”。本文将手把手教你如何将Uniapp项目运行到微信小程序、H5、APP等多个平台&#xff0c;并解析常见问题。 一、环境准备 在开始前&#xff0c;请确保已安装以下工具…

Python设计模式 - 建造者模式

定义 建造者模式是一种创建型设计模式&#xff0c;主要用于构建包含多个组成部分的复杂对象。它将对象的构建过程与表示分离&#xff0c;使得同样的构建过程可以创建不同的对象表示。 结构 抽象建造者&#xff08;Builder&#xff09;&#xff1a;声明创建产品的各个部件的方…

音乐API

https://neteasecloudmusicapi.vercel.app/docs/#/https://neteasecloudmusicapi.vercel.app/docs/#/ 使用实例 所有榜单内容摘要 说明 : 调用此接口,可获取所有榜单内容摘要 接口地址 : /toplist/detail 调用例子 : /toplist/detail 获取歌单所有歌曲 说明 : 由于网易云…

Jetpack Compose — 入门实践

一、项目中使用 Jetpack Compose 从此节开始,为方便起见,如无特殊说明,Compose 均指代 Jetpack Compose。 开发工具: Android Studio 1.1 创建支持 Compose 新应用 新版 Android Studio 默认创建新项目即为 Compose 项目。 注意:在 Language 下拉菜单中,Kotlin 是唯一可…

【day12】进程切换与调度:linux系统的幕后操控术

【Day12】进程切换与调度&#xff1a;linux系统的幕后操控术 进程优先级进程属性&#xff1a;UID进程属性&#xff1a;PRI和NI进程饥饿 竞争/独立/并行/并发进程切换进程调度&#xff08;O(1)调度算法&#xff09; 进程优先级 进程优先级的本质&#xff1a;衡量进程得到CPU资源…

STM32之BKP

VBAT备用电源。接的时候和主电源共地&#xff0c;正极接在一起&#xff0c;中间连接一个100nf的电容。BKP是RAM存储器。 四组VDD都要接到3.3V的电源上&#xff0c;要使用备用电池&#xff0c;就把电池正极接到VBAT&#xff0c;负极跟主电源共地。 TEMPER引脚先加一个默认的上拉…

mapbox高阶,结合threejs(threebox)添加管道

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️threebox Tube静态对象二、🍀使用thr…

Android15使用FFmpeg解码并播放MP4视频完整示例

效果: 1.编译FFmpeg库: 下载FFmpeg-kit的源码并编译生成安装平台库 2.复制生成的FFmpeg库so文件与包含目录到自己的Android下 如果没有prebuiltLibs目录,创建一个,然后复制 包含目录只复制arm64-v8a下

利用FatJar彻底解决Jar包冲突(三)

利用FatJar彻底解决Jar包冲突 Spring 容器的加载与隔离⽀持注解配置⽂件定位与容器初始化嵌套Spring容器的加载 隔离优化EagleEye traceId不⼀致问题原因解决 Spring 容器的加载与隔离 ⽀持注解 这个⽐较容易&#xff0c;主要是我们之前的应⽤不⽀持⼆⽅包内部的注解&#xf…