python之面试复习

待整理:osi七层协议,tcp三次握手四次挥手

 

1、Http协议(超文本传输协议)

  是一种传输数据的格式。

  1. 建立在TCP之上
  2. 一次请求一次响应,然后断开连接(短连接,无状态)
  3. 请求:请求头 \r\n\r\n 请求体,响应:响应头 \r\n\r\n 响应体

 

常见请求头  请求体

 

2、Django的请求生命周期

  -- WSGI,web服务网关接口,是一套协议,实现协议的模块(wsgiref、werkzeug)实际上就是socket服务端,用于接受用户请求,并进行初次封装,然后将请求交给web矿建,一般web框架都基于wsgi实现,这样实现关注点的分离。

  --中间件,帮助我们对请求进行校验或者添加其他相关数据(csrf、session、request)

  --路由匹配

  --视图函数,进行业务逻辑处理,可能涉及到orm、template

  --中间件,对响应的数据进行处理。

  --WSGI,将响应的内容发送给浏览器。

 

4、Django的中间件是什么?

  五个方法:process_request,process_response 

  是在视图执行之前,定制的一些操作,内置的有session、csrf等,也可以自定义,如:

  权限设置:当用户登陆时,获取当前用户所有的权限储存在session中,当访问其他url时,获取当前url并在session中进行匹配,如果没有则返回没有权限。

  登陆认证:不再需要在每个函数前加装饰器。

  跨域:见下方

  提问:如何根据字符串实例化类?

class  CSRF():
    def process_request(self,request):
        print("123")


path = "views.csrf.CSRF"     #根据这个路径字符串找到这个类?

import importlib
module_path , class_name = path.rsplit(".",maxsplit=1)
m = importlib.import_module(module_path)
getattr(m,class_name)

 

  

 

5、跨域

  -- jsonp:浏览器的同源策略不禁止script标签,jsonp就是动态创建一个script标签,缺点是不能发get请求。

  -- cors:添加响应头。   应用:本地的前后端分离。

    -- 复杂请求:先发送一个option请求进行预检

 

 

6、视图(CBV/FBV)

  分别基于函数和类,本质上都是基于函数,CBV是基于反射的方式通过method的不同找到不同的函数方法。所以CBV更适合做接口。

 

