【Python使用】嘿马头条项目从到完整开发教程第6篇:Git工用流,调试方法【附代码文档】

53 阅读1分钟

🏆🏆🏆教程全知识点简介:1.APScheduler任务调度涵盖安装配置、使用方式、调度器Scheduler、执行器executors、触发器Trigger等核心组件。2. RPC远程过程调用包括RPC概念、背景用途、优缺点分析。3. Protocol Buffers数据序列化涉及文档结构、注释语法、数据类型、枚举类型、消息类型(字段编号、字段规则、嵌套类型、保留字段、默认值)。4. 客户端开发包含头条首页新闻推荐接口编写。5. 即时通讯技术涵盖需求场景、传统推送实现、Socket.IO(Python服务器端开发、事件处理)。6. Elasticsearch搜索引擎包括简介原理、倒排索引、分析器、相关性排序、集群概念、IK中文分析器、索引类型、文档操作(索引文档、获取文档、判断存在、更新删除)、Logstash数据导入、查询(基本查询、高级查询)、全文检索实现、Python客户端使用、联想提示(拼写纠错、自动补全)。7. 单元测试涵盖测试分类、基本写法、测试必要性。8. 服务器部署包括Gunicorn、Supervisor配置管理。9. 项目开发流程涉及产品介绍、原型图UI图、技术架构、开发环境(ToutiaoWeb虚拟机、Pycharm远程开发)。10. 数据库技术包含ORM理解、SQLAlchemy映射构建、数据库连接设置、模型类字段选项。11. 分布式系统涵盖分布式ID方案选择、Twitter Snowflake算法(64位ID划分、最大取值计算、移位偏移计算、序号循环掩码、时间戳处理)。12. Redis数据库包括Redis持久化机制。13. Git工作流涵盖Gitflow工作流(工作方式、历史分支、功能分支、发布分支、维护分支)、调试方法。14. 身份认证技术包含JWT、JWS、JWE概念、Python库使用、项目封装实施方案。15. 对象存储涉及OSS对象存储、七牛云存储服务。16. 缓存系统包括缓存架构、缓存数据保存方式、缓存有效期TTL、缓存淘汰策略、缓存问题(缓存穿透、缓存雪崩)、头条项目缓存设计(User Cache、Article Cache、Announcement Cache)、持久存储设计(阅读历史、搜索历史、统计数据)。


📚📚👉👉👉这篇博客:   gitee.com/yinuo112/Ba… 中查看

✨ 本教程项目亮点

🧠 知识体系完整:覆盖从基础原理、核心方法到高阶应用的全流程内容
💻 全技术链覆盖:完整前后端技术栈,涵盖开发必备技能
🚀 从零到实战:适合 0 基础入门到提升,循序渐进掌握核心能力
📚 丰富文档与代码示例:涵盖多种场景,可运行、可复用
🛠 工作与学习双参考:不仅适合系统化学习,更可作为日常开发中的查阅手册
🧩 模块化知识结构:按知识点分章节,便于快速定位和复习
📈 长期可用的技术积累:不止一次学习,而是能伴随工作与项目长期参考


🎯🎯🎯全教程总章节


🚀🚀🚀本篇主要内容

Git工用流

调试方法

  1. 判断问题发生在前端还是后端
    • 如果前端为网页,可以通过网页调试工具里面的network判断

      • 在前端中触发一次接口调用的请求
      • 查看network中对应的请求记录
      • 如果没有发现有新的请求记录,表示前端有问题,并未发起请求
      • 如果有请求记录,返回的状态码为200,但是页面没有想要的效果,表示前端没有正确处理200的响应
      • 如果返回的状态码为4xx, 表示前端构造的请求有问题,比如404没有正确的请求网址,401、403请求的身份有问题,405请求的方式有问题,400表示构造的请求参数不正确(类型不对或缺少参数)
      • 如果返回500状态码,表示服务器端出现问题
    • 如果前端不是网页,比如app,通过日志的访问请求记录判断

    在服务器中查看日志文件的方法:

tail flask.log # 查看最后一条记录 tail -n 100 flask.log # 查看最新的100条记录 tail -f flask.log # 实时查看





2. ##### 如果是后端出现的问题,通过pycharm或日志来判断


