Posts

做了一个django app, 由于数据库使用mongodb, 所以没法使用django-admin. 就自己写了个admin. 起初用的是最简单的一个视图一个函数,forms/generic-view都没用。但是问题很明显,容易出现bug,代码重复度很高。 后来改用django-generic view配合forms, 总的来是开发效率和代码质量确实会有不错的提升,但是相对的,代码逻辑被分散在各处, 即便是自己写的代码,过一段时间回头看都有点看不太懂。 所以这里坐下笔记,整理下django generic-view的功能和流程, 以及自己开发过程中的一些感想,以备后用. 与django-rest-framework的对比 django-rest-framework里也有类似generic-view的概念。 两者的目的比较相似,都是为了减少重复代码,加快开发速度. 比较大的区别是: 适用目标不同. django-rest-framework的目标是api接口,所以使用了get/post/delete/put/等method, 设计上就想是对一个model的CURD操作的映射。 django-generic-view的目标是web界面,所以只使用了get/post方法,设计上也不是一眼就能看出每个类的目的。 django-generic-view主要组成 最基础的View/TemplateView/RedirectView/StaticView等 listView ~~~~~~~~ 提供对象列表视图 detailView ~~~~~~~~~~ 单个对象的详情视图 formView/createView/updateView/deleteView ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 用于编辑信息的视图 yearView/monthView等暂时没理解 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ django-generic_view内部流程 --------------------------- listView ~~~~~~~~ 实现了默认的get方法, 先调用get_queryset获取queryset, 之后通过paginate_querset对queryset进行分页. 之后通过调用get_context_data获取一些必要的context, 并把view/request放入其中, 之后调用render_to_response返回页面. 1) get_queryset默认返回但强的queryset属性,或者model.objects.all. 2) 可以重写get_queryset来返回特定的查询,结果会被设置到self.object_list. 3) 可以通过分页相关的属性或方法设置分页相关的流程。 4) 通过get_context_data可以获取额外的属性输出到页面. 5) render_to_response使用templateMixin来输出结果. detailView ~~~~~~~~~~ 实现默认的get方法. 先调用get_object方法获取对象, 之后通过get_context_data获取必要的context, 之后返回render_to_response方法 1) get_object默认会调用get_queryset来获取对象. 2) 可以通过定义slug_field等,设置get_object查询条件. 3) 通过定义get_context_data设置额外的页面属性. formView ~~~~~~~~ 实现默认的get方法, 通过get_form_class返回默认的form类,. 通过get_form来获取form实例,其中会调用get_initial(), get_prefix()获取form initial. 然后通过get_context_data获取必要的页面属性 之后通过render_to_response返回页面 1) 可以通过get_form_class这里返回特殊choices的form等.
Jun 8, 2015
1 min read
TODO reupdate 前面的废话 最初入手这本书是在2012年末,当时受同事的蛊惑买书上瘾。拿着实习生微薄的收入,玩命的买书。 但凡经典的、有名的,恨不得统统纳入收藏。人月神话这书也是在那是入手的,因为名气太大,到处都是好评和推荐。 我书买的多,却不都有时间读。但是基本刚拿到手时会仔细阅读下前言、推荐序和导论部分。 随后就会随便翻翻内容,觉得感兴趣就会慢慢看看,不然就会先放一边想起时再翻翻。 初翻这本书只能说相当失望。毕竟当时还只是初出茅芦的小子,只对一些“酷炫牛逼”的技术和工具颇有热情。 而这本书主要是如何管理项目/如何团队协作,自然看的昏昏欲睡。随丢之一旁。 时过3载,在重翻这本人月神话,颇有感触. 是的,没有银弹 对程序猿而言, 这大概是最悲伤的事情. 同时也是这份工作莫大的乐趣。 条条大陆通罗马,可是却没有一条绝对最优的路线。于是你不得不在众多的方案中做选择。 错误的项目估时策略 技术负债 1+1必然小于2的人月规律 那些总希望员工可以 1+1>2 的老板大概要失望的关闭公司,找一份不错的卖汉堡的工作了。 沟通,沟通,还是沟通 巴比伦塔与焦油坑
May 26, 2015
1 min read
struct模块的作用为,完成字节串到python对象的转换. 基本的api接口 python对象 -> 字节串 pack(fmt, v1, v2, v3…) pack_info(fmt, buffer, offset, v1, v2…) 将多个python对象按固定的格式转化为字节串 字节串 -> python对象 unpack(fmt, str) unpack_from(fmt, buffer, offset=0) 其他 calcsize(fmt) 计算一个fmt需要多少字节 Struct(fmt), 包含pack/unpack等方法。 转换说明 转换中要重要的有以下四项: byte order 字节顺序有大端和小端两种。 不同机器可能使用不同的字节序, 网络字节序统一采用大端. native 本地字节序(与机器和本地环境相关) little-endian 小端 big-endian 大端 network 网络字节序(使用大端) size 同一个c type在不同机器上可能有不同的大小。 native 于机器和本地环境相关的大小
Sep 11, 2014
1 min read