本文将带你从零开始掌握Flask框架,涵盖基础使用、进阶技巧、项目架构设计,并提供完整的接口测试客户端代码。

目录

    • 一、Flask基础入门
      • 1.1 Flask简介与安装
      • 1.2 第一个Flask应用
      • 1.3 路由与请求处理
      • 1.4 请求与响应处理
    • 二、Flask进阶使用
      • 2.1 模板引擎Jinja2
      • 2.2 数据库集成(SQLAlchemy)
      • 2.3 表单处理(Flask-WTF)
    • 三、Flask高阶使用
      • 3.1 蓝图(Blueprints)模块化
      • 3.2 RESTful API开发
      • 3.3 用户认证与授权
    • 四、Flask项目框架结构
      • 4.1 核心文件说明
    • 五、接口测试客户端代码
      • 5.1 Python接口测试客户端
      • 5.2 使用说明
    • 六、Flask部署实践
      • 6.1 生产环境部署
      • 6.2 Docker化部署
    • 七、总结
    • 附录1(实践代码示例)
    • 附录2(其他参考博文)

一、Flask基础入门

1.1 Flask简介与安装

Flask是一个轻量级的Python Web框架,以其简洁、灵活和易扩展的特性受到开发者喜爱。安装只需一行命令:

pip install flask

1.2 第一个Flask应用

创建一个最简单的Flask应用:

from flask import Flaskapp = Flask(__name__)@app.route('/')
def hello_world():return 'Hello, Flask!'if __name__ == '__main__':app.run(host='0.0.0.0', port=5000)

运行后访问 http://127.0.0.1:5000 即可看到结果

1.3 路由与请求处理

Flask通过装饰器定义路由:

@app.route('/user/<username>')
def show_user_profile(username):return f'User: {username}'@app.route('/post/<int:post_id>')
def show_post(post_id):return f'Post ID: {post_id}'

1.4 请求与响应处理

处理GET/POST请求并返回JSON响应:

from flask import request, jsonify@app.route('/login', methods=['GET', 'POST'])
def login():if request.method == 'POST':username = request.form['username']password = request.form['password']# 验证逻辑...return jsonify({'status': 'success', 'user': username})else:return '''<form method="post"><input type="text" name="username"><input type="password" name="password"><input type="submit"></form>'''

二、Flask进阶使用

2.1 模板引擎Jinja2

Flask内置强大的模板引擎,实现前后端分离:

from flask import render_template@app.route('/hello/<name>')
def hello(name):return render_template('hello.html', name=name)

模板文件 templates/hello.html:

<!doctype html>
<html>
<head><title>Hello Page</title></head>
<body><h1>Hello, {{ name }}!</h1>
</body>
</html>

2.2 数据库集成(SQLAlchemy)

使用Flask-SQLAlchemy集成数据库:

pip install flask-sqlalchemy
from flask_sqlalchemy import SQLAlchemyapp.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
db = SQLAlchemy(app)class User(db.Model):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(20), unique=True, nullable=False)email = db.Column(db.String(120), unique=True, nullable=False)def __repr__(self):return f"User('{self.username}', '{self.email}')"# 创建数据库
db.create_all()

2.3 表单处理(Flask-WTF)

使用Flask-WTF处理表单:

pip install flask-wtf
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Lengthclass LoginForm(FlaskForm):username = StringField('Username', validators=[DataRequired(), Length(min=4, max=20)])password = PasswordField('Password', validators=[DataRequired()])submit = SubmitField('Login')

三、Flask高阶使用

3.1 蓝图(Blueprints)模块化

使用蓝图组织大型项目:

# 创建蓝图 auth/__init__.py
from flask import Blueprintauth = Blueprint('auth', __name__)@auth.route('/login')
def login():return 'Login Page'# 在app中注册蓝图
from auth import auth as auth_blueprint
app.register_blueprint(auth_blueprint, url_prefix='/auth')

