Python web开发高频面试题总结(最新版、面试必备)

本文详细总结了Python Web开发的面试高频知识点,涵盖Python模块、内置类型、变量作用域、数组与列表的区别、self的含义、提高Python效率的方法、命名空间、线程并发问题解决方案、Django框架的理解、HTTP请求生命周期、ORM机制、Django缓存、WebSocket、CSRF原理、SQL注入防护、Docker技术及其优势、bug处理方法、HTTP状态码、Django内置组件、RESTful规范等内容,是面试准备的宝贵资料。
摘要由CSDN通过智能技术生成

什么是python模块?什么是Python的内置类型?
Python模块是包含Python代码的.py文件。此代码可以是函数类或变量。
Python中的内置类型如下:整型、浮点型、复数、字符串、布尔等

Python中的局部变量和全局变量是什么?
全局变量:在函数外或全局空间中声明的变量称为全局变量。这些变量可以由程序中的任何函数访问。
局部变量:在函数内声明的任何变量都称为局部变量。此变量存在于局部空间中,而不是全局空间中。

Python数组和列表有什么区别?
python本身并没有数组类型,但Numpy库中有数组类型。
Python中的数组和列表具有相同的存储数据方式。
数组里面元素的数据类型必须是相同的,而列表可以包含任何数据类型元素。

Python中的self是什么?
self是类的实例或对象。在Python中,self包含在第一个参数中。但是,Java中的情况并非如此,它是可选的。它有助于区分具有局部变量的类的方法和属性。init方法中的self变量引用新创建的对象,而在其他方法中,它引用其方法被调用的对象。

如何提高python的运行效率
1.使用生成器,因为可以节约大量内存
2.循环代码优化,避免过多重复代码的执行
3.核心模块用Cython PyPy等,提高效率
4.多进程、多线程、协程
5.多个if elif条件判断,可以把最有可能先发生的条件放到前面写,这样可以减少程序判断的次数,提高效率

什么是python的命名空间
python的命名空间相当于一个字典,键是变量名,值是变量名对应的对象。
每个命名空间中不能定义相同的变量,符合字典的特性–不存在添加,存在修改。调用这个变量名就会自动进入命名空间寻找对应的对象。

python的命名空间分为几个?他们是否互相影响,互相独立?
python的命名空间分为3个,他们互不影响,相互独立
第一个:每个函数内部都有属于自己的命名空间
第二个:每个模块都有自己的命名空间,存放模块内定义的变量,对象
第三个:python自带的内置命名空间,存放的是自带的属性…比如 print,int,str,class
Python如何解决变量名命名冲突问题?
在Python中,没有类似 private 之类的字关键来声明私有方法或属性。
Python中要声明私有属性,需要在属性前加上双下划线(但是结尾处不能有双下划线),如:self.__a。然而这样的什么方式并不是真正私有,而是“伪私有”。
Python的伪私有属性,实际是通过变量名压缩(mangling)来实现变量名局部化。变量名压缩的规则:在初始的变量名头部加上一个下划线,再加上类的名称,最后是初始变量名的名称。
Python的类不存在真正的私有属性,通过双下划线实现的伪私有属性,本质上是对变量名进行压缩,使之无法直接在外部调用。
为什么要使用伪私有属性?
使用伪私有属性是为了避免在类树中,多个类赋值相同的属性引发冲突问题。

如何在Python中实现多线程?
Python有一个多线程库,但是用多线程来加速代码的效果并不是那么的好,Python有一个名为Global Interpreter Lock(GIL)的结构。GIL确保每次只能执行一个“线程”。一个线程获取GIL执行相关操作,然后将GIL传递到下一个线程。

Python线程中start方法和run方法的区别?
若调用start,则先执行主进程,后执行子进程;
若调用run,相当于正常的函数调用,将按照程序的顺序执行

