随笔

什么时候用了函数的默认参数是空列表[]

写客户管理系统的时候,给每个URL分权限的时候,先获取Django所有的URL,写了一个函数,一个默认参数是空列表,递归获取URL并加入到同一个列表内。

深拷贝在哪用过?

CRM的组合筛选,生成筛选按钮,根据当前的URL给筛选的按钮配上不同的URL,每次就拷贝了一份再修改的参数。

用过哪些装饰器?

  1. 自己写admin的时候给每个视图函数 赋值self.request=request
  2. @property,把实例方法当属性调用
  3. 简单的登录认证
  4. Django的csrf的装饰器,视图取消csrf认证,@csrf_exempt,给视图设置csrftoken的cookie,@ensure_csrf_cookie

用过哪些生成器?

生成器是函数+yield

  1. 写客户管理系统,获得的数据要进行二次操作,再在模板中循环展示,用的生成器减少循环。
  2. tornado yield future对象。

面向对象编程的理解

面向对象有三大特征:封装、继承、多态

  1. 多态 Python语言是非强类型的,出入的参数可以是多种多样的,本身就是多态的。
  2. 封装 数据的封装,函数的封装,取数据和调用函数都比较方便。
  3. 继承 当前类中没有方法或者属性,就去基类中找。Python还是多继承,新式类的查找顺序是广度优先,经典类的查找顺序是深度优先。

面向对象在哪里用?

  1. Django的CBV、中间件、model
  2. Django REST framework 中的view、版本、认证、权限、限制访问频率

哪里用过__call__方法

  1. Django WSGIHandler 程序的入口
  2. Flask程序的入口
  3. Django中间件 都要继承一个MiddlewareMixin 其中实现了__call__方法,然后执行的process_request、process_response

中间件有几个方法?

  • process_request(self,request)
  • process_view(self, request, callback, callback_args, callback_kwargs)
  • process_template_response(self,request,response)
  • process_exception(self, request, exception)
  • process_response(self, request, response)
    以上方法的返回值可以是None和HttpResponse对象,如果是None,则继续按照django定义的规则向下执行,如果是HttpResponse对象,则直接将该对象返回给用户。
1
2
3
4
5
6
7
8
9
10
11
# 默认配置是7个中间件

MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware', # 安全
'django.contrib.sessions.middleware.SessionMiddleware', # session
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware', # csrf
'django.contrib.auth.middleware.AuthenticationMiddleware', # 认证
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

对象的内置方法

__new__ 对象实例化第一个调用的方法,返回一个实例
__init__ 构造方法,对象的初始化
__del__ 析构方法,定义了对象被垃圾回收时的行为。

__str__ 调用str()时的行为
__repr__ repr()时的行为。repr() 的作用是产生机器可读的输出(大部分情况下,其输出可以作为有效的Python代码),而 str() 则产生人类可读的输出。

__getattr__(self,name) 查找属性
__setattr__(self,key,vale) 设置属性 self._dict__[key]=value #应该使用它
__delattr__(self,key) 删除属性 self.__dict__.pop(item)

__module__ 表示当前操作的对象在那个模块
__class__ 表示当前操作的对象的类是什么

__enter__(self) 定义使用 with 声明创建的语句块最开始上下文管理器应该做些什么
__exit__(self, exception_type, exception_value, traceback) 定义当 with 声明语句块执行完毕(或终止)时上下文管理器的行为。

__call__ 允许类的一个实例像函数那样被调用。

常用的模块

  • json
  • time
  • sys/os
  • re
  • random
  • requests
  • beautifulSoup

什么是socket?什么是Websocket?

socket又称套接字。网络中的通信需要两个socket,一个客户端,一个服务端。
详解