* 查看记录错误的日志,根据日志的信息判断错误  

# Git工用流  



# JWT & JWS & JWE







### Json Web Token(JWT)




JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在两个组织之间传递安全可靠的信息。
> 
官方定义:JSON Web Token (JWT) is a compact URL-safe means of representing claims to be transferred between two parties

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e2280404183449c880418c71aeba97ec~tplv-k3u1fbpfcp-watermark.image#?w=632&h=222&s=29996&e=png&b=414624)

现在网上大多数介绍JWT的文章实际介绍的都是JWS(JSON Web Signature),也往往导致了人们对于JWT的误解,但是JWT并不等于JWS,JWS只是JWT的一种实现,除了JWS外,JWE(JSON Web Encryption)也是JWT的一种实现。

下面就来详细介绍一下JWT与JWE的两种实现方式:

![](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/7434b5d521ba45b49d49167e91a75d4a~tplv-k3u1fbpfcp-watermark.image#?w=418&h=360&s=26895&e=png&b=414624)


[python-multipart 文档](https://github.com/andrew-d/python-multipart)




### JSON Web Signature(JWS)




JSON Web Signature是一个有着简单的统一表达形式的字符串:

![](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5ac6349c4c674d32a4f68328275f36fa~tplv-k3u1fbpfcp-watermark.image#?w=1062&h=306&s=268149&e=png&b=414624)




##### 头部(Header)




头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。 JSON内容要经Base64 编码生成字符串成为Header。




##### 载荷(PayLoad)




payload的五个字段都是由JWT的标准所定义的。

1. iss: 该JWT的签发者
2. sub: 该JWT所面向的用户
3. aud: 接收该JWT的一方
4. **exp(expires): 什么时候过期,这里是一个Unix时间戳**
5. iat(issued at): 在什么时候签发的

后面的信息可以按需补充。 JSON内容要经Base64 编码生成字符串成为PayLoad。




##### 签名(signature)




这个部分header与payload通过header中声明的加密方式,使用密钥secret进行加密,生成签名。 JWS的主要目的是保证了数据在传输过程中不被修改,验证数据的完整性。但由于仅采用Base64对消息内容编码,因此不保证数据的不可泄露性。所以不适合用于传输敏感数据。




### JSON Web Encryption(JWE)




相对于JWS,JWE则同时保证了安全性与数据完整性。 JWE由五部分组成:

![](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9f0a2e9f194f49db976e42b1748185f7~tplv-k3u1fbpfcp-watermark.image#?w=678&h=58&s=32070&e=png&b=414624)

JWE组成

具体生成步骤为:

1. JOSE含义与JWS头部相同。
2. 生成一个随机的Content Encryption Key (CEK)。
3. 使用RSAES-OAEP 加密算法,用公钥加密CEK,生成JWE Encrypted Key。
4. 生成JWE初始化向量。
5. 使用AES GCM加密算法对明文部分进行加密生成密文Ciphertext,算法会随之生成一个128位的认证标记Authentication Tag。 6.对五个部分分别进行base64编码。

可见,JWE的计算过程相对繁琐,不够轻量级,因此适合与数据传输而非token认证,但该协议也足够安全可靠,用简短字符串描述了传输内容,兼顾数据的安全性与完整性。  

# JWT的Python库







### 独立的JWT Python库




* itsdangerous

* JSONWebSignatureSerializer
* TimedJSONWebSignatureSerializer (可设置有效期)

* pyjwt

[https://pyjwt.readthedocs.io/en/latest/](https://pyjwt.readthedocs.io/en/latest/)




### 安装




```shell
$ pip install pyjwt

用例

>>> import jwt

  >>> encoded_jwt = jwt.encode({'some': 'payload'}, 'secret', algorithm='HS256')
  >>> encoded_jwt
  'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzb21lIjoicGF5bG9hZCJ9.4twFt5NiznN84AWoo1d7KO1T_yoc0Z6XOpOVswacPZg'

  >>> jwt.decode(encoded_jwt, 'secret', algorithms=['HS256'])
  {'some': 'payload'}

头条项目封装

import jwt
from flask import current_app


def generate_jwt(payload, expiry, secret=None):
    """
    生成jwt
    :param payload: dict 载荷
    :param expiry