3.2 RESTful API开发

使用Flask-RESTful构建API:

pip install flask-restful
from flask_restful import Resource, Apiapi = Api(app)class UserAPI(Resource):def get(self, user_id):# 获取用户信息return {'user': user_id}def put(self, user_id):# 更新用户信息return {'status': 'updated'}def delete(self, user_id):# 删除用户return {'status': 'deleted'}api.add_resource(UserAPI, '/user/<int:user_id>')

3.3 用户认证与授权

实现JWT认证:

pip install flask-jwt-extended
from flask_jwt_extended import JWTManager, create_access_token, jwt_requiredapp.config['JWT_SECRET_KEY'] = 'super-secret'  # 实际项目中应使用强密钥
jwt = JWTManager(app)@app.route('/login', methods=['POST'])
def login():username = request.json.get('username', None)password = request.json.get('password', None)# 验证逻辑...access_token = create_access_token(identity=username)return jsonify(access_token=access_token)@app.route('/protected', methods=['GET'])
@jwt_required()
def protected():return jsonify(logged_in_as=current_user)

四、Flask项目框架结构

一个典型的Flask项目结构如下:

myflaskapp/
├── app/
│   ├── __init__.py
│   ├── auth/
│   │   ├── __init__.py
│   │   ├── routes.py
│   │   └── forms.py
│   ├── main/
│   │   ├── __init__.py
│   │   └── routes.py
│   ├── models.py
│   ├── templates/
│   │   ├── base.html
│   │   ├── index.html
│   │   └── auth/
│   │       ├── login.html
│   │       └── register.html
│   └── static/
│       ├── css/
│       ├── js/
│       └── img/
├── config.py
├── requirements.txt
├── run.py
└── tests/├── __init__.py├── test_auth.py└── test_main.py

4.1 核心文件说明

  • run.py: 应用入口
  • config.py: 配置文件
  • app/__init__.py: 应用工厂函数
  • app/models.py: 数据库模型
  • app/templates/: HTML模板
  • app/static/: 静态资源

五、接口测试客户端代码

5.1 Python接口测试客户端

使用requests库编写的通用测试工具:

import requests
import jsonclass FlaskAPITester:def __init__(self, base_url='http://localhost:5000'):self.base_url = base_urlself.session = requests.Session()self.headers = {'Content-Type': 'application/json'}def test_get(self, endpoint, params=None):url = f"{self.base_url}{endpoint}"try:response = self.session.get(url, params=params, headers=self.headers)return self._format_response(response)except Exception as e:return {'error': str(e)}def test_post(self, endpoint, data=None):url = f"{self.base_url}{endpoint}"try:response = self.session.post(url, json=data, headers=self.headers)return self._format_response(response)except Exception as e:return {'error': str(e)}def _format_response(self, response):return {'status_code': response.status_code,'headers': dict(response.headers),'response': self._try_parse_json(response.text)}def _try_parse_json(self, text):try:return json.loads(text)except:return textdef set_token(self, token):self.headers['Authorization'] = f'Bearer {token}'def clear_token(self):if 'Authorization' in self.headers:del self.headers['Authorization']# 使用示例
if __name__ == '__main__':tester = FlaskAPITester()# 测试GET请求print("Testing GET /api/data:")print(tester.test_get('/api/data'))# 测试POST请求print("\nTesting POST /api/login:")login_data = {'username': 'testuser', 'password': 'testpass'}login_response = tester.test_post('/api/login', data=login_data)print(login_response)# 使用返回的token测试受保护端点if 'response' in login_response and 'access_token' in login_response['response']:token = login_response['response']['access_token']tester.set_token(token)print("\nTesting protected endpoint with token:")print(tester.test_get('/api/protected'))

