python99免死题

发布时间 2023-09-24 22:59:32作者: 染指未来

python99?免死题

  1. python 和 其他语言的区别

    python: 语法简洁,开发效率高,第三方库多(机器学习,数据分析), 弱类型语言
    Goland: 强类型语言,高并发
    
  2. python2和python3的区别

    # 默认解释器编码:py2使用ASCIL ,py3使用 unicode
    # 字符串字节
    # 经典类 和 新式类
    # yield from 实现协程
    # 字典的 items/values/keys,python2中是列表
    # 编写代码格式修改
    
  3. 运算符

    v = 1 and 8 or 9 and 0 or True
    # and > or , and :都真取前, or:都假去后
    : v = 8 or 0 or True
    : v = 8 or True
    : v = 8
    
  4. pass 作用

    代码占位
    
  5. *args 和 **kwargs的作用

  6. 权限是如何实现的?

  7. 权限组件中有哪些表?表中都有哪些字段?

  8. 权限中如何实现粒度控制到按钮级别?

    当用户登录成功之后,会将该用户所有权限信息放入会话中,会话中保存所有权限信息
    ,格式如下:
    会话权限=
    用户列表:/用户/xx/xxxx/ulist
    User list: “/user/xx/xxxx/ulist/
    User list:/user/xx/xxxx/ulist
    User list:/user/xx/xxxx/ulist
    User list:/user/xx/xxxx/ulist
    用户列表:/用户/xx/xxxx/ulist
    在每个页面中按钮部分会做判断。
    如果user add在session.permission中
    <a>编辑</a>
    else:
    
  9. 权限是否可以粒度控制到数据行?

    可以,增加权限粒度表。限制字段,限制数据读行,跟用户/用户组挂钩
    
  10. 权限为什么要放到会话中?

    权限信息是保存在数据库中,用户登录成功后会将权限信息放入会话,目的是提高效率,不需要每次请求时在去数据库做各种查询。放入会话有没有什么不好之处?无法进行权限的实时更新,需要重新登录之后才能获取最新权限。
    
  11. CRM 主要实现了哪些功能?

    - 项目解决公司销售人员日常客户维护的事宜,对于推广人员录入到公户的客户属于所有销售的共同资源,每个销售都有自己的私户,对于自己私户人员可以一直由自己维护(其他人如果成单提成依然归当前用户) ,每个私户最多有150个客户信息。
    - 对于所有客户信息需要销售进行定期的客户跟进.
    - 对于成单客户端需要维护客户信息,购买订单记录等
    - 根据区域和等于对用户信息处理和划分。
    - 对销售的年度、季度、月度、周进行销售排名的同级
    - 对于用户角色的划分以及权限管理 (为公司开发了一个通用的权限组件)。
    
  12. crm: 为什么要开发?而不是去用现成的?

    用2年开发了crm项目,其中一只在进行项目的维护和新功能的迭代 (由于直接对业务方可能存在功能变动)
    买了一套学邦boss系统 (内置只有通用的功能)切换回去用crm。
    
  13. 有没有看过什么官方文档?

    rabbmitMQ 文档 (最好) http://rabbitmq.mr-ping.com/description.html
    django rest framwork框架文档 (最次)
    
  14. DRF 认证组建的实现过程

    # 配置认证类:在Django项目的配置文件(settings.py)中添加DRF的认证类。DRF提供了多种认证类可供选择,例如Token认证、Session认证、基于JSON Web Token(JWT)的认证等。以下是一些常用的认证类配置示例:
    	
    	REST_FRAMEWORK = {
        'DEFAULT_AUTHENTICATION_CLASSES': [
            'rest_framework.authentication.TokenAuthentication',
            'rest_framework.authentication.SessionAuthentication',
        ],
    }
    
    # 创建用户模型和视图:创建用户模型(通常是Django的内置User模型或自定义的扩展模型),并创建相应的视图类来处理用户认证相关的逻辑
    from django.contrib.auth.models import User
    from rest_framework import viewsets, permissions
    
    class UserViewSet(viewsets.ModelViewSet):
        queryset = User.objects.all()
        serializer_class = UserSerializer
        permission_classes = [permissions.IsAuthenticated]
    ```
    
    在上述示例中,`UserViewSet`是一个基于DRF的视图集(ViewSet),它使用了`User`模型和自定义的`UserSerializer`序列化器,并设置了`permissions.IsAuthenticated`权限类,要求用户必须经过身份验证才能访问相关API。
    
    # 应用认证类:在需要进行认证的API视图中,应用适当的认证类。可以使用DRF提供的装饰器或直接在视图类中定义authentication_classes属性。
    from rest_framework.authentication import TokenAuthentication
    from rest_framework.decorators import authentication_classes
    from rest_framework.views import APIView
    
    @authentication_classes([TokenAuthentication])
    class MyAuthenticatedView(APIView):
        # 视图逻辑
    ```
    
    在上述示例中,`MyAuthenticatedView`视图使用了Token认证类,因此在访问该视图时,需要提供有效的Token进行身份验证。
    
    # 其他功能: 例如权限(Permissions)和限流(Throttling),来进一步保护和控制API的访问。
    
  15. GenericAPIView 视图类的作用是什么?

    - GenericAPIView结合了许多Mixin类
    	- ListAPIView
    	- CreateAPIView 
    	- RetrieveAPIView 
    	
    - 提供了通用的HTTP方法处理
    - 序列化器和查询集 serializer_class 属性 和 queryset 属性
    - 认证(Authentication)、权限(Permissions)和限流(Throttling)
    - GenericAPIView常用的钩子方法和属性
    	- 钩子函数:
          - get
          - post
          - put
          - patch
          - delete
          - perform_create(self, serializer) 在创建对象之前执行自定义逻辑。
          - perform_update(self, serializer) 在更新对象之前执行自定义逻辑。
          - perform_destroy(self, instance) 在删除对象之前执行自定义逻辑。
      - 可扩展属性
      		- serializer_class 指定用于序列化和反序列化的序列化器类
      		- queryset 指定用于数据库查询的查询集
      		- authentication_classes 指定用于身份验证的认证类列表
      		- permission_classes 指定用于权限检查的权限类列表
      		- throttle_classes 指定用于限流的限流类列表
      		- pagination_class 指定用于分页的分页类
    
  16. DRF 继承过哪些视图类?

    # API
    # ModelViewSet
    
  17. django rest framework 框架的作用

    # 1. 遵循restful接口规范
    # 2. 提供内置功能:
    	- 版本管理
    	- 认证
    	- 权限
    	- 节流
    	- 序列化
    	- 渲染
    	- 分页。。。
    
  18. 如何理解restful规范

    - https 代替 http
    - 接口有 api 标识 ,版本建议
    	- https://www.xxx.com/api/v1
    	- https://api.xxx.com/v1
    	
    - 面向资源开发,任何东西都是资源,用英文名词来表示资源
    
    - method 做不同操作
    	- get
    	- post
    	- delete
    	- put
    	- patch 
    
    - 条件 
    	https://www.xxx.com/api/v1/order/?page=11&date=2023
    
    - 使用状态码
    	- 200
    	- 201
    	- 301
    	- 403
    	- 404
    	- 500
    	
    - 错误信息返回 
    	{"code":200,"msg":"获取xxx成功!"}
    	
    - 返回数据不同
    	根据不同的method,返回不同形式的数据
    		- get,返回列表形式数据
    		- post,返回单个添加成功的数据 {code:200,data:{id:1,title:"xx"}}
    		- put , 同 post
    		
    - 返回url
    	{code:200,data:{id:1,depart_url:"https://www.xxx.com/api/v1/order/1"}}
    
  19. 什么 是 RPC ?

    # 高效传输数据格式
    
    # Server
    # -*-coding:utf-8-*-
    import Pyro4
    from Pyro4 import expose
    
    
    class Calculator(object):
        @expose
        def add(self, a, b):
            return a + b
    
        @expose
        def subtract(self, a, b):
            return a - b
    
    
    if __name__ == '__main__':
        daemon = Pyro4.Daemon()
        uri = daemon.register(Calculator)
        print("URI服务器:", uri)
        daemon.requestLoop()
    
    
    # client 
    # -*-coding:utf-8-*-
    import Pyro4
    
    import Pyro4
    
    uri = input("输入服务器URI:")
    
    calculator = Pyro4.Proxy(uri)
    
    if __name__ == '__main__':
        a = 10
        b = 5
    
        result = calculator.add(a, b)
        print("加法结果:", result)
    
        result = calculator.subtract(a, b)
        print("减法结果:", result)
    
    
  20. 什么是wevservice

    开发手册
    
  21. session 和 cookie的区别

    session 保存在服务端,不受长度限制
    cookie 保存在浏览器,受长度限制
    
  22. 使用Django的ORM实现id不等5的数据查询

    models.表类.objects.exclude(id=5)
    
  23. Django ORM 执行原生SQL

    # extra: Entry.objects.extra(where=["foo='a'OR bar = 'a'","id>%s"], params=[9])
    # raw : UserInfo.objects.raw('select * from userinfo')connections
    # eg: 
    from django.db import connection,connections
    cursor = connection.cursor() # cursor =connections['default'].cursor()
    cursor.execute(""SELECT * from auth_user where id = %s",[1])
    row = cursor.fetchone() # fetcha11()/fetchmany(..)
    
    
  24. django 的 ORM 的 F 有什么作用?

    # F:对某个数据列 自由操作
    # 例如: 用户表中包含用户信息和薪水,请通过ORM将所有用户的薪水在自己原来薪水基础上+1000
    
    models.UserInfo.objects.a11( .update(salary=F('salary')+1000)
    
    
  25. django 的 ORM 的 Q 有什么作用?

    # 构造复杂的查询条件
    
  26. django ORM 批量创建数据

    # buld_create 函数
    .bulk_create([obj1,obj2,obj3])
    
    
  27. django 中的 cbv 和 fbv的区别

    # CBV 是类视图,
    # FBV 是函数视图
    
    class View.as_view() == function view
    
    
  28. Django 中的name什么作用

    # 基于 name 命名,反向创建 URL 路由
    
  29. django的中间件作用?

    # 可以对django中所有 ` 请求处理之前 ` 和 `处理之后` 进行功能的扩展。应用场景:
    1。自定义权限组件中使用它做权限控制。
    2. django内置实现的csrf认证。
    3。 django内置实现的session功能
    4。用户认证。
    5还可以做:用户访问频率限制 (已登录用户)
    6,黑名单和白名单。
    
    注意:执行流程和5个方法
    
    
  30. Django 生命周期

    START: 请求到来之后,先到达wsgi (本质实现了socket服务端,用于接收用户请求,wsgi是web服务网关接口,实现此协议有wsgiref、uwsgi),然后将请求转交给django 
    - 1. 接下来到达diango的中间件,执行中间件的process request方法
    - 2. 接下来进行路由匹配,路由匹配成功找到指定函数之后。
    - 3. 接下来执行process_view方法(旦出错会执行process_exception方法)
    - 4. 视图函数,视图函数可以调用ORM操作数据,也可以调用模板进行模板渲染。
    - 5. 接下来按照倒叙的形式执行中间件的 process_response方法。
    - 6. 用数据返回给用户。
    
    
  31. flask 上下文

    基于 : LocalStack,衍生出
    - request_ctx 
    - app_ctx_stack
    
  32. https 加密理解

    https是安全的http,它等同于http+ss1
    
    - 第一步: 服务端需要向专门颁发证书的机构申请ca证书,证书中本质包含公钥和企业信息 (阿里云免
    费)
    - 第二步:客户端向服务端发送请求,服务端会将包含公钥的证书发给客户端,自己保留私钥。
    - 第三步:客户端浏览器要验证证书的合法性。
    - 第四步:客户端在内存中生成一个对称秘钥,通过公钥对对称秘钥进行加密,然后发给服务端。
    - 第五步:服务端接收到密文,然后使用私钥进行解密,解密之后得到 对称密码。
    
    之后两端通信时,就使用对称密码进行加密和解密。
    
    观点:
      a。 http协议是明文的不安全的。
      b, https是安全的,那么他是如何实现安全的呢?
    			- 对称加密,两端用同一个密码进行加密和解密
    			- 非对称加密,公钥,专门用于加密。私钥,专门用于解密c。 https的实现过程?
    
    # 问题: http和https有什么区别?
    - 端口不同: http默认用80端口、https用443端口。
    - 数据内容: http是明文、https是密文(使用对称密码加密),对称秘钥是客户端生成并通过非对称密码加密发送给服务端。非对称密码是客户端在第一次访问时集成在证书中返回给客户端(客户端会对证书进行验证)
    
    
  33. 浏览器同源策略

    # 产生原因: 域名,端口,二级域名不一致引发
    
    # 解决
    	- jsonp
    	- 后段做跨域 cors 设置响应头
    
  34. redis过期策略

    redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。redis 提供 6种数据淘汰策略:
    voltile-1ru: 从已设置过期时间的数据集 (server.db[i].expires)中挑选最近最少使用的数据淘汰
    volatile-ttl: 从已设置过期时间的数据集 (server.db[i].expires) 中挑选将要过期的数据淘汰
    volatile-random: 从已设置过期时间的数据集 (server.db[i].expires)中任意选择数据海汰
    a11keys-1ru: 从数据集 (server.db[i].dict) 中挑选最近最少使用的数据淘汰a11keys-random:从数据集 (server.db[i].dict) 中任意选择数据淘汰
    no-enviction (驱逐) : 禁止驱逐数据
    
  35. Redis AOF 和 RDB的区别

    AOF:基于日志做的持久化,保证数据的完整性。即:记录所有执行的命令,恢复时将所有命令执行一遍。
    RBD:基于快照做的持久化,速度快。即: 定期对redis中的数据进行备份。
    
  36. Redis 和 memcache的区别

    数据类型: redis有5种、memcached有一种数据类型
    持久化: redis支持持久化、memcached不支持。
    高可用: redis支持、memcached不支持。
    分布式集群: redis支持cluster、memcached不支持,
    
  37. redis的数据类型

    str # 字符串
    list # 列表
    hash # hash
    set # 集合
    sorted set # 有序集合
    
  38. SQL 注入

    # 拼接SQL语句时,条件存在 为真条件 如: xxx=xxx or 1==1
    
    # 如何防止SQL注入
    	使用 pymysql 模块的 execute函数拼接参数 
    
  39. 慢日志的作用

    执行慢日志
    - 执行 较慢的SQL
    - 未命中索引的SQL 
    - 优化SQL语句
    
  40. 创建索引,有哪些情况无法命中

    - like 
    - or
    - !=
    - 数据类型不一致 ,查询索引字段时类型不一致 str 和 float
    - order by 索引字段
    - 组合作引最左前缀原则
    # 最左前缀 原则
    

    https://www.cnblogs.com/wupeiqi/articles/5716963.html

  41. 数据库优化方案

    - 数据库读写分离
    - 做数据缓存,redis,memcached
    - 分库分表
    - 设计表时,定长的放前面,变长的放后面
    - 数据方内存
    
  42. mysqldump

    mysqldump -h localhost -u用户名 -p密码 database > dump.sql
    
  43. varchar 和 char 的区别

    varchar 变长
    char 定长
    
  44. Left join 和 right join的区别

    left join , 以左为主
    right join , 以右为主
    
  45. 事物的特性

    原子性
    一致性
    隔离性
    持久性
    
  46. mysql 引擎

    myisam : 不支持事物,支持表锁,速度快,支持全文索引
    innodb : 支持事物,支持表锁和行锁
    
  47. io多路复用

    # 坚挺多个IO对象是否发生变化
    select:最多监听1024,轮循的方式变化。
    poll:不再限制 IO对象的个数,轮循的方法检查
    epoll:不再限制IO对象的个数,回调的方式检查
    # 没用过!!!
    
  48. GIL 新版不清楚,旧版下列参考 todo

    GIL 全局解释器锁
    - 同一时刻,只允许一个进程的一个线程被CPU调度
    - 目的:保护解释器的数据安全
    
  49. 进程,协程,线程

    进程: 计算机资源分配的最小单元
    线程: CPU调度的最小单元
    协程: 微线程,本质上还是通过线程实现并发
    
  50. 断点续传

    - 保存断开时,数据传输的数据量大小
    - 保存断开时,数据传输的字节数
    - 保存断开时,数据传输的前后文件流的seek,seek()函数用于设置文件指针的位置
    
  51. socket 代码

    - server 
    	- 套接字
    	- bind 绑定端口和ip
    	- listen
    	- accept 接受数据
    	
    - client
      - 套接字
    	- connect  链接绑定端口和ip
    	- send 发送数据
    
  52. 粘包现象

```
两个数据发送时,经过缓存区,数据包产生粘连现象

# struct 模块解决 数据粘包问题
```
  1. TCP 和 UDP 的区别

    TCP :安全,可靠,数据流,一致性,慢
    UDP :不可靠,不安全,报文,容易丢包,快
    
  2. osi七层模型

    物理层:0,1电信号
    物理链路层:网线,双绞线
    网络层:IP解析 arp协议
    传输层:端对端链接
    会话层:建立会话
    表示层:数据格式转化
    应用层: 程序
    
  3. TCP 的三次握手,四次挥手

  4. cs架构 , bs架构

  5. Python 元类

    # 常见
    class Foo(object):
    	pass
    # 底层都是通过type创建类
    type('Foo',(object,),{})
    
    
    # metaclass 指定类是由谁来创建
    class Foo(object,metaclass=xxx):
    	pass
    
    
  6. 类的下划线函数

    __new__ 创建对象,单例模式
    __call__ 回调函数
    __enter__ 和 __exit__ 上下文管理
    __getitem__
    __setitem__
    __delitem__
    __add__ 
    
  7. python 类继承 MRO

    super 通过MRO算法继承类
    
  8. 什么是生成器

    yield 是程序保存某一个时刻的状态
    
  9. 迭代器,从前到后,无法回退

    内部存在 __next__()方法
    __next__一次后数据就消失了