补齐 Python 与 HTTP 基础
学习目标
读懂函数参数、字典、列表、模块导入和异常;能区分 GET 和 POST,理解一次请求不会自动记住上一次请求的变量。尚未安装 Python 时可先读概念,第 3 章安装后回来运行。
为什么先补这些知识
Django 视图本质上是接收请求、返回响应的 Python 可调用对象。表单提交的数据通常表现为键和值,数据库查询结果是一组对象。如果这些基础不清楚,容易把模板变量当成 Python 代码,或者在每次请求间用全局变量保存登录状态。
函数把“可重复执行的工作”封装起来;返回值由调用方使用。字典用键取值,例如 article['title'];对象用属性取值,例如以后会见到的 post.title。两者都能描述文章,但不是同一个类型。Python 以缩进表达代码块,建议每层四个空格,不混用 Tab。
具体怎么做
- 创建
examples/python_basics.py,复制下面完整代码。 summarize()把输入标题清理后变成字典。默认参数让调用方不提供浏览量时使用 0。- 循环依次访问列表中的文章。
ValueError表达不合法的输入,try/except接住预期错误;不要用空的except隐藏所有程序问题。 - 执行
python examples/python_basics.py。将结果和下方预期对照,再自己修改一个值。
本章新增或替换的完整文件
以下路径均相对于练习项目根目录。替换同名文件的全部内容;未列出的文件保持上一章版本。
examples/python_basics.py
def summarize(title, views=0):
if not title.strip():
raise ValueError("标题不能为空")
return {"title": title.strip(), "views": views}
articles = [summarize(" 第一篇文章 ", 3), summarize("学习 Django", 8)]
for article in articles:
print(f"{article['title']}:{article['views']} 次阅读")
try:
summarize(" ")
except ValueError as error:
print(error)
理解浏览器与服务器
浏览器请求 http://127.0.0.1:8000/posts/1/?page=2 时,127.0.0.1 是主机,8000 是端口,/posts/1/ 是路径,page=2 是查询参数。URL 路由主要匹配路径,查询参数由视图读取。文章的 id 来自路径,页码来自查询参数,这两个来源可以同时存在。
GET 用于读取;写文章、退出账号、删除记录等改变状态的操作使用 POST,并在会话认证时校验 CSRF。POST 并不意味着内容自动加密,传输保密由 HTTPS 提供。常见响应:200 表示成功读取,302 表示临时重定向,400 是请求不合法,403 是拒绝访问,404 是没有可见对象,500 是服务内部错误。
HTTP 本身不会替你记住用户。Django 使用 Cookie 中的会话标识找到服务器端会话,再确定 request.user。不要把密码放进 Cookie,也不要把用户状态存在模块级变量里:多个进程之间不共享这类变量,同一进程却可能服务多个用户。
如何确认成功
执行后前三行应是“第一篇文章:3 次阅读”“学习 Django:8 次阅读”“标题不能为空”。程序正常退出,最后一次错误被有意捕获。
练习一:让第二篇文章的浏览量变成 9,不要修改 summarize() 的默认值。练习二:解释访问列表和提交新文章为什么需要不同的请求方法。练习三:在浏览器开发者工具 Network 中刷新当前教程页,查看状态码、Content-Type 和请求地址,不要复制或分享 Cookie 内容。
常见问题
IndentationError 怎么办? 检查报错行及上一行冒号,统一四空格缩进。KeyError 怎么办? 字典没有你请求的键;先确认输入结构,再决定需要直接索引还是 .get() 默认值。返回 200 就一定正确吗? 不一定,还要核对返回内容和用户身份,例如错误页也可能被误写成 200。
官方参考
登录后可保存阅读位置、标记章节完成,并在其他设备继续学习。
登录并保存学习进度 →联系站长
微信:VIPdjango。技术问题建议先在 社区讨论 中交流,方便更多人参与和查阅。
章节讨论 0