Flask 入门:用 Python 快速搭建你的第一个 Web 应用_python flask 网站开发例子
Flask 框架详解
概述
Flask 是一个轻量级的 Python Web 应用程序框架,由奥地利开发者 Armin Ronacher 在 2010 年创建。最初它作为 April Fool\'s joke(愚人节玩笑)的一部分发布,名为\"Denied\",后来迅速发展成为一个成熟且广受欢迎的 Web 框架。
核心组件
Flask 建立在两个强大的 Python 库之上:
1. Werkzeug
- 一个完整的 WSGI(Web Server Gateway Interface)工具包
- 负责处理 HTTP 请求和响应
- 提供 URL 路由、请求和响应对象、cookie 管理等基础功能
- 支持会话管理、文件上传、安全头设置等 Web 开发必需功能
2. Jinja2
- 一个现代且设计友好的模板引擎
- 用于生成动态 HTML 内容
- 支持模板继承、自动 HTML 转义(防止 XSS 攻击)
- 提供丰富的过滤器、测试和全局变量等功能
微框架特性
Flask 被称为\"微框架\"(microframework),因为:
- 核心代码非常精简(仅有约30个源文件)
- 不包含ORM(对象关系映射)或表单验证等\"全栈\"功能
- 遵循\"约定优于配置\"原则,减少不必要的复杂性
- 保持核心简单但可扩展性强
扩展生态系统
虽然 Flask 核心简单,但通过丰富的扩展库可以轻松添加各种功能:
常用扩展示例
- Flask-SQLAlchemy: 提供 ORM 功能,支持多种数据库
- Flask-Login: 处理用户认证和会话管理
- Flask-WTF: 表单验证和 CSRF 保护
- Flask-Mail: 电子邮件发送支持
- Flask-RESTful: 构建 REST API 的工具
- Flask-Caching: 提供缓存功能
适用场景
Flask 的轻量级特性使其适用于:
- 初学者学习 Web 开发
- 快速原型开发
- 小型到中型 Web 应用
- 微服务架构中的单个服务
- 作为 API 后端服务
- 教学和演示项目
同时,通过合理使用扩展,Flask 也能满足企业级应用的需求,许多知名公司如 LinkedIn、Pinterest 和 Netflix 都在生产环境中使用 Flask。
环境准备
1. 安装 Python
Flask 需要 Python 3.6 或更高版本。推荐使用 Python 3.8+ 以获得最佳兼容性。可以通过以下命令检查 Python 版本:
python --version# 或python3 --version
如果尚未安装 Python,可以从 python.org 下载最新版本。
2. 创建虚拟环境(强烈推荐)
虚拟环境可以隔离项目依赖,避免包冲突。创建和激活虚拟环境的步骤如下:
Linux/macOS:
python -m venv venvsource venv/bin/activate # 激活虚拟环境
Windows:
python -m venv venvvenv\\Scripts\\activate # 激活虚拟环境
激活后,终端提示符通常会显示虚拟环境名称,如 (venv)
。
3. 安装 Flask
在激活的虚拟环境中运行:
pip install flask
安装完成后可以验证版本:
python -c \"import flask; print(flask.__version__)\"
创建第一个 Flask 应用
基础应用结构
创建一个新文件 app.py
,添加以下代码:
from flask import Flask# 创建 Flask 应用实例# __name__ 让 Flask 知道在哪里查找模板和静态文件app = Flask(__name__)# 使用 route 装饰器定义URL路由@app.route(\'/\')def hello_world(): # 这个函数会在访问根URL时被调用 return \'Hello, World!\'# 确保这个脚本只在直接运行时执行,而不是被导入时if __name__ == \'__main__\': # 启动开发服务器 # debug=True 开启调试模式,会自动重载代码更改 app.run(debug=True)
代码解析
Flask(__name__)
:创建应用实例,__name__
参数帮助 Flask 确定应用根目录@app.route(\'/\')
:路由装饰器,将 URL 路径映射到视图函数hello_world()
:视图函数,返回响应内容app.run()
:启动内置开发服务器
运行应用
在终端执行:
python app.py
典型输出:
* Serving Flask app \'app\'* Debug mode: on* Running on http://127.0.0.1:5000 (Press CTRL+C to quit)* Restarting with stat* Debugger is active!* Debugger PIN: 123-456-789
打开浏览器访问 http://localhost:5000
或 http://127.0.0.1:5000
,你将看到 \"Hello, World!\" 的页面。
添加更多功能
1. 动态路由示例
@app.route(\'/user/\')def show_user_profile(username): # 在URL中捕获变量 return f\'User {username}\'@app.route(\'/post/\')def show_post(post_id): # 可以指定变量类型 (int, float, path等) return f\'Post {post_id}\'
访问示例:
/user/john
→ 显示 \"User john\"/post/123
→ 显示 \"Post 123\"
2. 模板渲染进阶
创建 templates/index.html
:
{{ title }} .welcome { color: blue; font-size: 24px; } Hello, {{ name }}! Current time: {{ current_time }}
修改视图函数:
from flask import render_templatefrom datetime import datetime@app.route(\'/hello/\')def hello(name): return render_template( \'index.html\', title=\'Welcome Page\', name=name.capitalize(), current_time=datetime.now().strftime(\'%Y-%m-%d %H:%M:%S\') )
3. 表单处理进阶
from flask import request, redirect, url_for@app.route(\'/login\', methods=[\'GET\', \'POST\'])def login(): if request.method == \'POST\': username = request.form.get(\'username\', \'guest\') remember = \'remember\' in request.form # 复选框处理 return redirect(url_for(\'hello\', name=username)) return \'\'\' Username:
Password:
Remember me
\'\'\'
项目结构建议
随着应用规模增长,推荐采用模块化结构:
/myflaskapp│├── /application # 主应用包│ ├── __init__.py # 应用工厂│ ├── routes.py # 路由定义│ ├── /static│ │ ├── /css # CSS文件│ │ ├── /js # JavaScript文件│ │ └── /images # 图片资源│ └── /templates # 模板文件│ ├── base.html # 基础模板│ ├── index.html # 首页模板│ └── /auth # 认证相关模板│ └── login.html│├── config.py # 配置文件├── requirements.txt # 依赖列表└── wsgi.py # WSGI入口点
部署选项详解
1. 传统服务器部署
使用 Nginx + Gunicorn 的典型部署流程:
pip install gunicorngunicorn -w 4 -b 127.0.0.1:8000 wsgi:app
然后在 Nginx 配置中添加反向代理:
server { listen 80; server_name yourdomain.com; location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }}
2. 云平台部署示例(Heroku)
- 创建
Procfile
:
web: gunicorn wsgi:app
- 创建
runtime.txt
指定 Python 版本:
python-3.9.7
- 部署命令:
heroku loginheroku creategit push heroku main