1. request.META
返回的是一个字典, 包含此次 http 请求的 header 信息
2. python super 的使用
super() 函数是用于调用父类 (超类) 的一个方法, super 是用来解决多重继承问题的, 一般用法: super(class_A, self) - 首先找到 class_A 的父类, 然后把 class_A 的对象转换为其父类的对象.
- class A(object):
- def __init__(self):
- print('welcome class A')
- class B(A):
- def __init__(self):
- print('welcome class B')
- super(B, self).__init__()
- if __name__ == '__main__':
- class_a = A()
- class_b = B()
- # 输出:
- #welcome class A
- #welocme class B
- #welcome class A
- 3. factory.django.DjangoModelFactory
4. ZMQ(0MQ/ZeroMQ)学习笔记
消息模式
REQ/REP 请求 - 应答模式
SUB/PUB 发布 - 订阅模式
在使用 SUB 套接字时, 必须使用 zmq_setsockopt()方法来设置订阅的内容.
如果你不设置订阅内容, 那将什么消息都收不到, 新手很容易犯这个错误.
订阅信息可以是任何字符串, 可以设置多次. 只要消息满足其中一条订阅信
息, SUB 套接字就会收到. 订阅者可以选择不接收某类消息, 也是通过
zmq_setsockopt()方法实现的.
PUB-SUB 套接字组合是异步的. 客户端在个循环体中使用 zmq_recv()接收消
息, 如果向 SUB 套接字发送消息则会报错; 类似地, 服务端可以不断地使用
zmq_send()发送消息, 但不能在 PUB 套接字上使用 zmq_recv().
关于 PUB-SUB 套接字, 还有一点需要注意: 你无法得知 SUB 是何时开始接收
消息的. 就算你先打开了 SUB 套接字, 后打开 PUB 发送消息, 这时 SUB 还是
会丢失一些消息的, 因为建立连接是需要一些时间的. 很少, 但并不是零.
管道模式
合法的套接字连接 - 绑定对
- PUB-SUB
- REQ-REP
- PUSH-PULL
- REP-ROUTER
- DEALER-REP
- DEALER-ROUTER
- DEALER-DEALER
- ROUTER-ROUTER
- PAIR-PAIR
非法的套接字连接对
- REQ-REQ
- REQ-DEALER
- REP-REP
- ROUTER-REP
5. JSON.loads()和 JSON.dumps()
前者是把 str(JSON 数据)转化成 dict 数据, 后者则是实现相反的操作
6. 数据库表常见的一些操作
get: 得到的是一条记录对象, 可以直接获取其属性值; 并且只能是一个对象
filter: 得到的是符合过滤条件记录的列表
7. Flask 架构下数据的序列化集反序列化
序列化
序列化使用 schema 中的 dump()或 dumps()方法, 其中, dump() 方法实现 obj -> dict,dumps()方法实现 obj -> string, 由于 Flask 能直接序列化 dict, 所以通常 Flask 与 Marshmallow 配合序列化时, 用 dump()方法即可.
反序列化
反序列化基于 schema 中的 load()或 loads()方法, 默认情况下, load()方法将一个传入的 dict, 结合 schema 的约定, 再转换为一个 dict, 而 loads()方法的传入参数是 JSON 格式的 string, 同样将传入数据转换为符合规范的 dict. 由于调用 load()或 loads()方法时, 会执行下面提到的数据校验, 所以在开发 RESTful API 时, 对传入数据执行 load()或 loads()方法是必要的.
8. Django 数据库 related_name 用法
实现反向查询.
9. Python3 逻辑运算符那点事儿
一个运算符
or 从左到右, 返回第一个为真的值, 都为假返回后一个值
and 从左到右, 若所有值均为真, 则返回后一个值, 有一个假的值, 则返回第一个假的值
多个运算符
从左至右, 一个一个运算符的算
10. Python * 和 ** 的用法 - 多参数的传递和变量的拆解
多参数的传值
* 表示多个非关键字参数的传递, 可以用一个 tuple 表示;** 表示多个关键字 参数的传递, 可以用一个 dict 表示
变量的拆解
* 或 ** 放在变量前面是对变量的一次拆解
11. for...else...(python)
正常循环完所有次数, 然后执行 else 语句; 如果中途遇到 break/continue 则可以阻止 else 语句的执行.
12. 常用 enumerate
- list0 = ['val1', 'val2', 'val3']
- for i, value in enumerate(list0):
- print('{}:{}'.format(i, value))
- # 输出
- #0:val1
- #1:val2
- #2:val3
13. 在一段代码中间用 from...import..., 空一行, 然后继续剩下的代码
14. Django rest_framework 路由的注册
- from rest_framework_nested import routers
- a_router = routers.SimpleRouter()
- a_router.register(*args)
- # 如若在 a_router 的基础上扩展路由, 可参照如下写法
- b_router = routers.NestedSimpleRouter(a_router, *args, **kwargs)
- b_router.register(*args)
15. rest_framework serializer 扩展功能
如果需要修改序列化或反序列化的类, 可以通过重写 to_representation 或者 to_internal_value 方法来实现
- def to_representation(self, instance):
- data = super(**siri, self).to_representation(instance)
- # 下面你就可以添加你想要的修改或新增的功能了, 比如:
- data['username'] = data['username'].upper()
- return data
16. Django 常见的数据库字段类型及参数
参考链接: http://www.mamicode.com/info-detail-1897477.html
16.1 字段类型
AutoField: int 自增列, 必须填入参数 primary_key=True
IntegerField: 整数列(有符号的) -2147483648 ~ 2147483647
CharField: 字符类型, 必须提供 max_length(最大字符长度)参数
UUIDField: 字符串类型, Django Admin 以及 ModelForm 中提供对 UUID 格式的验证
TextField: 文本类型(是不受长度限制的 CharField)
BooleanField: 布尔值类型
EmailField: 字符串类型, Django Admin 以及 ModelForm 中提供验证机制
URLField: 字符串类型, Django Admin 以及 ModelForm 中提供验证 URL
DateTimeField: 日期 + 时间 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]
DateField: 日期格式 YYYY-MM-DD
TimeField: 时间格式 HH:MM[:ss[.uuuuuu]][TZ]
DecimalField: 十进制小数
16.2 参数
null: 是否可以为空
default: 默认值
db_index: 索引
unique: 唯一索引
editable: django admin 是否可以被编辑
choices: django admin 中显示下拉框, 避免连表查询
primary_key: 主键
auto_now: 创建时, 自动生成时间
auto_now_add: 更新时, 自动更新为当前时间
blank: Django admin 是否可以留空
verbose_name: Django admin 显示中文名称
17. Python with 语句
适用环境
with 语句适用于对资源进行访问的场合, 确保不管使用过程中是否发生异常都会执行必要的 "清理" 操作, 释放资源, 比如文件使用后自动关闭, 线程中锁的自动获取和释放等.
基本语法及原理
上下文管理器
首先说到 with 语句, 而上下文管理器是必须要知道的概念, 有了上下文管理器, with 语句才能正常工作. 并且上下文管理器必须包含两个方法:__enter__()和__exit__(), 如果要自定义上下文管理器, 就需要重写这两个方法.
语法
常见的语法格式一般如下:
- with context_expression [as tragets]:
- <with-body>
with 语句包裹起来的代码块, 在执行语句体之前会调用上下文管理器的 __enter__() 方法, 执行完语句体之后会执行 __exit__() 方法.
contextlib 模块
contextlib 模块提供了 3 个对象: 装饰器 contextmanager, 函数 nested 和上下文管理器 closing. 使用这些对象, 可以对已有的生成器函数或者对象进行包装, 加入对上下文管理协议的支持, 避免了专门编写上下文管理器来支持 with 语句.
下面以 contextmanager 举个栗子:
- # -*- coding: utf-8 -*-
- from context lib import context manager
- @contextmanager
- def func0():
- print('Allocate resources')
- print('Before yield')
- yield '*** contextmanager demo ***'
- print('After yield')
- print('Free resources')
- with func0() as value:
- print('Assigned resources: {}'.format(value))
- # 输出
- #Allocate resources
- #Before yield
- #Assigned resources: *** contextmanager demo ***
- #After yield
- #Free resources
18. qrcode 模块的使用
qrcode 是一个开源生成二维码的工具, 一般地有两种方式来实现:
qrcode.make() 函数形式生成二维码
qrcode.QRCode() 类实例形式生成二维码
而后端在做开发的时候, 常常会结合 BytesIO 模块, 直接返回图片流而不用写文件到硬盘, 举个栗子:
- # -*- coding: utf-8 -*-
- from django.http import HttpResponse
- from io import BytesIO
- import qrcode
- def generate_qrcode(request, data)
- qr = qrcode.make(data)
- buff = BytesIO()
- qr.save(buff)
- image_stream = buff.getvalue()
- response = HttpResponse(image_stream, content_type='image/png')
- return response
19. zipfile 模块的使用
zipfile 模块是 python 中对文件进行 zip 格式的的压缩及解压缩的, 其中它涉及的两个类比较常用: ZipFile 和 ZipInfo.
ZipFile
这个类是用来实现压缩和解压缩文件的, 具体的用法可参考如下:
class zipfile.ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, compresslevel=None)
file: 文件的路径, 类文件对象或者类路径对象(比如 io.BytesIO())
mode: 打开文件的模式, 有 r,w,a 等几种模式
compression: 压缩或解压缩的方法, 常见的方法比如 zipfile.ZIP_STORED,zipfile.ZIP_DEFAULT
allowZip64: 如果要操作的 zip 文件大于 2G, 设置成 true
当然, ZipFile 还有很多的参数, 属性或者方法, 具体的可参考 zipfile 官方文档
举个栗子:
- # -*- coding: utf-8 -*-
- from io import BytesIO
- import qrcode, zipfile
- zip_file = BytesIO()
- buff = BytesIO()
- qr = qrcode.make('https://weixin/qrcode/0909090909')
- qr.save(buff)
- with zipfile.ZipFile(zip_file, 'w', compression=zipfile.ZIP_DEFAULT) as my_zip:
- my_zip.writestr('my.png', buff.getvalue())
- ZipInfo
- Instances of the ZipInfo class are returned by the getinfo() and infolist() methods of ZipFile objects.Each object stores information about a single member of the ZIP archive
上面的一段话是摘自 zipfile 官方文档, 很好的向我们解释了 ZipInfo, 下面仅列出一些常见的属性:
ZipInfo.filename: 获取文件名称.
ZipInfo.date_time: 获取文件最后修改时间. 返回一个包含 6 个元素的元组(年, 月, 日, 时, 分, 秒)
ZipInfo.compress_type: 压缩类型.
ZipInfo.comment: 文档说明.
ZipInfo.extr: 扩展项数据.
ZipInfo.create_system: 获取创建该 zip 文档的系统.
ZipInfo.create_version: 获取 创建 zip 文档的 PKZIP 版本.
ZipInfo.extract_version: 获取 解压 zip 文档所需的 PKZIP 版本.
ZipInfo.reserved: 预留字段, 当前实现总是返回 0.
ZipInfo.flag_bits: zip 标志位.
ZipInfo.volume: 文件头的卷标.
ZipInfo.internal_attr: 内部属性.
ZipInfo.external_attr: 外部属性.
ZipInfo.header_offset: 文件头偏移位.
ZipInfo.CRC: 未压缩文件的 CRC-32.
ZipInfo.compress_size: 获取压缩后的大小.
ZipInfo.file_size: 获取未压缩的文件大小.
20. Git 一些命令使用
21. 生成 patch 和打 patch(Linux 命令)
- # 生成补丁(多文件模式, 如果单文件去电参数 rN 即可)
- diff -uprN origfile newfile> diff.patch
- # 打补丁, 需要 cd 到代码的根目录
- patch -p1 < diff.patch
来源: http://www.jianshu.com/p/08339edd4eb4