从零开始学 Flask:构建你的第一个 Web 应用

当我第一次接触 Flask 时,仅仅用了 5 行代码就写出了一个能运行的 Web 应用。这种简洁到近乎诗意的体验,让我瞬间理解了为什么它会成为开发者的心头好。不同于某些框架的大包大揽,Flask 就像一位留白高手,让开发者在自由的画布上挥洒创意。

一、准备工作:搭建开发环境

1. 安装 Python

首先确保你的电脑已安装 Python 3.6+。在终端输入:

bash 复制代码
python --version

若未安装,可从Python 官网下载。

2. 安装 Flask

使用 pip 包管理器安装:

bash 复制代码
pip install flask

二、第一个 Flask 应用:Hello World

创建一个名为app.py的文件,输入以下代码:

python 复制代码
from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
    return "Hello, Flask!"

if __name__ == '__main__':
    app.run(debug=True)
bash 复制代码
python app.py

在浏览器访问http://localhost:5000,你会看到 "Hello, Flask!" 的输出。

关键概念解释:

  • Flask 对象app = Flask(__name__)创建应用实例
  • 路由装饰器@app.route('/')定义 URL 路径
  • 视图函数home()返回响应内容
  • 调试模式debug=True开启热重载

三、深入理解请求 - 响应循环

当用户访问你的网站时,会发生以下步骤:

  1. 客户端发送请求

    浏览器向服务器发送 HTTP 请求(如 GET、POST)

  2. 路由匹配

    Flask 根据 URL 路径找到对应的视图函数

  3. 处理请求

    视图函数生成响应内容(HTML、JSON 等)

  4. 返回响应

    服务器将响应发送回客户端

示例:处理不同请求方法

python 复制代码
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"登录成功,用户:{username}"
    return """
        <form method="POST">
            用户名: <input type="text" name="username"><br>
            密码: <input type="password" name="password"><br>
            <input type="submit" value="提交">
        </form>
    """

四、动态路由与模板渲染

1. 动态路由参数

python 复制代码
@app.route('/user/<username>')
def profile(username):
    return f"用户资料:{username}"

访问http://localhost:5000/user/Alice会显示 "用户资料:Alice"

2. 使用 Jinja2 模板

创建templates目录,添加index.html

html 复制代码
<!DOCTYPE html>
<html>
<head>
    <title>Flask模板示例</title>
</head>
<body>
    <h1>你好,{{ name }}!</h1>
    <p>当前时间:{{ current_time }}</p>
</body>
</html>

修改视图函数:

python 复制代码
from flask import render_template
from datetime import datetime

@app.route('/greet/<name>')
def greet(name):
    return render_template('index.html', 
                        name=name,
                        current_time=datetime.now())

五、与前端交互:表单处理

1. 使用 Flask-WTF 扩展

安装

bash 复制代码
pip install flask-wtf

创建表单类(forms.py):

python 复制代码
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Email

class LoginForm(FlaskForm):
    email = StringField('邮箱', validators=[DataRequired(), Email()])
    password = PasswordField('密码', validators=[DataRequired()])
    submit = SubmitField('登录')

视图函数处理表单:

python 复制代码
from flask import render_template, flash
from forms import LoginForm

@app.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        # 处理表单数据
        flash('登录成功!')
        return redirect(url_for('home'))
    return render_template('login.html', form=form)

模板渲染表单(templates/login.html):

html 复制代码
<form method="POST" novalidate>
    {{ form.hidden_tag() }}
    <div>
        {{ form.email.label }}<br>
        {{ form.email(size=32) }}
    </div>
    <div>
        {{ form.password.label }}<br>
        {{ form.password(size=32) }}
    </div>
    <div>{{ form.submit() }}</div>
</form>

六、数据存储:使用 SQLAlchemy

1. 安装依赖

bash 复制代码
pip install flask-sqlalchemy

2. 配置数据库

python 复制代码
from flask_sqlalchemy import SQLAlchemy

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)

3. 定义模型

python 复制代码
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'<User {self.username}>'

4. 数据库操作

python 复制代码
# 创建所有表
db.create_all()

# 添加用户
new_user = User(username='john', email='[email protected]')
db.session.add(new_user)
db.session.commit()

# 查询用户
user = User.query.filter_by(username='john').first()
print(user.email)

七、部署到生产环境

1. 安装 Gunicorn

复制代码
pip install gunicorn

2.启动服务器

复制代码
gunicorn -w 4 app:app

3.配置 Nginx(示例配置文件):

python 复制代码
server {
    listen 80;
    server_name yourdomain.com;

    location / {
        proxy_pass http://localhost:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

八、常见问题解答

  1. 404 错误:检查路由是否正确定义

  2. 表单验证失败 :确保模板中包含form.hidden_tag()

  3. 数据库连接问题:确认数据库文件权限和路径正确

九、学习资源推荐

相关推荐
coderSong25682 小时前
Java高级 |【实验八】springboot 使用Websocket
java·spring boot·后端·websocket
老胖闲聊2 小时前
Python Copilot【代码辅助工具】 简介
开发语言·python·copilot
Blossom.1183 小时前
使用Python和Scikit-Learn实现机器学习模型调优
开发语言·人工智能·python·深度学习·目标检测·机器学习·scikit-learn
Mr_Air_Boy3 小时前
SpringBoot使用dynamic配置多数据源时使用@Transactional事务在非primary的数据源上遇到的问题
java·spring boot·后端
曹勖之3 小时前
基于ROS2,撰写python脚本,根据给定的舵-桨动力学模型实现动力学更新
开发语言·python·机器人·ros2
不争先.3 小时前
coze智能体后端接入问题:
pycharm·flask·coze
coding随想4 小时前
JavaScript ES6 解构:优雅提取数据的艺术
前端·javascript·es6
小小小小宇4 小时前
一个小小的柯里化函数
前端
lyaihao4 小时前
使用python实现奔跑的线条效果
python·绘图
灵感__idea4 小时前
JavaScript高级程序设计(第5版):无处不在的集合
前端·javascript·程序员