5.2 使用说明

  1. 创建测试器实例:

    tester = FlaskAPITester(base_url='http://your-flask-server:5000')
    
  2. 测试GET接口:

    result = tester.test_get('/api/users', params={'page': 1, 'per_page': 10})
    
  3. 测试POST接口:

    result = tester.test_post('/api/users', data={'name': 'John', 'email': 'john@example.com'})
    
  4. 测试需要认证的接口:

    # 先获取token
    login_res = tester.test_post('/auth/login', data={'username': 'admin', 'password': 'secret'})
    token = login_res['response']['access_token']# 设置token
    tester.set_token(token)# 测试受保护接口
    protected_res = tester.test_get('/api/protected')
    

六、Flask部署实践

6.1 生产环境部署

使用Gunicorn+NGINX部署Flask应用:

# 安装Gunicorn
pip install gunicorn# 启动应用
gunicorn -w 4 -b 0.0.0.0:8000 run:app

6.2 Docker化部署

创建Dockerfile:

FROM python:3.9-slimWORKDIR /appCOPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txtCOPY . .CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:5000", "run:app"]

构建并运行:

docker build -t flask-app .
docker run -d -p 5000:5000 flask-app

七、总结

Flask作为一个轻量级但功能强大的Web框架,适合从简单应用到复杂系统的开发。本文涵盖了:

  1. Flask基础:路由、请求处理、模板渲染
  2. 进阶技术:数据库集成、表单处理
  3. 高级功能:蓝图模块化、RESTful API、认证授权
  4. 项目架构设计
  5. 接口测试客户端实现
  6. 生产环境部署方案

掌握这些知识后,你已具备使用Flask开发专业Web应用的能力。Flask的灵活性允许你根据项目需求选择合适的扩展,构建从简单API到复杂企业级应用的各种解决方案。

最佳实践建议

  1. 始终使用蓝图组织大型项目
  2. 将配置信息分离到环境变量或配置文件中
  3. 使用工厂模式创建应用实例
  4. 为生产环境配置合适的WSGI服务器
  5. 编写单元测试覆盖核心功能
  6. 使用Docker容器化部署应用

附录1(实践代码示例)

from flask import Flask, jsonify, render_template, request"""
实现一个简单的Flask应用程序访问地址:
http://127.0.0.1:8084/
http://192.168.5.8:8084/运行命令:
source venv/bin/activate
python app.py
ps -ef | grep "app.py"
lsof -i :5000
ps -ef | grep "python.*app.py" | grep -v grep | awk '{print $2}' | xargs kill -9
pgrep -f "app.py"  | xargs kill -9 && echo "进程已终止"
"""
# 创建Flask应用实例
app = Flask(__name__)# http://192.168.5.8:8084
@app.route('/')  # 定义路由
def hello_world():  # 定义视图函数"""定义视图函数 hello_world。Args: 无Returns:str: 返回字符串 'Hello, Flask!'"""return 'Hello, Flask!'# http://192.168.5.8:8084/login
@app.route('/login', methods=['GET', 'POST'])
def login():"""处理用户登录请求的函数。Args:无Returns:如果请求方法为POST,则返回包含用户登录信息的JSON格式字符串;如果请求方法不是POST,则返回HTML格式的登录表单。"""if request.method == 'POST':# 处理表单提交username = request.form['username']password = request.form['password']# 验证逻辑...return jsonify({'status': 'success', 'user': username, 'password': password})else:# 显示登录表单return '''<form method="post"><input type="text" name="username"><input type="password" name="password"><input type="submit"></form>'''# http://192.168.5.8:8084/hello/Flask
@app.route('/hello/<name>')
def hello(name):"""向用户显示问候页面。Args:name (str): 用户的名字。Returns:str: 渲染后的 HTML 页面。"""return render_template('hello.html', name=name)# 启动应用
if __name__ == '__main__':app.run(host='0.0.0.0', port=8084, debug=True)

附录2(其他参考博文)

【Python Web】一文搞懂Flask框架:从入门到实战的完整指南

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

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

相关文章

华为云产品图解

