从零开始学 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. 数据库连接问题:确认数据库文件权限和路径正确

九、学习资源推荐

相关推荐
林九生24 分钟前
【Python】Browser-Use:让 AI 替你掌控浏览器,开启智能自动化新时代!
人工智能·python·自动化
草捏子33 分钟前
最终一致性避坑指南:小白也能看懂的分布式系统生存法则
后端
猿界零零七1 小时前
执行paddle.to_tensor得到全为0
python·paddle
斯~内克1 小时前
Electron 菜单系统深度解析:从基础到高级实践
前端·javascript·electron
一个public的class1 小时前
什么是 Java 泛型
java·开发语言·后端
数据知道1 小时前
【YAML】一文掌握 YAML 的详细用法(YAML 备忘速查)
前端·yaml
dr李四维1 小时前
vue生命周期、钩子以及跨域问题简介
前端·javascript·vue.js·websocket·跨域问题·vue生命周期·钩子函数
旭久1 小时前
react+antd中做一个外部按钮新增 表格内部本地新增一条数据并且支持编辑删除(无难度上手)
前端·javascript·react.js
windyrain1 小时前
ant design pro 模版简化工具
前端·react.js·ant design
浪遏2 小时前
我的远程实习(六) | 一个demo讲清Auth.js国外平台登录鉴权👈|nextjs
前端·面试·next.js