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

Python的Web框架

目录

简介

一、Flask框架概述

二、第一个Flask应用

三、路由系统

1. 动态路由

2. 支持多种HTTP方法

3. Jinja2模板

4. 模板继承

四、表单处理

1. 创建表单类与验证规则

2. 模板中渲染表单

3. 常用验证器

五、项目结构与生产部署

1. 典型项目结构

2. 生产环境部署

六、实战案例:构建简单博客应用

1. 项目结构

2. 核心代码实现

3. 模板文件(index.html)

4. 功能说明

七、总结


简介

在Python Web开发领域,Flask以其"微框架"的灵活特性成为众多开发者的首选。无论是快速原型开发还是构建中小型应用,Flask都能以简洁的设计让开发者专注于业务逻辑。本文将从基础概念到实战案例,带您全面了解Flask框架的核心功能与实践应用。

一、Flask框架概述

Flask被称为"微框架",并非指功能弱小,而是强调核心设计的简洁性——它仅包含构建Web应用的必要组件,却通过灵活的扩展机制满足各种需求。其核心依赖两个关键库:

  • Werkzeug:提供WSGI接口、HTTP请求处理和路由系统的底层支持
  • Jinja2:强大的模板引擎,实现动态HTML页面的渲染

这种设计让Flask具有以下优势:

  • 入门门槛低,适合新手快速掌握
  • 无强制项目结构,适配不同规模的开发需求
  • 生态丰富,通过扩展可轻松添加认证、ORM等高级功能

安装Flask只需一行命令:

pip install flask

二、第一个Flask应用

创建Flask应用的过程简单到令人惊讶。新建一个​​app.py​​文件,输入以下代码:

from flask import Flask# 创建Flask应用实例
app = Flask(__name__)# 定义根路由的视图函数
@app.route('/')
def hello_world():return 'Hello, World!'# 启动应用(仅在直接运行时执行)
if __name__ == '__main__':app.run(debug=True)

代码解析

  • ​Flask(__name__)​​​:实例化应用时传入​​__name__​​,帮助Flask确定配置路径
  • ​@app.route('/')​​​:路由装饰器,将根URL映射到​​hello_world​​函数
  • ​debug=True​​:开启调试模式,支持代码修改自动重载和错误详情显示

运行应用

python app.py

访问​​http://127.0.0.1:5000/​​,即可看到"Hello, World!"的页面。

三、路由系统

Flask的路由系统是其核心魅力之一,通过装饰器实现URL到视图函数的灵活映射。

1. 动态路由
@app.route('/greet/<name>')
def greet(name):return f'Hello, {name}!'

当访问​​/greet/Alice​​​时,​​name​​参数会被赋值为"Alice",返回"Hello, Alice!"。

2. 支持多种HTTP方法
@app.route('/submit', methods=['POST'])
def submit():return 'Form submitted successfully!'

通过​​methods​​参数指定允许的请求方法,避免GET请求访问表单处理接口。

3. Jinja2模板

Flask默认使用Jinja2模板引擎,将HTML与Python代码分离。创建​​templates/greet.html​​:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Flask Example</title>
</head>
<body><h1>Hello, {{ name }}!</h1>
</body>
</html>

视图函数中使用​​render_template​​渲染模板:

from flask import render_template@app.route('/greet/<name>')
def greet(name):return render_template('greet.html', name=name)
4. 模板继承

通过模板继承避免重复代码,创建基础模板​​templates/base.html​​:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>{% block title %}My Website{% endblock %}</title>
</head>
<body><header><h1>Welcome to My Website</h1></header><div>{% block content %}{% endblock %}</div><footer><p>© 2025 My Website</p></footer>
</body>
</html>

子模板​​templates/index.html​​继承基础模板:

{% extends "base.html" %}
{% block title %}Home{% endblock %}
{% block content %}
<h2>Welcome to the homepage!</h2>
{% endblock %}

四、表单处理

Flask结合​​Flask-WTF​​扩展简化表单处理,首先安装:

pip install flask-wtf
1. 创建表单类与验证规则
from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import DataRequiredapp = Flask(__name__)
app.secret_key = 's3cr3t'  # 用于CSRF保护class NameForm(FlaskForm):name = StringField("Name", validators=[DataRequired()])@app.route('/', methods=['GET', 'POST'])
def index():form = NameForm()if form.validate_on_submit():return f'Hello, {form.name.data}!'return render_template('index.html', form=form)
2. 模板中渲染表单
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Flask Form</title>
</head>
<body><h1>Enter your name:</h1><form method="POST">{{ form.csrf_token }}  <!-- CSRF令牌 --><label for="name">Name:</label>{{ form.name() }}<br><br><button type="submit">Submit</button></form>{% if form.name.data %}<h2>Hello, {{ form.name.data }}!</h2>{% endif %}
</body>
</html>
3. 常用验证器
  • ​DataRequired()​​:确保字段不为空
  • ​Length(min=2, max=50)​​:限制输入长度
  • ​Email()​​:验证邮箱格式
  • ​EqualTo('field_name')​​:验证字段值相等

