Python进阶教程:Web开发入门(Flask)

目录

Python进阶教程:Web开发入门(Flask)

本文是 Python 入门教程系列 的第 9 篇。前面介绍了数据分析,本篇介绍用 Flask 框架快速搭建 Web 应用。

一、Flask 简介

Flask 是 Python 最流行的轻量级 Web 框架:

  • 简单:一个文件即可启动 Web 服务
  • 灵活:可以自由选择组件
  • 生态好:文档丰富,社区庞大

安装:pip install flask

二、第一个 Flask 应用

python 复制代码
from flask import Flask

app = Flask(__name__)

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

if __name__ == "__main__":
    app.run(debug=True)  # 启动,访问 http://127.0.0.1:5000

三、路由与参数

python 复制代码
from flask import Flask

app = Flask(__name__)

# 普通路由
@app.route("/about")
def about():
    return "关于页面"

# 动态参数
@app.route("/user/<name>")
def user(name):
    return f"<h1>欢迎,{name}!</h1>"

# 指定请求方法
@app.route("/login", methods=["GET", "POST"])
def login():
    return "登录页面"

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

四、模板渲染

模板让你在 HTML 中嵌入 Python 变量和逻辑(Jinja2 模板引擎):

python 复制代码
from flask import Flask, render_template

app = Flask(__name__)

@app.route("/")
def home():
    return render_template("index.html", title="首页", items=["Python", "Flask", "Web"])

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

配套模板文件 templates/index.html

html 复制代码
<!DOCTYPE html>
<html>
<head><title>{{ title }}</title></head>
<body>
    <h1>{{ title }}</h1>
    <ul>
        {% for item in items %}
        <li>{{ item }}</li>
        {% endfor %}
    </ul>
</body>
</html>

五、处理表单数据

python 复制代码
from flask import Flask, request

app = Flask(__name__)

@app.route("/submit", methods=["POST"])
def submit():
    name = request.form.get("name")
    email = request.form.get("email")
    return f"收到:{name}({email})"

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

六、JSON API

现代 Web 应用前后端分离,后端只需返回 JSON:

python 复制代码
from flask import Flask, jsonify, request

app = Flask(__name__)

users = [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}]

@app.route("/api/users", methods=["GET"])
def get_users():
    return jsonify(users)

@app.route("/api/users", methods=["POST"])
def add_user():
    data = request.get_json()
    new_id = max(u["id"] for u in users) + 1
    users.append({"id": new_id, "name": data.get("name")})
    return jsonify(users[-1]), 201

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

七、实战:待办清单 Web 应用

综合运用所学知识,做一个简单的待办清单应用:

python 复制代码
from flask import Flask, render_template, request, redirect, url_for

app = Flask(__name__)
todos = []  # 内存存储,重启会清空

@app.route("/")
def index():
    return render_template("todos.html", todos=todos)

@app.route("/add", methods=["POST"])
def add():
    text = request.form.get("text", "").strip()
    if text:
        todos.append({"id": len(todos) + 1, "text": text, "done": False})
    return redirect(url_for("index"))

@app.route("/done/<int:todo_id>")
def done(todo_id):
    for t in todos:
        if t["id"] == todo_id:
            t["done"] = True
    return redirect(url_for("index"))

if __name__ == "__main__":
    app.run(debug=True)
html 复制代码
<!-- templates/todos.html -->
<!DOCTYPE html>
<html>
<body>
    <h1>待办清单</h1>
    <form method="post" action="/add">
        <input type="text" name="text" placeholder="输入待办事项">
        <button type="submit">添加</button>
    </form>
    <ul>
        {% for t in todos %}
        <li>{{ "✅" if t.done else "⬜" }} {{ t.text }}
            {% if not t.done %}<a href="/done/{{ t.id }}">完成</a>{% endif %}
        </li>
        {% endfor %}
    </ul>
</body>
</html>

总结

本篇介绍了 Flask 的路由、模板、表单处理和 JSON API,并用待办清单应用串联实战。下一篇将介绍调试与性能优化,为系列收官,敬请期待!

相关推荐
金融小师妹29 分钟前
AI趋势识别:黄仁勋宣布“AGI时代”到来,Astra能力跃迁背后的AI安全边界
大数据·python·深度学习·重构·逻辑回归
2501_941875283 小时前
从配置中心到动态管理的互联网工程语法演进与多语言实践分享
开发语言·python
hfywmsj3 小时前
广州餐饮铺位招租决策模型:多因子选址系统设计
开发语言·人工智能·python·广州餐饮铺位招租
努力的lpp5 小时前
php反序列化一(大白话版)
开发语言·web安全·php·ctf·反序列化
菜鸟~noob2335 小时前
【电子战】第03篇:CFAR(恒虚警)处理【含matlab代码】
开发语言·matlab
泡海椒6 小时前
内置SPI函数库详解:JQuick-Java Builtin工具类实战用法
java·开发语言·python
hqyjzsb7 小时前
零 AI 项目经验,学 Python 转型 AI 的正确顺序是什么?
开发语言·人工智能·python·算法·职场和发展·数据挖掘·数据分析
sanjiaomao3337 小时前
从论文公式到Python实现:用单元测试校验滑动平均算法
python·算法·单元测试
Keven_117 小时前
算法札记:ACM适用的很骚的C++语法(持续更新)
开发语言·c++
脉动数据行情18 小时前
C# 实现德指 DAX 期货 WebSocket 实时行情监听
开发语言·websocket·c#