Django 从入门到精通:知行博客实战(6.1) · 第 2 / 36 节

补齐 Python 与 HTTP 基础

吴秀峰 5 次阅读 0 条评论 ↓

学习目标

读懂函数参数、字典、列表、模块导入和异常;能区分 GET 和 POST,理解一次请求不会自动记住上一次请求的变量。尚未安装 Python 时可先读概念,第 3 章安装后回来运行。

为什么先补这些知识

Django 视图本质上是接收请求、返回响应的 Python 可调用对象。表单提交的数据通常表现为键和值,数据库查询结果是一组对象。如果这些基础不清楚,容易把模板变量当成 Python 代码,或者在每次请求间用全局变量保存登录状态。

函数把“可重复执行的工作”封装起来;返回值由调用方使用。字典用键取值,例如 article['title'];对象用属性取值,例如以后会见到的 post.title。两者都能描述文章,但不是同一个类型。Python 以缩进表达代码块,建议每层四个空格,不混用 Tab。

具体怎么做

  1. 创建 examples/python_basics.py,复制下面完整代码。
  2. summarize() 把输入标题清理后变成字典。默认参数让调用方不提供浏览量时使用 0。
  3. 循环依次访问列表中的文章。ValueError 表达不合法的输入,try/except 接住预期错误;不要用空的 except 隐藏所有程序问题。
  4. 执行 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