【流水账】记录一次贡献代码给 DjangoProject
这是今年coding生涯里最开心的一件事:给最爱用的框架贡献了几行代码,虽然微不足道,但是非常有幸福感,也是特意记下来,把喜悦分享给有缘人~
缘起
一直以来想要突破花瓣和Pinterest对收图的限制,所以最近几天一直在折腾自己部署一个私有的花瓣网类似物,发现了一个叫Pinry的项目,但是作者也比较久没有更新了,feature上不是很完善,所以这几天一直在给这个项目发Pull Request.
在做PR的过程中,发现在采集图片的的过程中,保存WebP格式的文件会出错,而且错误来自django框架而不是 Pinry 项目本身,Django
的 ImageField
在保存图片的过程中,会尝试自动探测图片的尺寸。
为了提升效率,Django会尝试将图片文件的前面部分数据喂到 Pillow 里然后尝试解析出文件的元数据。
因为大部分图片源文件只要读取头部的部分数据就能获取到信息,所以这个方法通常都能工作得非常好,但是对于少部分图片,header 的 size 非常大,或者是分chunk的图片,或者流式的数据,需要读取很多数据才能获得完整的meta信息。
Django 的 ImageField 其实处理了这类问题,但是在捕获错误的时候,有一个 edge-case 没考虑到,就是读取WebP文件的时候,Pillow 会产生一个 RuntimeError ,这个未捕获的错误会导致Django产生内部错误,具体请参考:#29705 RuntimeError while saving webp file to ImageField
流程
提交Ticket前的准备
第一次给Django提交Ticket,首先跑去阅读了,啥都不懂,不过根据之前的经验,大概要考虑以下几个问题:
- 怎么创建Ticket(Issue),怎么描述问题
- 创建一个脚本或者可用的案例,来稳定的复现Bug
- 创建一个Patch,并提交到相应的项目(Django使用Github跟踪和Review)
怎么创建Ticket
赶紧去阅读了一下Django提供的文档: 参见 Contribute to Django,有几个要点:
Reporting bugs and <strike>requesting features</strike>(因为是提交Bug,所以忽略后半)
- 要点主要是描述Bug发现的
软件硬件环境
,复现方法
,样例脚本
(可选),Bug 出现的 branch 可以在 Trac 系统内选择,要注意的是安全问题需要单独到另一个地方提交。 - Django Trac 提供的选项非常多,基本上涵盖了整个bug修复流程中的所有中间过程和对bug提出者,修复者的要求。
- 如果要自己修复,把bug assigin给自己即可
- 要点主要是描述Bug发现的
我创建了一个项目用来复现这个bug,并集成了travis-ci用来线上执行这个复现测试
- https://github.com/winkidney/django-webp-image-issue-case
- https://travis-ci.org/winkidney/django-webp-image-issue-case
实际上这个东西可以没有,可以只是简单描述复现条件和复现用的脚本,直接写到Issue里就好。
创建Patch
因为之前没给Django贡献过代码,所以赶紧去看了一下 Django Github Pull Request, 从这里就能看到他们的Pull Request标题是什么格式的,这个格式关联到他们的 CI , 所以非常重要,可以用来自动关闭 Ticket 。
- 关于DjangoProject的 编码风格,可以参考先前提到的 Contribution Guide
- 代码写好后,要本地跑一遍单元测试,这种Bug需要增加一个回归测试,用于测试以后的更改是否会导致这个Bug再次出现。
我最后的 Pull Request
Review 和 Merge
Django社区的效率非常高,真的非常惊喜,当天就完成了Review和Merge到Master的流程。
中间也得到了很多帮助和修改意见,详情可以参看 Pull Request。
结语
感慨Django社区的效率,第一次给一个非常活跃的项目贡献代码,也是达成了新成就,虽然只是个小Bug,不过非常开心~
希望这个流水账能帮到想要给项目贡献代码的朋友~
PS: 最近也在积极给 Pinry 贡献代码,希望能有更多的给 创作者 们使用的项目,能给 设计师/画师/写作者 们带来更多方便和自由和更高的生产力,也是我今后最想做的事情:)
其他创作者相关的工具:
- PickTrue 图册下载器,最近新弄的项目,用来给 画师/设计师 们构建 Visual Library 目前支持Artstation, Pixiv,花瓣网。
- Pinry - 个人版的花瓣(Pinterest) 可以不受限制(比如NFSW,版权)的限制收图,当然记得尊重版权,收图可以,不要到处传播哦。
- TabArtstation - Chrome插件 , 在Chrome新标签中查看Artstation每日更新,收图必备,适合没时间去专门刷Artstation的同学
- huaban-exporter - 花瓣导出器, 很早之前做的花瓣备份工具,会连同花瓣的元数据(比如描述,图片源链接)一起下载到本地,如果没有元数据需求,可以直接使用PickTrue