Flask核心功能入门教程:从零搭建轻量级Python Web应用

Flask作为Python生态中最受欢迎的轻量级Web框架,以“微框架”定位、灵活易扩展的特性,成为新手入门Web开发的首选。本文将从环境搭建到核心功能实战,手把手教你掌握Flask的核心用法,零基础也能快速上手。

一、前置准备:环境搭建与项目初始化

1. 安装Flask

Flask基于Python运行,首先确保你的电脑已安装Python(3.8及以上版本),然后通过pip安装Flask:

# 基础安装(推荐使用虚拟环境)
pip install flask

# 验证安装成功
python -c "import flask; print(flask.__version__)"

建议使用虚拟环境隔离项目依赖,避免全局环境冲突:

# 创建虚拟环境
python -m venv flask_demo
# 激活虚拟环境(Windows)
flask_demo\Scripts\activate
# 激活虚拟环境(Mac/Linux)
source flask_demo/bin/activate
# 激活后安装Flask
pip install flask

2. 第一个Flask应用

创建一个名为app.py的文件,写入以下代码,这是Flask最基础的应用结构:

# 导入Flask核心类
from flask import Flask

# 初始化Flask应用,__name__表示当前模块名,Flask以此定位资源路径
app = Flask(__name__)

# 定义路由:绑定URL路径与处理函数
@app.route('/')
def index():
    # 视图函数:返回响应内容
    return 'Hello, Flask! 这是我的第一个Flask应用'

# 启动应用(仅在直接运行该文件时生效)
if __name__ == '__main__':
    # debug=True开启调试模式,代码修改后自动重启,开发环境专用
    app.run(debug=True)

运行文件:

python app.py

打开浏览器访问http://127.0.0.1:5000/,即可看到“Hello, Flask! 这是我的第一个Flask应用”,标志着第一个Flask应用运行成功。

二、Flask核心功能详解

1. 路由与视图函数:URL与功能的映射

路由是Flask的核心,用于将URL路径映射到对应的处理函数(视图函数),是Web应用“请求-响应”的基础。

(1)基础路由定义

通过@app.route()装饰器定义路由,核心参数说明:

  • rule:URL路径,如/user
  • methods:允许的HTTP请求方法,默认['GET'],可指定['GET', 'POST']等。

示例:

from flask import Flask
app = Flask(__name__)

# 基础GET请求路由
@app.route('/about')
def about():
    return '关于我们 - Flask入门教程'

# 支持GET和POST的路由
@app.route('/login', methods=['GET', 'POST'])
def login():
    return '登录页面(支持GET/POST请求)'

if __name__ == '__main__':
    app.run(debug=True)

(2)动态路由:传递URL参数

Flask支持在路由中定义动态参数,适配不同的请求场景:

# 动态路由:接收字符串参数
@app.route('/user/<username>')
def show_user(username):
    # 接收URL中的username参数,返回个性化内容
    return f'欢迎你,{username}!'

# 动态路由:接收数字参数(指定类型)
@app.route('/post/<int:post_id>')
def show_post(post_id):
    # 仅匹配整数类型的post_id,非整数会返回404
    return f'文章ID:{post_id},类型:{type(post_id)}'

# 运行测试:
# http://127.0.0.1:5000/user/张三 → 欢迎你,张三!
# http://127.0.0.1:5000/post/123 → 文章ID:123,类型:<class 'int'>
# http://127.0.0.1:5000/post/abc → 404错误

支持的动态参数类型:int(整数)、float(浮点数)、path(包含斜杠的字符串)。

2. 请求与响应:处理客户端数据

Web应用的核心是处理客户端请求(如表单、参数),并返回响应。Flask提供request对象封装请求数据,make_response定制响应。

(1)获取请求数据

首先导入request对象,常用属性:

  • request.args:获取URL查询参数(GET请求);
  • request.form:获取表单数据(POST请求);
  • request.method:获取当前请求方法。

示例:

from flask import Flask, request
app = Flask(__name__)

# 处理GET请求参数
@app.route('/search')
def search():
    # 获取URL中的keyword参数,如/search?keyword=flask
    keyword = request.args.get('keyword', '默认关键词')
    return f'搜索关键词:{keyword}'

# 处理POST表单数据(模拟登录)
@app.route('/do_login', methods=['POST'])
def do_login():
    # 获取表单中的用户名和密码
    username = request.form.get('username')
    password = request.form.get('password')
    # 简单验证(实际开发需加密+数据库校验)
    if username == 'admin' and password == '123456':
        return '登录成功!'
    else:
        return '用户名或密码错误'

if __name__ == '__main__':
    app.run(debug=True)

可通过Postman、curl或HTML表单测试POST请求:

<!-- 简单的登录表单(保存为login.html,放在项目根目录) -->
<form action="/do_login" method="post">
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    <button type="submit">登录</button>
</form>

(2)定制响应

默认视图函数返回字符串,也可返回状态码、响应头,或用make_response定制响应:

from flask import Flask, make_response
app = Flask(__name__)

# 基础响应:返回内容+状态码
@app.route('/404')
def not_found():
    return '页面不存在', 404

# 定制响应头
@app.route('/custom_response')
def custom_response():
    resp = make_response('自定义响应内容')
    # 设置响应头
    resp.headers['X-Developer'] = 'Flask入门'
    resp.status_code = 200
    return resp

if __name__ == '__main__':
    app.run(debug=True)

3. 模板渲染:分离前端与后端

Flask集成Jinja2模板引擎,支持将动态数据渲染到HTML页面,实现前后端分离。

(1)模板文件存放规则

