做了一个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
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
TODO
项目地址:: TODO ref
mongodb本身是无模式的,但是使用时都要在application层实现模式约束.
mongoengine是个mongodb ORM库。已相当成熟稳定, 使用广泛, 开发活跃. 性能相对也不错(可以参见项目下的bench).
使用下来发现mongoengine还是很不错的库,但是有部分特性使用起来并不方便.
mongoengine问题 索引问题 索引应该跟document分开.并且有自动化建立和删除的command.
把索引定在Document/meta/indexes里很糟糕:
写法很乱,不易管理。
有时会失效,没有建立对应的索引
listField校验问题 listField没法做长度限制 set/sortset/max-len list/ sort-list等结构没有实现
不支持自定义字段验证/文档级验证 pre_save/after_save hooks 不可存储的EmbdDocumment TODO 待考虑
可扩展的Document TODO 待考虑