一、概述
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核心要点
- 只是接口标准,不是服务器,也不是框架
- 所有Flask、Django底层都实现了WSGI
- 生产环境: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,填充数据 |
八、注意事项
- Flask debug模式不要放到生产环境,有安全漏洞
- 模板中展示用户输入内容,Jinja2默认自动转义,防止XSS攻击
- WSGI内置服务器仅用于本地开发测试,不可对外公网暴露