Flask默认读取项目根目录下的templates文件夹中的模板文件,先创建目录结构:

flask_demo/
├── app.py
└── templates/
    └── index.html

(2)渲染模板示例

from flask import Flask, render_template
app = Flask(__name__)

# 渲染模板并传递动态数据
@app.route('/user/<name>')
def user_page(name):
    # 向模板传递变量name和列表数据
    hobbies = ['编程', '阅读', '跑步']
    return render_template('index.html', username=name, hobbies=hobbies)

if __name__ == '__main__':
    app.run(debug=True)

创建templates/index.html

<!DOCTYPE html>
<html>
<head>
    <title>Flask模板示例</title>
</head>
<body>
    <h1>欢迎你,{{ username }}!</h1>
    <p>你的爱好:</p>
    <ul>
        <!-- Jinja2循环语法 -->
        {% for hobby in hobbies %}
        <li>{{ hobby }}</li>
        {% endfor %}
    </ul>
    <!-- Jinja2条件语法 -->
    {% if username == 'admin' %}
    <p>你是管理员用户</p>
    {% else %}
    <p>你是普通用户</p>
    {% endif %}
</body>
</html>

访问http://127.0.0.1:5000/user/张三,即可看到渲染后的动态页面。

4. 静态文件:加载CSS/JS/图片

Flask默认读取static文件夹中的静态文件(CSS、JS、图片等),目录结构:

flask_demo/
├── app.py
├── templates/
│   └── index.html
└── static/
    ├── css/
    │   └── style.css
    └── img/
        └── logo.png

在模板中引用静态文件:

<!-- index.html中添加 -->
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
<img src="{{ url_for('static', filename='img/logo.png') }}" alt="logo">

5. 会话管理:Cookie与Session

(1)Cookie:客户端存储数据

from flask import Flask, make_response
app = Flask(__name__)

@app.route('/set_cookie')
def set_cookie():
    resp = make_response('已设置Cookie')
    # 设置Cookie,有效期30天
    resp.set_cookie('user', 'flask_user', max_age=30*24*3600)
    return resp

@app.route('/get_cookie')
def get_cookie():
    # 获取Cookie
    user = request.cookies.get('user', '未登录')
    return f'当前Cookie中的用户:{user}'

(2)Session:服务端存储数据

Session基于加密的Cookie实现,需先设置秘钥:

from flask import Flask, session
app = Flask(__name__)
# 必须设置秘钥(生产环境需使用随机复杂字符串)
app.secret_key = 'your_secret_key_123456'

@app.route('/set_session')
def set_session():
    # 存储Session数据
    session['username'] = 'admin'
    return 'Session已设置'

@app.route('/get_session')
def get_session():
    # 获取Session数据
    username = session.get('username', '未登录')
    return f'当前登录用户:{username}'

@app.route('/clear_session')
def clear_session():
    # 清除Session
    session.pop('username', None)
    return 'Session已清除'

三、Flask项目实战:简易待办事项应用

整合以上核心功能,搭建一个简易的待办事项(Todo)应用:

from flask import Flask, request, render_template, redirect, url_for, session

app = Flask(__name__)
app.secret_key = 'todo_demo_123'

# 初始化待办事项列表(模拟数据库)
if 'todos' not in session:
    session['todos'] = []

# 首页:展示待办事项
@app.route('/')
def index():
    todos = session.get('todos', [])
    return render_template('todo.html', todos=todos)

# 添加待办事项
@app.route('/add', methods=['POST'])
def add_todo():
    todo = request.form.get('todo')
    if todo:
        todos = session['todos']
        todos.append(todo)
        session['todos'] = todos  # 更新session
    return redirect(url_for('index'))  # 重定向到首页

# 删除待办事项
@app.route('/delete/<int:index>')
def delete_todo(index):
    todos = session['todos']
    if 0 <= index < len(todos):
        todos.pop(index)
        session['todos'] = todos
    return redirect(url_for('index'))

if __name__ == '__main__':
    app.run(debug=True)

创建templates/todo.html

<!DOCTYPE html>
<html>
<head>
    <title>Flask待办事项</title>
    <style>
        .todo-item {margin: 10px 0; padding: 5px; border-bottom: 1px solid #eee;}
        a {color: red; text-decoration: none; margin-left: 10px;}
    </style>
</head>
<body>
    <h1>Flask待办事项</h1>
    <form action="/add" method="post">
        <input type="text" name="todo" placeholder="输入待办事项" required>
        <button type="submit">添加</button>
    </form>
    <div>
        {% for todo in todos %}
        <div class="todo-item">
            {{ loop.index }}. {{ todo }}
            <a href="/delete/{{ loop.index0 }}">删除</a>
        </div>
        {% else %}
        <p>暂无待办事项</p>
        {% endfor %}
    </div>
</body>
</html>

运行后访问http://127.0.0.1:5000/,即可实现待办事项的添加、删除功能。

四、生产环境部署注意事项

  1. 关闭debug=True:调试模式存在安全风险,生产环境必须关闭;
  2. 使用WSGI服务器:如Gunicorn、uWSGI,替代Flask内置的开发服务器;
  3. 配置秘钥:生产环境使用随机、复杂的秘钥,可通过环境变量配置;
  4. 静态文件托管:生产环境建议用Nginx托管静态文件,提升性能。

示例:使用Gunicorn启动应用

# 安装Gunicorn
pip install gunicorn
# 启动应用(绑定0.0.0.0,端口8000)
gunicorn -w 4 -b 0.0.0.0:8000 app:app
posted @ 2025-12-10 20:54  python农工  阅读(128)  评论(0)    收藏  举报