16、Python Web开发

一、概述

Web开发本质:浏览器(客户端)和服务器通过 HTTP协议 通信;Python这边接收请求、处理逻辑、返回页面/数据。 学习顺序:HTTP → HTML基础 → WSGI(Python Web底层规范)→ Web框架 → 模板渲染。


二、HTTP协议

HTTP 是无状态、基于请求-响应模型的应用层协议,默认端口80,HTTPS为443。

1. 请求(Request)

由请求行、请求头、空行、请求体四部分组成

  • 请求行:方法 路径 HTTP版本,例如 GET /index HTTP/1.1
  • 常用请求方法
    • GET:获取资源,参数放在URL,可缓存、长度有限
    • POST:提交数据,参数放请求体,用于登录、表单提交
    • PUT / DELETE:修改、删除资源(REST风格)
  • 请求头:Host、User-Agent、Cookie、Content-Type 等

2. 响应(Response)

状态行 + 响应头 + 空行 + 响应体

  • 状态码
    • 200 OK:成功
    • 301/302:重定向
    • 400 参数错误,404 Not Found:资源不存在
    • 500 Internal Server Error:服务端代码异常
  • 响应头:Content-Type(告诉浏览器返回内容类型,text/html / application/json)

无状态:服务器默认不记住上一次是谁访问的,靠 Cookie / Session / Token 维持登录状态。

简单理解流程

浏览器发起HTTP请求 → 服务器接收 → 处理业务 → 返回HTTP响应 → 浏览器渲染页面


三、HTML简介

HTML 是标记语言,用来描述网页结构,不是编程语言。浏览器解析HTML渲染页面。

复制代码
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>页面标题</title>
</head>
<body>
    <h1>一级标题</h1>
    <p>段落文字</p>
    <a href="/login">跳转链接</a>
</body>
</html>
  • 作用:作为服务器返回给浏览器的文本内容
  • 局限:纯HTML是静态页面,所有用户看到内容一模一样;想要动态内容(比如显示用户名),需要后端填充数据,也就是模板。
  • 配合CSS美化、JS做前端交互。

四、WSGI接口

WSGI(Web Server Gateway Interface):Python Web的统一接口规范。 作用:隔开Web服务器(gunicorn、uWSGI)和Web应用(Flask/Django)。只要遵循WSGI规范,应用可以在任意兼容WSGI的服务器上跑。

WSGI标准函数签名

复制代码
def application(environ, start_response):
    """
    environ:字典,包含所有HTTP请求信息(请求路径、header、方法等)
    start_response:回调函数,用来设置响应状态码和响应头
    返回值:bytes 类型的可迭代对象,就是响应体
    """
    status = '200 OK'
    headers = [('Content-Type', 'text/html;charset=utf-8')]
    start_response(status, headers)
    body = "<h1>Hello WSGI</h1>".encode("utf-8")
    return [body]
  • 原生Python内置wsgiref可以测试运行,仅用于学习,不能线上使用

    from wsgiref.simple_server import make_server

    server = make_server("127.0.0.1", 8000, application)
    print("服务器运行在 http://127.0.0.1:8000")
    server.serve_forever()

访问 127.0.0.1:8000 就能看到页面。

✅ WSGI核心要点

  1. 只是接口标准,不是服务器,也不是框架
  2. 所有Flask、Django底层都实现了WSGI
  3. 生产环境:Nginx(反向代理)+ Gunicorn(WSGI服务器)

五、使用Web框架

手写WSGI、自己解析路由、处理请求非常繁琐,所以使用Web框架。 Python主流Web框架:

  • Flask:轻量微型框架,灵活、插件化,适合小型项目、接口开发
  • Django:全栈重型框架,自带ORM、后台管理、表单、权限,适合大型业务系统

下面示例以Flask演示(上手最简单)

1. 安装

复制代码
pip install flask

2. 基础路由示例

复制代码
from flask import Flask

# 实例化app
app = Flask(__name__)

# 路由:访问路径和处理函数绑定
@app.route("/")
def index():
    return "<h1>首页</h1>"

@app.route("/about")
def about():
    return "<h1>关于我们</h1>"

if __name__ == "__main__":
    app.run(host="127.0.0.1", port=5000, debug=True)
  • debug=True:代码修改自动重启,开发用,上线必须关闭
  • 访问 /、/about 触发对应函数,return的字符串就是HTTP响应体

动态路由

复制代码
@app.route("/user/<name>")
def user(name):
    return f"你好,{name}"

六、使用模板

直接在Python代码里拼接HTML字符串极其丑陋、不安全。模板引擎 实现「HTML和Python代码分离」:HTML模板文件里写占位符,后端传入数据,框架自动渲染成最终HTML。 Flask 默认模板引擎:Jinja2

目录结构

复制代码
app.py
templates/
    index.html
templates/index.html
复制代码
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>模板页面</title>
</head>
<body>
    <h1>欢迎,{{ username }}</h1>
    <ul>
        {% for item in list_data %}
        <li>{{ item }}</li>
        {% endfor %}
    </ul>
    {% if age > 18 %}
        <p>成年人</p>
    {% else %}
        <p>未成年</p>
    {% endif %}
</body>
</html>

Jinja2语法:

  • {``{ 变量 }}:输出变量
  • {% %}:控制语句 for / if
  • {# 注释 #}:模板注释,不会输出到页面
app.py 渲染模板代码
复制代码
from flask import Flask, render_template

app = Flask(__name__)

@app.route("/")
def index():
    data = {
        "username": "小明",
        "age": 20,
        "list_data": ["苹果", "香蕉", "橙子"]
    }
    # render_template 读取模板,传入参数渲染
    return render_template("index.html", **data)

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

访问页面,模板里占位符就会被真实数据替换,生成动态网页。

模板的价值:前端工程师可以单独写HTML,后端只负责传数据,前后端分离开发(传统服务端渲染SSR)。 补充:现在前后端分离方案:后端只返回JSON接口,前端Vue/React渲染页面。


七、小节对比总结

内容 定位
HTTP 客户端和服务器通信规则
HTML 浏览器展示的静态页面结构
WSGI Python Web底层统一接口
Web框架(Flask/Django) 封装路由、请求、响应,简化开发
Jinja2模板 服务端动态渲染HTML,填充数据

八、注意事项

  1. Flask debug模式不要放到生产环境,有安全漏洞
  2. 模板中展示用户输入内容,Jinja2默认自动转义,防止XSS攻击
  3. WSGI内置服务器仅用于本地开发测试,不可对外公网暴露
相关推荐
喵了几个咪1 小时前
GoWind UBA 拆解:把 Doris UNIQUE KEY 翻译成 ClickHouse——读数正确性对齐实录
开发语言·后端·clickhouse·微服务·golang·gowind
FRing031 小时前
JavaScript入门到精通二十九(内置构造函数(Object、Array))
开发语言·前端·javascript
syagain_zsx1 小时前
ODB 与 MySQL:C++ 里的 ORM 实践(类即表、事务铁律与查询封装)
开发语言·数据库·c++·mysql·工具库·1024程序员节
AAA程序技术1 小时前
从 DOM 到屏幕:浏览器渲染管线六步拆解
前端·浏览器
zach1 小时前
useContext 深入讲解:组件透传、原理与最佳实践
前端
小嘉丶学长1 小时前
Day08 · 字符串(二)
服务器·开发语言·python·学习·1024程序员节
BD_Marathon1 小时前
【Python】列表推导式
python
张一凡931 小时前
AI 改完代码,人却不知道它改了什么:架构漂移才是真正的成本
前端·后端·agent
sycmancia1 小时前
Qml——Text元素
java·前端·html