当前位置: 首页 > news >正文

Python Web开发:Flask框架入门

Python Web开发:Flask框架入门

一、Flask简介

Flask是一个轻量级的Python Web框架,遵循WSGI规范。

1.1 Flask的特点

- 轻量级,核心简单
- 灵活,可扩展性强
- 内置开发服务器和调试器
- RESTful请求分发
- Jinja2模板引擎
- 支持单元测试

1.2 安装Flask

pip install flask

二、第一个Flask应用

2.1 Hello World

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
return 'Hello, World!'

if __name__ == '__main__':
app.run(debug=True)

# 运行: python app.py
# 访问: http://localhost:5000

2.2 路由和视图函数

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

@app.route('/post/')
def show_post(post_id):
return f'Post ID: {post_id}'

# URL转换器
# string: 默认,接受任何不包含斜杠的文本
# int: 接受整数
# float: 接受浮点数
# path: 类似string,但接受斜杠
# uuid: 接受UUID字符串

三、HTTP方法

3.1 处理不同的HTTP方法

from flask import request

@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
# 处理登录逻辑
return f'Logging in {username}'
else:
# 显示登录表单
return '''





'''

3.2 RESTful API

@app.route('/api/users', methods=['GET'])
def get_users():
return {'users': ['Alice', 'Bob']}

@app.route('/api/users', methods=['POST'])
def create_user():
data = request.get_json()
return {'message': 'User created', 'user': data}, 201

@app.route('/api/users/', methods=['PUT'])
def update_user(user_id):
data = request.get_json()
return {'message': f'User {user_id} updated'}

@app.route('/api/users/', methods=['DELETE'])
def delete_user(user_id):
return {'message': f'User {user_id} deleted'}

四、请求对象

4.1 访问请求数据

from flask import request

@app.route('/search')
def search():
# 查询参数
query = request.args.get('q', '')

# 表单数据
username = request.form.get('username')

# JSON数据
data = request.get_json()

# 文件上传
file = request.files.get('file')

# 请求头
user_agent = request.headers.get('User-Agent')

# Cookie
session_id = request.cookies.get('session_id')

return f'Search: {query}'

五、响应对象

5.1 返回不同类型的响应

from flask import jsonify, make_response, redirect, url_for

# 返回JSON
@app.route('/api/data')
def get_data():
return jsonify({'key': 'value'})

# 自定义响应
@app.route('/custom')
def custom_response():
response = make_response('Custom response')
response.headers['X-Custom-Header'] = 'Value'
response.status_code = 200
return response

# 重定向
@app.route('/old-url')
def old_url():
return redirect(url_for('new_url'))

@app.route('/new-url')
def new_url():
return 'New URL'

# 设置Cookie
@app.route('/set-cookie')
def set_cookie():
response = make_response('Cookie set')
response.set_cookie('username', 'Alice')
return response

六、模板渲染

6.1 使用Jinja2模板

from flask import render_template

@app.route('/hello/')
def hello_template(name):
return render_template('hello.html', name=name)

# templates/hello.html



Hello

Hello, {{ name }}!




6.2 模板语法

# 变量
{{ variable }}

# 控制结构
{% if user %}

Hello, {{ user }}!


{% else %}

Hello, Guest!


{% endif %}

# 循环
{% for item in items %}

{{ item }}


{% endfor %}

# 模板继承
# base.html



{% block head %}
{% block title %}{% endblock %}
{% endblock %}


{% block content %}{% endblock %}



# child.html
{% extends "base.html" %}
{% block title %}Home{% endblock %}
{% block content %}

Welcome


{% endblock %}

七、静态文件

7.1 提供静态文件

# 目录结构
myapp/
├── app.py
├── static/
│ ├── css/
│ │ └── style.css
│ ├── js/
│ │ └── script.js
│ └── images/
│ └── logo.png
└── templates/

# 在模板中引用



八、会话管理

8.1 使用Session

from flask import session

app.secret_key = 'your-secret-key-here'

@app.route('/login', methods=['POST'])
def login():
session['username'] = request.form['username']
return redirect(url_for('index'))

@app.route('/logout')
def logout():
session.pop('username', None)
return redirect(url_for('index'))

@app.route('/')
def index():
if 'username' in session:
return f'Logged in as {session["username"]}'
return 'Not logged in'

九、错误处理

9.1 自定义错误页面

@app.errorhandler(404)
def not_found(error):
return render_template('404.html'), 404

@app.errorhandler(500)
def internal_error(error):
return render_template('500.html'), 500

# 手动触发错误
from flask import abort

@app.route('/admin')
def admin():
if not is_admin():
abort(403)
return 'Admin page'

十、蓝图(Blueprints)

10.1 使用蓝图组织代码

# auth.py
from flask import Blueprint

auth_bp = Blueprint('auth', __name__, url_prefix='/auth')

@auth_bp.route('/login')
def login():
return 'Login page'

@auth_bp.route('/logout')
def logout():
return 'Logout'

# app.py
from flask import Flask
from auth import auth_bp

app = Flask(__name__)
app.register_blueprint(auth_bp)

# 访问: /auth/login, /auth/logout

十一、数据库集成

11.1 使用Flask-SQLAlchemy

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
db = SQLAlchemy(app)

class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)

def __repr__(self):
return f''

# 创建表
with app.app_context():
db.create_all()

# CRUD操作
@app.route('/users', methods=['POST'])
def create_user():
data = request.get_json()
user = User(username=data['username'], email=data['email'])
db.session.add(user)
db.session.commit()
return {'id': user.id}, 201

@app.route('/users/')
def get_user(user_id):
user = User.query.get_or_404(user_id)
return {'username': user.username, 'email': user.email}

