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

发布于:2025-04-01 ⋅ 阅读:(21) ⋅ 点赞:(0)

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

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

1. 安装 Python

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

python --version

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

2. 安装 Flask

使用 pip 包管理器安装:

pip install flask

二、第一个 Flask 应用:Hello World

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

from flask import Flask

app = Flask(__name__)

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

if __name__ == '__main__':
    app.run(debug=True)
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. 返回响应
    服务器将响应发送回客户端

示例:处理不同请求方法

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. 动态路由参数

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

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

2. 使用 Jinja2 模板

创建templates目录,添加index.html

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

修改视图函数:

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 扩展

安装

pip install flask-wtf

创建表单类(forms.py):

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('登录')

视图函数处理表单:

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):

<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. 安装依赖

pip install flask-sqlalchemy

2. 配置数据库

from flask_sqlalchemy import SQLAlchemy

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

db = SQLAlchemy(app)

3. 定义模型

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. 数据库操作

# 创建所有表
db.create_all()

# 添加用户
new_user = User(username='john', email='john@example.com')
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(示例配置文件):

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

九、学习资源推荐


网站公告

今日签到

点亮在社区的每一天
去签到