Python如何处理高并发?
1.HTML页面静态化
2.图片服务器分离(可以用fastdfs轻量级的分布式文件存储系统)
3.使用缓存(用redis)
4.数据库集群、读写分离。减轻数据库服务器的读写压力。
5.使用负载均衡的方法(配置nigix服务器,用nginx来配置负载均衡,只需要设置 如下代码,即可实现简单的负载均衡

 upstream djangoserver {
     
             server 192.168.72.49:8080;  
             server 192.168.72.49:8081;  
          }   

6.镜像。镜像是大型网站常采用的提高性能和数据安全性的方式,镜像的技术可以解决不同网络接入商和地域带来的用户访问速度差异,比如ChinaNet和EduNet之间的差异就促使了很多网站在教育网内搭建镜像站点,数据进行定时更新或者实时更新。
7.CDN加速技术(内容分发网络)。

TCP与UDP区别

  1. TCP面向连接(如打电话要先拨号建立连接); UDP是无连接的,即发送数据之前不需要建立连接
  2. TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达; UDP尽最大努力交付,即不保证可靠交付。TCP通过校验,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。
  3. UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。
  4. 每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
  5. TCP对系统资源要求较多,UDP对系统资源要求较少。

谈谈你对 Django 的认识

  1. Django 是 走大而全的方向,它最出名的是全自动化的管理后台: 只需要使用 ORM做简单的对象定义,它就能自动生成数据库结构、以及全功能的管理后台。
  2. Django 内置的ORM 跟框架内的其他模块耦合程度高。应用程序必须使用 Django 内置的 ORM,否则就不能享受到框架内提供的种种基于其 ORM 的便利;
  3. Django 的卖点是超高的开发效率 ,其性能扩展有限;采用 Django 的项目,在流量达
    到一定规模后,都需要对其进行重构,才能满足性能的要求。
  4. Django 适用的是 中小型 的网站,或者是作为大型网站快速实现产品雏形的工具。
  5. Django 模板的设计哲学是彻底的将代码、样式分离 ;Django 从根本上杜绝在模板
    中进行编码、处理数据的可能。

django 请求的生命周期
前端请求—>Nginx—>uwsgi—>中间件—>url 路由—>view 视图—>ORM—>拿到数据返view—>视图将数据渲染到模板中,拿到字符串—>中间件—>wsgi—>Nginx—>前端渲染
a. wsgi, 创建 socket 服务端,用于接收用户请求, 并对请求进行初次封装。
b. 中间件,对所有请求到来之前,响应之前定制一些操作。
c. 路由匹配,在url 和视图函数对应关系中,根据当前请求 url 找到相应的函数。
d. 执行视图函数,业务处理(通过 ORM 去数据库中获取数据,再去拿到模板,然后将数据和模板进行渲染)。
e. 再经过所有中间件。
f. 通过 wsgi 将响应返回给用户。

FBV 模式和 CBV 模式
FBV(Function Base Views):一个 url 对应一个视图函数
CBV(Class Base views):一个 url 对应一个类
FBV 方式请求的过程 :用户发送url请求,Django会依次遍历路由映射表中的所有记录,一旦路由映射表其中的一条匹配成功了,就执行视图函数中对应的函数名,这是 V FBV 的执行流程。
CBV 方式请求的过程:当服务端使用cbv 模式的时候,用户发给服务端的请求包含 url和 method,这两个信息都是字符串类型, 服务端通过路由映射表匹配成功后会自动去找dispatch方法,然后Django会通过dispatch反射的方式找到类中对应的方法并执行,类中的方法执行完毕之后,会把客户端想要的数据返回给dispatch 方法,由 dispatch方法把数据返回经客户端。

问题:在多个用户同时发起对同一个商品的下单请求时,先查询商品库存,再修改商品库存,会出现资源竞争问题,导致库存的最终结果出现异常。 例如:id为16的商品的库存为10,两人同时购买,每人买5件,如果产生并发问题,两人下单都成功,但是库存变成了5
解决办法:
悲观锁
当查询某条记录时,即让数据库为该记录加锁,锁住记录后别人无法操作,
语法如下:
select stock from tb_sku where id=1 for update;
SKU.objects.select_for_update().get(id=1)
乐观锁
乐观锁并不是真实存在的锁,而是在更新的时候判断此时的库存是否是之前查询出的库存,如果相同,表示没人修改,可以更新库存,否则表示别人抢过资源,不再执行库存更新。类似如下操作
update tb_sku set stock=2 where id=1 and stock=7;
SKU.objects.filt

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值