十二、表单处理

12.1 使用Flask-WTF

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Email

class LoginForm(FlaskForm):
username = StringField('Username', validators=[DataRequired()])
password = PasswordField('Password', validators=[DataRequired()])
submit = SubmitField('Login')

@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
username = form.username.data
password = form.password.data
# 处理登录
return redirect(url_for('index'))
return render_template('login.html', form=form)

十三、中间件和钩子

13.1 请求钩子

@app.before_request
def before_request():
# 在每个请求之前执行
print('Before request')

@app.after_request
def after_request(response):
# 在每个请求之后执行
response.headers['X-Custom-Header'] = 'Value'
return response

@app.teardown_request
def teardown_request(exception):
# 请求结束时执行(即使发生异常)
if exception:
print(f'Exception: {exception}')

十四、配置管理

14.1 配置方式

# 方式1:直接设置
app.config['DEBUG'] = True
app.config['SECRET_KEY'] = 'your-secret-key'

# 方式2:从对象加载
class Config:
DEBUG = False
TESTING = False
SECRET_KEY = 'your-secret-key'

class DevelopmentConfig(Config):
DEBUG = True

app.config.from_object(DevelopmentConfig)

# 方式3:从文件加载
# config.py
DEBUG = True
SECRET_KEY = 'your-secret-key'

app.config.from_pyfile('config.py')

# 方式4:从环境变量
app.config.from_envvar('APP_CONFIG_FILE')

十五、日志配置

import logging
from logging.handlers import RotatingFileHandler

if not app.debug:
handler = RotatingFileHandler('app.log', maxBytes=10000, backupCount=3)
handler.setLevel(logging.INFO)
app.logger.addHandler(handler)

app.logger.info('Application started')

十六、部署

16.1 使用Gunicorn

# 安装
pip install gunicorn

# 运行
gunicorn -w 4 -b 0.0.0.0:8000 app:app

16.2 使用uWSGI

# 安装
pip install uwsgi

# 运行
uwsgi --http :8000 --wsgi-file app.py --callable app

十七、最佳实践

1. 使用蓝图组织大型应用
2. 使用配置对象管理不同环境
3. 使用Flask-SQLAlchemy管理数据库
4. 使用Flask-WTF处理表单
5. 使用Flask-Login管理用户认证
6. 使用Flask-Migrate管理数据库迁移
7. 使用环境变量存储敏感信息
8. 启用CSRF保护
9. 使用HTTPS
10. 配置适当的日志级别

十八、总结

Flask是一个灵活而强大的Web框架,适合从小型项目到大型应用的开发。通过掌握路由、模板、数据库集成等核心概念,以及使用蓝图、扩展等高级特性,可以高效地构建Web应用。Flask的简洁设计和丰富的扩展生态使其成为Python Web开发的热门选择。

http://www.zskr.cn/news/1524388.html

相关文章:

  • USB EHCI帧边界对齐与相位偏移:解决高速等时传输卡顿的底层机制
  • 明日方舟智能助手MAA:一键解放双手的全能自动化解决方案
  • Ryujinx Switch模拟器完整指南:在电脑上玩转任天堂游戏的终极教程
  • 2026 长沙奢侈品回收测评:持证经营 + 快速上门 + 透明报价 - 薛定谔的梨花猫
  • GHelper轻量级控制工具:华硕笔记本性能调优的终极解决方案
  • MPC8540内存映射与地址转换机制详解:LAW、ATMU与CCSR配置实战
  • MPC8544E电源管理与性能监控:硬件级优化实战解析
  • Go 服务优雅退出:从 Context 传播到连接排空的工程化实践
  • 如何快速解锁Cursor AI完整功能:终极配置管理指南
  • MPC8560/8540 ADS开发板JTAG调试与系统配置实战指南
  • 深度解析2025高效Android保活方案:从底层原理到实战应用的最佳实践
  • 释放华硕笔记本性能:用GHelper替代Armoury Crate的完整指南
  • 如何用VutronMusic一站式解决跨平台音乐管理与智能播放难题
  • 2026年6月上海奢侈品回收便民实用手册 - 薛定谔的梨花猫
  • 嵌入式主板架构解析:时钟、电源与配置的工程实践
  • Kubernetes GPU 调度:拓扑感知与多租户隔离
  • 深入解析MPC7450异常处理:从原理到实战的嵌入式系统核心机制
  • MPC8309 eSDHC控制器:命令响应、状态监控与中断处理实战解析
  • AI一键多发真的靠谱吗_CSDN_AI数字营销完整试用记录
  • 2026年众智商学院官网怎么找、400电话怎么拨打、冯老师微信怎么加、课程怎么报名 - 众智商学院职业教育
  • 从平面到立体:5分钟免费解锁你的3D打印创意之旅
  • 专业级开源工具:WuMgr如何解决Windows 10更新管理难题
  • Ryujinx Switch模拟器终极指南:在PC上完美运行Switch游戏的实战解决方案
  • UI-TARS桌面版终极指南:5分钟快速上手,用自然语言彻底解放你的重复GUI操作
  • 2026 奢侈品包包回收避坑调研报告,五大商户真实交易测评汇总 - 讯息早知道
  • 3步完成AutoHotkey v1到v2脚本转换的完整解决方案
  • 200+插件一键安装:Koikatu HF Patch终极增强补丁完全指南
  • 广州黄金回收靠谱门店推荐,报价透明不压价 - 讯息早知道
  • 终极指南:如何在电脑上使用Citra模拟器重温任天堂3DS经典游戏
  • 【力扣100题】91.数组中的第K个最大元素