WebSocket是基于TCP的一种新的协议,它实现了浏览器和服务器的全双工通信。其本质是保持TCP连接,在浏览器和服务端通过Socket进行通信。

  1. 先启动服务端
  2. 客户端发送连接请求 var socket = new WebSocket(“ws://127.0.0.1:8002/“);
  3. 建立连接
    • 从请求中提取 Sec-WebSocket-Key
    • 利用magic_string 和 Sec-WebSocket-Key 进行hmac1加密,再进行base64加密
    • 将加密结果响应给客户端
    • 注:magic string为:258EAFA5-E914-47DA-95CA-C5AB0DC85B11
  4. 客户端、服务端收发数据(数据要封包和解包)
    • 客户端的JavaScript类库已经封装[封包]和[解包]过程,但Socket服务端需要手动实现。

可以基于tornado和websocket实现聊天室的功能

  • tornado本身支持websocket
  • Handler类需要继承tornado.websocket.WebSocketHandler
  • 几个方法:open(self) 客户端连接成功时执行。on_message(self, message) 客户端发消息时自动执行。on_close(self) 客户端关闭连接时执行。
    详解

Web框架对比

  • Django 重武器,包含了许多组件的框架。如:ORM、session、form、admin、分页、中间件、信号、缓存、contenttype
  • Tornado WebSocket,异步非阻塞
  • Flask 无,开源组件较多

说说你对多线程、多进程、协程的了解

  • 线程和进程都是真实存在的,协程是人为定义的。
  • 进程的定义是具有一定独立功能关于某个数据集合上的一次运行活动。线程是进程的实体,是CPU调度和分派的基本单位。
  • 协程是人为地控制程序的切换。单纯的协程没有意义。一个线程下使用协程+IO多路复用能实现并发。
  • CPython有GIL锁,所以如果是多线程的话,无论有多少个CPU,同一时刻只有一个线程被执行。
  • 对于计算密集型任务使用多进程,IO密集型任务使用多线程。

在线视频平台项目

程序主要分为三大部分,web主站,导师后台管理系统,管理员后台。系统采用前后端数据分离模式,前端采用Vue.js实现,后端基于Django rest framework 框架实现,系统主要用于为程序员提供在线学习平台。部署的时候使用git和Jekins以及SaltStack实现项目的自动化部署。
功能:

  • 基于极验实现滑动验证
  • 在线视频播放:CC 5w70T HTML的flash
  • 基于rest framework实现API接口 给前端提供数据 视频列表、视频详情、评论等
  • 自定义token验证,用户名+时间的哈希值 放在数据库中
  • 序列化 以及对请求数据的合法性进行自定义验证 Serializer validators=[PasswordValidator(‘666’)]
  • API访问接口限制频率 BaseThrottle类 allow_request方法 return ture 可以访问
  • 支付流程
    • 中间件实现设置响应头 Access-Control-Allow-Origin Access-Control-Allow-Headers
    • 单例模式 实现连接Redis hset hget
    • 购物车功能的实现get 获取购物车信息 post 提交购物车信息 put 修改购物车信息 delete 删除购物车信息
    • 支付宝支付 Alipay类 商户app_id 商户私钥 支付宝公钥 生成支付的URL 自动跳转

客户关系管理系统(CRM系统)

功能:

  • 基于Django中间件和session实现自定义rbac权限组件。粒度到按钮级别。
    • 表 用户表 角色表 菜单表 权限表
      多对多    用户和角色     角色和权限
      FK(一对多)        菜单和菜单(父级菜单)    权限和菜单(所属菜单)
      
    • 流程
      给角色分配权限,给用户分配角色
      用户登录成功后,初始化权限,把权限和菜单写入session中
      每次请求来通过中间件判断访问的URL是否是当前用户可访问的
      自动生成左侧菜单栏,当前访问的URL菜单自动展开
  • 参考Django源码实现自定义CURD组件的开发,并完成定制列等功能
    NbSite类 模仿adminsite 生成路由关系 url( 正则 ([url()],name,namespace))
    v1.site.register(model,config) self._registry[model] = model_nb(model, self)
    ModelNB类 配置类 包含用户自定义的内容
    ChangeList类 封装参数,供模板渲染使用

资产管理系统

功能:

  • 基于paramiko/saltstack资产采集,在中控机上定时任务执行;
  • 基于反射和工程模式实现三种模式
  • 可扩展的配置文件
  • 基于线程池实现并发采集
  • 基于 rest api 实现接受数据并做持久化处理
  • form 验证