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