框架图核心说明: 1. 分层逻辑清晰 基础设施层(IaaS):提供最基础的计算(ECS/BMS)、存储(OBS/EVS)、网络(VPC/CDN)资源,是所有上层服务的 “物理底座”。 平台服务层(PaaS):基于 IaaS 构建,提供容器编排(CCE)、数据库(GaussDB)、大数据与 AI(ModelArts)、中…

Git 中如何回退到以前的提交记录?

回答重点要在 Git 中回退到以前的提交记录&#xff0c;你可以使用 git reset 命令。这个命令有三个常用选项来控制你想要回退的程度&#xff1a;1&#xff09; git reset --soft <commit> &#xff1a;仅修改 HEAD 指针&#xff0c;不修改索引和工作区内容。2&#xff09…

JavaWeb03——基础标签及样式(表单)(黑马视频笔记)

1.表单标签 及 表单属性表单标签是 &#xff1a;<form> 表单属性有&#xff1a;action 和 method&#xff1b;action属性&#xff1a;规定向何处发送表单数据。method属性&#xff1a;规定用什么方法发送数据。&#xff08;get和post&#xff09;get:在发送的url后面拼接…

STM32的SPI通信(软件读写W25Q64)

在了解完I2C通信后&#xff0c;不免会接触到到SPI通信。而一开始&#xff0c;可能会觉得两者好似没什么区别。为什么要学SPI呢&#xff0c;I2C和SPI有什么区别呢。为此我详细展开说说。1.什么是 SPI&#xff1f;SPI&#xff0c;全称 Serial Peripheral Interface&#xff0c;中…

子词分词器(Byte Pair Encoding + WordPiece)

参考文章&#xff1a;子词分词器BPE和WordPiece理解_wordpeice-CSDN博客 子词分词器BPE和WordPiece理解_wordpeice-CSDN博客 WordPiece 和 BPE 的区别-CSDN博客 点互信息&#xff08;PMI&#xff09;和正点互信息&#xff08;PPMI&#xff09;-CSDN博客 https://zhuanlan.z…

阿里招AI产品运营

AI产品运营&#xff08;岗位信息已经过jobleap.cn授权&#xff0c;可在csdn发布&#xff09;灵犀互娱 广州收录时间&#xff1a; 2025年08月05日职位描述负责AI技术在游戏行业的应用与落地&#xff0c;专注于海外市场的运营中台建设&#xff1b; 将结合AI技术与游戏行业特点&a…

Git 分支迁移完整指南(结合分支图分析)

基于分支图的当前状态分析 分支图关键信息解读​分支结构​&#xff1a; #mermaid-svg-gc9SPnwlbrM2FzHf {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-gc9SPnwlbrM2FzHf .error-icon{fill:#552222;}#mermaid-svg-…

小程序省市级联组件使用

背景。uni-data-picker组件用起来不方便。调整后级联效果欠佳&#xff0c;会关闭弹窗需要重新选择。解决方案。让cursor使用uniapp 原生组件生成懒加载省市级联 <template><view class"picker-cascader"><view class"cascader-label">&l…

Java技术栈/面试题合集(8)-Redis篇

场景 Java入门、进阶、强化、扩展、知识体系完善等知识点学习、性能优化、源码分析专栏分享: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/140870227 通过对面试题进行系统的复习可以对Java体系的知识点进行查漏补缺。 注: 博客: 霸道流氓气质-CSDN博…

川翔云电脑:引领开启算力无边界时代

一、何为云电脑&#xff1f;重新定义“主机”概念 云电脑将传统本地计算机的核心硬件资源&#xff08;CPU、GPU、内存、硬盘等&#xff09;集中部署于远程高性能数据中心&#xff0c;通过网络技术将虚拟桌面实时传输到您的任意访问设备上。 ​​如同将高配主机装入云端&#…

tc 介绍