7、restful 规范 (和语言不绑定)

  什么是接口?

  (1)根据method不同,进行不同操作  GET / POST / DELETE / PATCH  / PUT

  (2)面向资源编程,把一切当成资源(url)(url后缀尽量使用名词)

  (3)体现版本

  (4)体现是API

  (5)使用https(安全,但是要花钱)

  (6)响应时添加状态码         return HttpResponse("asdasd",status=404)

  (7)条件     (http://asdasdasdasd/?page=1&size=2)

  (8)返回的数据   (建议:GET返回列表,POST返回添加的数据······)

  (9)返回错误信息       {"code":1000, "data":"xxx", "error":"xxxx"}

  (10)Hypermedia API

 

8、django rest framework框架

  作用:帮助快速开发基于restful规范的接口。

  常见继承关系:View——APIView——GenericAPIView——GenericViewSet(继承了ViewSetMixin,as_view中可以添加参数)——ModelViewSet

class GenericAPIView(views.APIView):
    """
    Base class for all other generic views.
    """
    # You'll need to either set these attributes,
    # or override `get_queryset()`/`get_serializer_class()`.
    # If you are overriding a view method, it is important that you call
    # `get_queryset()` instead of accessing the `queryset` property directly,
    # as `queryset` will get evaluated only once, and those results are cached
    # for all subsequent requests.
    queryset = None
    serializer_class = None
    。。。。

class GenericViewSet(ViewSetMixin, generics.GenericAPIView):
    """
    The GenericViewSet class does not provide any actions by default,
    but does include the base set of generic view behavior, such as
    the `get_object` and `get_queryset` methods.
    """
    pass

class ModelViewSet(mixins.CreateModelMixin,
                   mixins.RetrieveModelMixin,
                   mixins.UpdateModelMixin,
                   mixins.DestroyModelMixin,
                   mixins.ListModelMixin,
                   GenericViewSet):
    """
    A viewset that provides default `create()`, `retrieve()`, `update()`,
    `partial_update()`, `destroy()` and `list()` actions.
    """
    pass
View Code

 

  功能和组件:

    (1)路由  

    (2)视图

    (3)版本控制

    (4)序列化

    (5)认证

    (6)权限

    (7)频率

    (8)分页

    (9)解析器

    (10)渲染器

  http://www.cnblogs.com/aaronthon/p/9319981.html

 

 

9、如何实现访问频率限制?

  创建一个字典,以IP为键,每次访问的时间戳组成的列表为值,每次访问时,把列表中小于(当前时间戳 - 访问限制时间范围) 的值去除,再根据列表长度是否小于规定时间可访问次数来判断是否超出频率。

  但是这种方法只能在一定程度上限制,无法控制匿名用户,因为用户可以换代理IP。

 

10、orm操作补充

  -- only 指定查询的列,取出的是queyset,且其中的每个数据都是对象。values取出的里面是列表

  -- defer 排除查询的列

  -- selected_related:主动做连表查询(主动做join)。   可以提高连表查询的性能,但是如果连表多,性能会越来越差。

  -- prefetch_related:是多次单表操作,先取到一张表中的数据,再构造条件在第二张表中取和第一章表相关的数据。

  -- F:对数据进行更新。

  -- Q:构造复杂筛选条件。

  -- orm写原生sql三种方式:extra、.raw方法、原生

 

11、git的作用和命令

  git rebase的作用?保持提交记录的整洁。

  git 如何做协同开发? 每个成员创建一个分支,分别开发,合并。一般一到两天合并一次,防止出现太多冲突。

  开发过程出现bug怎么办? 创建一个bug分支来解决。

  是否做review? 提交到review分支。

  如何给开源代码贡献代码? foke

 

12、数据库的特点

  数据库分页,页码越大,速度越来越慢。解决:1、限制页数。   2、记住当前页数据的最大和最小id  

 

13、redis的特点

  对内存进行管理

  可以做持久化。aof(快照)、rdb(记录所有的命令和记录),各有利弊。

  单进程、单线程

  五大数据类型

 

14、原生ajax:XMLHttpResponse

 

15、购物车

  为什么使用redis而不是数据库?

    临时状态,并且更新频繁。

  字典是如何构造的?

 

16、路飞学城相关:

  1、购物车如何实现? 

    把用户的购物信息放入redis中,构造一个数据结构存放相关信息。

  2、商品是否有个数?

    没有。但是有价格策略,以时间为单位。

  3、redis中的结构?

  4、购物车中的数量是否有限制?购物车是否设置超时时间?(一定要二选一)(防止恶意存放大数量数据)

  5、为什么使用redis?

    因为这是一个临时状态,且更新频繁,放在redis中直接操作内存比频繁操作数据库效率更高。

  6、具体的购物车的逻辑?

    添加:用户选择课程和价格策略——获取课程和价格策略ID并进行合法性校验——构造一个以“shopping_car_+用户ID+课程ID”为键的字典,将数据以字典形式保存到redis中。

    修改:用户选择价格策略——校验合法性——更新价格策略。

    删除:用户选择删除的课程——校验——删除。

    查询:通过scan_iter查询该用户所有购物车信息(构造“shopping_car_ID_* ”为键)

  7、原则:

    简单逻辑先处理

    try异常捕获 + 自定义异常

    导入模块美观

    文件名、类名、project名、函数名格式

    对功能分类

 

17、谈谈Django和Flask的认识

  Flask短小精悍,体量小,用很少的代码就能实现一个网页,响应的它提供的内置功能也少,但是他可扩展性强,提供了很多第三方组件。

  Django的自带组件:ORM,admin,from,分页

 

18、Django和Flask最大的不同点

  Django通过参数传递request,session依附于request

  Flask直接导入request和flask

 

19、Flask知识点

  1、请求上下文管理:request,session

  请求到来后wsgi会调用__call__方法,由__call__方法再调用wsgi_app方法。

  在wsgi_app中首先做

 

20、什么是偏函数?应用场景

 

21、面向对象中的方法

  __new__:在执行__init__之前执行

  __call__:在Flask和Django请求的入口

  __setattr__、__getattr__:通过对象点来取值赋值,在Flask的Local对象中

  __setitem__、__getitem__:通过对象加中括号来取值赋值,Django的request.session['sss'] = 123

  __mro__

  __slots__:只能访问相应字段

转载于:https://www.cnblogs.com/yinwenjie/p/10592193.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值