Python日常积累(一)

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 语句包裹起来的代码块,在执行语句体之前会调用上下文管理器的 __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格式的的压缩及解压缩的,其中它涉及的两个类比较常用:ZipFileZipInfo

  • 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

你可能感兴趣的:(Python日常积累(一))