Skip to content

Flask 的详细使用指南,涵盖基础搭建、路由、模板、数据库及扩展功能:


1. 安装与最小应用

bash
pip install flask

创建 app.py

python
from flask import Flask

app = Flask(__name__)


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


if __name__ == '__main__':
    app.run(debug=True)  # 开发模式

运行:

bash
python app.py

2. 项目结构(推荐)

myflask/
├── app/
│   ├── templates/      # Jinja2 模板
│   ├── static/         # CSS/JS 文件
│   ├── routes.py       # 路由定义
│   └── models.py       # 数据模型
├── config.py           # 配置文件
└── run.py              # 启动脚本

3. 路由与请求处理

动态路由

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


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

处理请求方法

python
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form['username']
        return f"Welcome {username}!"
    return render_template('login.html')

4. 模板渲染(Jinja2)

基础模板(templates/base.html)

html
<!DOCTYPE html>
<html>
<head>
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
{% block content %}{% endblock %}
</body>
</html>

子模板(templates/index.html)

html
{% extends "base.html" %}

{% block title %}Home{% endblock %}

{% block content %}
<h1>Welcome, {{ user }}!</h1>
<ul>
    {% for item in items %}
    <li>{{ item }}</li>
    {% endfor %}
</ul>
{% endblock %}

5. 静态文件处理

html
<!-- 加载 CSS -->
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">

6. 数据库集成(Flask-SQLAlchemy)

安装与配置

bash
pip install flask-sqlalchemy

config.py:

python
class Config:
    SQLALCHEMY_DATABASE_URI = 'sqlite:///site.db'
    SQLALCHEMY_TRACK_MODIFICATIONS = False

初始化:

python
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)

定义模型

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

    def __repr__(self):
        return f"User('{self.username}', '{self.email}')"

创建数据库:

python
with app.app_context():
    db.create_all()

7. 表单处理(Flask-WTF)

安装:

bash
pip install flask-wtf

表单类:

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


class RegistrationForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired()])
    email = StringField('Email', validators=[DataRequired(), Email()])
    submit = SubmitField('Sign Up')

模板渲染:

html

<form method="POST">
    {{ form.hidden_tag() }}
    {{ form.username.label }} {{ form.username() }}
    {{ form.email.label }} {{ form.email() }}
    {{ form.submit() }}
</form>

8. 用户认证(Flask-Login)

安装:

bash
pip install flask-login

配置:

python
from flask_login import LoginManager, UserMixin, login_user

login_manager = LoginManager(app)
login_manager.login_view = 'login'


class User(UserMixin, db.Model):
    # 继承之前的 User 模型并添加方法
    def get_id(self):
        return str(self.id)

9. 部署(Gunicorn + Nginx)

安装 Gunicorn:

bash
pip install gunicorn

启动服务:

bash
gunicorn -w 4 -b 0.0.0.0:8000 run:app

Nginx 配置参考 Django 部署部分(结构类似)。


10. 扩展推荐

扩展用途
Flask-RESTful快速构建 REST API
Flask-Migrate数据库迁移工具
Flask-CORS跨域资源共享支持

11. 常见问题

  1. 调试模式安全隐患

    • 生产环境务必设置 debug=False
  2. 静态文件 404

    • 确保 static 目录位于正确路径,检查 url_for('static') 生成路径。
  3. 上下文错误

    • 在非请求上下文中操作数据库时,需手动推送应用上下文:
      python
      with app.app_context():
          db.create_all()

Flask 以轻量灵活著称,适合快速开发小型项目或作为微服务框架。通过扩展可实现复杂功能,保持代码简洁可控。对于大型项目,建议结合工厂模式( create_app)和蓝本(Blueprint)组织代码。

✨ 网站运行时间: 3年11月15天 ❤️ 道阻且长,行则将至 - 微信号: heikedreamer