五、项目结构与生产部署

1. 典型项目结构
/my_flask_app//app//templates/index.html/static//css//js/__init__.pyroutes.pyforms.pyrun.py#  /templates:存放所有 HTML 模板文件。
#  /static:存放静态文件(如cSS、JS、图片等)
#  init_·py:初始化 Flask 应用。
#  routes.py:定义所有路由和视图函数。
#  forms.py:定义表单类。
2. 生产环境部署

开发环境使用​​app.run()​​启动,但生产环境推荐使用Gunicorn+Nginx组合:

# 安装Gunicorn
pip install gunicorn# 启动命令(4个工作进程)
gunicorn -w 4 run:app

Nginx作为反向代理,配置示例:

server {listen 80;server_name your_domain.com;location /static {alias /path/to/your/static;}location / {proxy_pass http://127.0.0.1:8000;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}
}

六、实战案例:构建简单博客应用

下面通过一个完整案例演示Flask的综合应用,实现一个允许用户发布和查看文章的简单博客。

1. 项目结构
/simple_blog/app.py/templates/index.html
2. 核心代码实现
from flask import Flask, render_template, requestapp = Flask(__name__)
# 内存中存储文章数据(实际项目应使用数据库)
posts = []@app.route('/', methods=['GET', 'POST'])
def index():if request.method == 'POST':title = request.form['title']content = request.form['content']posts.append({'title': title, 'content': content})return render_template('index.html', posts=posts)if __name__ == '__main__':app.run(debug=True)
3. 模板文件(index.html)
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Simple Blog</title>
</head>
<body><h1>Welcome to the Blog!</h1><h2>Submit a Post</h2><form method="POST"><label for="title">Title:</label><input type="text" id="title" name="title"><br><br><label for="content">Content:</label><textarea id="content" name="content"></textarea><br><br><button type="submit">Submit</button></form><h2>Posts:</h2><ul>{% for post in posts %}<li><h3>{{ post.title }}</h3><p>{{ post.content }}</p></li>{% endfor %}</ul>
</body>
</html>
4. 功能说明
  • 数据存储:使用Python列表临时存储文章
  • 表单提交:POST请求处理文章提交,添加到列表
  • 模板渲染:通过循环展示所有文章
  • 运行方式:​​python app.py​​​,访问​​http://127.0.0.1:5000/​

七、总结

通过本文的学习,我们掌握了Flask的核心能力:

  • 极简的应用创建与路由定义
  • Jinja2模板的动态渲染与继承机制
  • 表单处理与数据验证
  • 项目结构设计与生产部署

Flask的"微框架"特性使其成为灵活的开发平台,随着需求增长,可通过扩展添加更多功能:

  • ​Flask-SQLAlchemy​​:集成数据库操作
  • ​Flask-Login​​:处理用户认证
  • ​Flask-Migrate​​:管理数据库迁移
  • ​Flask-RESTful​​:构建RESTful API

相关文章:

  • Linux分区与文件系统选择:EXT4与XFS深度解析
  • MCU STM32搭配存储SD NAND(贴片式T卡)于智能皮电手环(Galvanic Skin Response, GSR 手环)的全方位评测
  • SPL做量化----SRMI(动量修正指标)
  • Selenium操作指南(全)
  • 鸿蒙OSUniApp自定义手势识别与操作控制实践#三方框架 #Uniapp
  • vue3中使用swiper轮播图的slideTo方法跳转到指定页面
  • 60天python训练计划----day40
  • Excel 中的SUMIFS用法(基础版),重复项求和
  • EasyExcel复杂Excel导出
  • VSCode无法转到定义python源码(ctrl加单击不跳转)
  • wireshark分析国标rtp ps流
  • 【Office】Excel两列数据比较方法总结
  • 用wireshark抓了个TCP通讯的包
  • Wireshark 在 macOS 上使用及问题解决
  • 智能守护电网安全:探秘输电线路测温装置的科技力量
  • 本地部署Ollama DeepSeek-R1:8B,接入Cherry Studio
  • 力扣刷题Day 65:单词搜索(79)
  • Day40
  • 30V/3A,云岑CP8335B,完美替换EUP3484
  • 【Java】mybatis-plus乐观锁-基本使用
  • 万网网站建设方案书/济宁网站建设
  • 网站默认首页设置/网站流量统计分析工具
  • 江门制作网站公司/杭州网站优化服务
  • 北京网站建设团队/网络广告推广服务
  • 做类似于58同城的网站/广州seo成功案例
  • wordpress页面百度不收录/seo博客大全