目录 1.背景 2. tc介绍 3. tc 丢包 1.背景 需要使用tc 构造丢包场景&#xff0c;注意tc 丢包不能确定丢弃的是否是payload 数据包&#xff0c;有可能丢弃 ack 包。 2. tc介绍 1. 无法正常使用 [rootpool-100-1-1-18 /]# [rootpool-100-1-1-18 /]# tc qdisc add dev swif…

LabVIEW注册表操作

​本文围绕LabVIEW中操作Windows 注册表的 4 个 VI 展开&#xff0c;介绍其功能、使用场景等并对比&#xff0c;助力工程师高效运用注册表交互功能。各 VI 功能说明&#xff08;一&#xff09;Write the Key功能&#xff1a;创建新注册表键&#xff0c;设置其值&#xff0c;随后…

阿里云部署若依后,浏览器能正常访问,但是apifox和小程序访问后报错链接被重置

项目场景&#xff1a;阿里云部署若依后浏览器能正常通过https访问,但是在apifox和小程序调用接口的时候生报错E问题描述apifox报错&#xff1a;curl报错&#xff1a;通过curl可以清楚的看到通过域名是能准确的访问到IP地址的&#xff0c;说明这个DNS是没有问题的&#xff0c;但…

升级 Elasticsearch 到新的 AWS Java SDK

作者&#xff1a;来自 Elastic David Turner, Dianna Hohensee Elasticsearch 使用官方的 AWS Java SDK 集成了某些 Amazon Web Services (AWS) 功能。这些集成最早在近 10 年前发布的 Elasticsearch 2.0 版本中引入。 最近&#xff0c;AWS 宣布 Elasticsearch 过去十年使用的…

从0到1学习微服务项目黑马头条day01-《APP端登录功能实现》

个人主页&#xff1a;VON文章所属专栏&#xff1a;黑马头条个人唯一微信&#xff1a;微信 有一起学习微服务的小伙伴可以加作者微信&#xff1a;单击即可添加 目录 一、前言 二、项目概述 1、技术栈 2、项目引入 三、改造项目 1、创建heima-leadnews-user 2、创建实体…

Renesas Electronics RZ/V2N 评估套件

简介Renesas Electronics RZ/V2N评估套件采用RZ/V2N中档嵌入式AI微处理器 (MPU) 为嵌入式人工智能 (AI) 应用提供全面的开发平台。该评估套件包括两块板&#xff1a;主板 (RTK0EF0186C02000BJ)&#xff0c;紧凑的153mm x 100mm外形尺寸和RTK0EF0168B00000BJ扩展板。其核心是RZ/…

使用PHP与Apache实现服务器端文件管理

引言 作为前端开发者&#xff0c;你可能经常需要与服务器文件系统交互。本文将详细介绍如何通过PHP配合Apache实现服务器端文件管理功能。即使你没有任何PHP经验&#xff0c;也能按照本教程实现完整解决方案&#xff01; 系统准备 PHP下载与安装 访问PHP官网下载页面 选择与…

在Word和WPS文字中如何输入汉字的偏旁部首

如何在Word和WPS文字中输入偏旁部首&#xff1f;许多输入法会把常见的偏旁部首直接放到词库&#xff0c;对于词库中没有的可以试试这个方法&#xff1a;先输入一个有这个偏旁部首的字&#xff0c;尽量简单一点的&#xff0c;然后选中这个字插入-符号-其他符号。滚动到这个偏旁部…

day44 力扣1143.最长公共子序列 力扣1035.不相交的线 力扣53. 最大子序和 力扣392.判断子序列

最长公共子序列 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&…

应用7:用小白量化智能体金融模块做一个股票选股工具

应用7&#xff1a;用小白量化智能体金融模块做一个股票选股工具 【小白量化智能体】包含有丰富的金融模块。可以让智能体写各种金融量化工具。 我用让小白量化智能体写一个股票选股工具。 我们给【小白量化智能体】一个程序生成话术。 帮我写一个 选股 的应用程序&#xff0c;要…