2018最新python基础面试题

1.异常:又语法异常,逻辑异常(又分为可预知异常if…else 处理,不可预知异常try…except处理)
2.异步IO/同步IO:
(1)同步:
所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事。
例如:普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事

(2)异步:
异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。
例如: ajax请求(异步): 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕

同步IO和异步IO的区别就在于:数据拷贝的时候进程是否阻塞
摘自简述同步IO和异步IO的区别
3.栈和队列的区别:
栈的插入和删除操作都是在一端进行的,而队列的操作却是在两端进行的。
栈是先进后出,队列是先进先出。
栈只允许在表尾一端进行插入和删除,队列只允许在表尾一端进行插入,在表头一端进行删除。
4.网页缓慢的原因,处理方法(网站优化的关键技术:页面静态化和缓存)
原因:请求来回访问数据库,请求数据库频繁,加载缓慢。
处理方法:页面静态化,使用缓存,sql的优化
5.SQL注入:所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。 [1] 比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.
6.DNS是什么:
DNS 是域名系统 (Domain Name System) 的缩写,简单的理解一下,我们要访问百度,然后在浏览器中输入百度的地址就可以访问百度的网站了。
(百度百科:DNS(Domain Name System,域名系统),万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过域名,最终得到该域名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。在RFC文档中RFC 2181对DNS有规范说明,RFC 2136对DNS的动态更新进行说明,RFC 2308对DNS查询的反向缓存进行说明。)
7.数据分析:数据分析是指用适当的统计分析方法对收集来的大量数据进行分析,提取有用信息和形成结论而对数据加以详细研究和概括总结的过程。这一过程也是质量管理体系的支持过程。在实用中,数据分析可帮助人们作出判断,以便采取适当行动。
8.get,post区别:
(1)GET请求,请求的数据会附加在URL之后,以?分割URL和传输数据,多个参数用& 连接。URL的编码格式采用的是ASCII编码,而不是uniclde,即是说所有的非ASCII字符都要编码之后再传输。
POST 请求:POST 请求会把请求的数据放置在 HTTP 请求包的包体中。上面的 item=bandsaw就是实际的传输数据。
因此,GET请求的数据会暴露在地址栏中,而POST请求则不会。
(2)传输数据的大小
在HTTP规范中,没有对URL的长度和传输的数据大小进行限制。但是在实际开发过程中,对于GET,特定的浏览器和服务器对URL的长度有限制。因此,在使用GET请求时,传输数据会受到URL长度的限制。
对于POST,由于不是URL传值,理论上是不会受限制的,但是实际上各个服务器会规定对POST提交数据大小进行限制,Apache、IIS都有各自的配置。
(3)安全性
POST的安全性比GET的高。这里的安全是指真正的安全,而不同于上面GET提到的安全方法中的安全,上面提到的安全仅仅是不修改服务器的数据。比如,在进行登录操作,通过GET请求,用户名和密码都会暴露再URL上,因为登录页面有可能被浏览器缓存以及其他人查看浏览器的历史记录的原因,此时的用户名和密码就很容易被他人拿到了。除此之外,
GET请求提交的数据还可能会造成Cross-site request frogery攻击。
get:url拼接
post:以参数形式进行提交
GET仅请求资源,POST会附带用户数据
9.Ajax:ajax(异步的javascript 和xml) 能够刷新局部网页数据而不是重新加载整个网页。
10.序列化:我们把变量从内存中变成可存储或传输的过程称之为序列化;(转化为json,对象,列表,字典等等)python-序列化
11.垃圾收机制:
Python GC主要使用引用计数(reference counting)来跟踪和回收垃圾。在引用计数的基础上,通过“标记-清除”(mark and sweep)解决容器对象可能产生的循环引用问题,通过“分代回收”(generation collection)以空间换时间的方法提高垃圾回收效率。
(1) 引用计数
PyObject是每个对象必有的内容,其中ob_refcnt就是做为引用计数。当一个对象有新的引用时,它的ob_refcnt就会增加,当引用它的对象被删除,它的ob_refcnt就会减少.引用计数为0时,该对象生命就结束了。
优点:简单,实时性
缺点:维护引用计数消耗资源,循环引用
(2)标记-清除机制
基本思路是先按需分配,等到没有空闲内存的时候从寄存器和程序栈上的引用出发,遍历以对象为节点、以引用为边构成的图,把所有可以访问到的对象打上标记,然后清扫一遍内存空间,把所有没标记的对象释放。
(3)分代技术
分代回收的整体思想是:将系统中的所有内存块根据其存活时间划分为不同的集合,每个集合就成为一个“代”,垃圾收集频率随着“代”的存活时间的增大而减小,存活时间通常利用经过几次垃圾回收来度量。
Python默认定义了三代对象集合,索引数越大,对象存活时间越长。
举例:
当某些内存块M经过了3次垃圾收集的清洗之后还存活时,我们就将内存块M划到一个集合A中去,而新分配的内存都划分到集合B中去。当垃圾收集开始工作时,大多数情况都只对集合B进行垃圾回收,而对集合A进行垃圾回收要隔相当长一段时间后才进行,这就使得垃圾收集机制需要处理的内存少了,效率自然就提高了。在这个过程中,集合B中的某些内存块由于存活时间长而会被转移到集合A中,当然,集合A中实际上也存在一些垃圾,这些垃圾的回收会因为这种分代的机制而被延迟。
12.如何理解面向对象:
在我理解,面向对象是向现实世界模型的自然延伸,这是一种“万物皆对象”的编程思想。在现实生活中的任何物体都可以归为一类事物(举例子,猫狗归为动物等等),而每一个个体都是一类事物的实例。面向对象的编程是以对象为中心,以消息为驱动,所以程序=对象+消息。

也可以这样理解面向对象:
面向对象是一种设计思想,符合人们的思考习惯,把执行者变成指挥者,简化功能,把复杂的事情简单化

想完成一个事,找具有这样功能的对象
如果能找到,调用这个对象的功能,完成这个事
如果找不到,创建具有这样功能的对象,再调用完成这个事

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

13.神魔是Python:
Python是一种解释性语言。Python代码在运行之前不需要编译。其它解释性语言还包括PHP和Ruby。
Python是动态类型语言,指的是在声明变量时,不需要说明变量的类型。
Python非常适合面向对象的编程(OOP),因为它支持通过组合(composition)与继承(inheritance)的方式定义类(class)。
Python中没有访问说明符(类似C++中的public和private),这么设计的依据是“大家都是成年人了”。
14.迭代器,生成器,装饰器:
在Python中,这种一边循环一边计算的机制,称为生成器:generator。可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。生成器是迭代器,是一种只能迭代一次的迭代器。生成器不会将所有值存储在内存中,它们会动态生成值。装饰器,功能就是在运行原来功能基础上,加上一些其它功能,比如权限的验证,比如日志的记录等等。不修改原来的代码,进行功能的扩展。比如java中的动态代理,python的注解装饰器,其实python的装饰器,是修改了代码。

拓展:
迭代器创建方式:iter()函数----通过 iter() 函数获得一个 Iterator 对象;
生成器创建方式:(1)只要把一个列表生成式的 [ ] 改成 ( );(2)保存的自定义的算法 yield;
生成器的第一种方式, 保存的是算法,可以通过循环,每次获取下一个值;
生成器的第二种方式, 保存的自定义的算法,在函数中,如果有yield关键字,第一次函数之 后,返回的就是生成器对象,以后通过for,next获取候,代码到yield会生成器的下一个值的时阻塞,将yield后的值返回;

可迭代的类型:列表,字典,字符串,range。
比如你的计算机内存是10G,现在有一个列表6个G的数据,还有一个列表5个G的数据,还有一个100个G的数据,可以将他们变成迭代器,减少占用的内存。
凡是可作用于 for 循环的对象都是 Iterable 类型;
凡是可作用于 next() 函数的对象都是 Iterator 类型
集合数据类型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不过可以通过 iter() 函数获得一个 Iterator 对象。
目的是在使用集合的时候,减少占用的内存
装饰器的最终写法

def outer(func):
    # 写一些逻辑代码
    def inner(*args,**kwargs):
        # 写一些逻辑代码
        ret = func(*args, **kwargs)
        # 写一些逻辑代码
        return ret
    return inner

15.算法排序,不在数据库里面咋排序
16.数据结构
17.多进程和多线程区别:
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

(1),简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
(2) 线程的划分尺度小于进程,使得多线程程序的并发性高。
(3)另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
(4)线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
(5)从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
18.ORM,全称(Object-Relationship-Mapping),对象关系映射百度百科
19.文件读写文件读写
20.session和cookies:
cookie数据存放在客户的浏览器上,session数据放在服务器上。
cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session。
session会在一定时间内保存在服务器上。当访问增多,会比较占用服务器的性能考虑到减轻服务器性能方面,应当使用COOKIE。
单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个 cookie。
建议:
将登陆信息等重要信息存放为SESSION
其他信息如果需要保留,可以放在COOKIE中
21.csrf是什么,xss是什么:介绍
22.悲观锁乐观锁
悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作
乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。
23.sql的优化
对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引;应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描;应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描;应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描;.in 和 not in 也要慎用,否则会导致全表扫描;
24.左连接,右连接,全连接的关系
左连接, 左边的表不加限制,返回包括左表中的所有记录和右表中联结字段相等的记录右连接),右边的表不加限制,返回包括右表中的所有记录和左表中联结字段相等的记录全连接,左右两边的表都不加限制,只返回两个表中联结字段相等的行
介绍
25.reset和checkout的区别
git reset – files 用来撤销最后一次git add files,你也可以用git reset 撤销所有暂存区域文件。
git checkout – files 把文件从暂存区域复制到工作目录,用来丢弃本地修改。
链接
26.为什么用mvt:
解耦降低各功能模块之间的耦合性,方便变更,更容易重构代码,最大程度上实现代码的重用
链接
27.http和HTTPS之间的关系
https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
28.深浅拷贝的理解链接
29.事务添加链接描述
30.ajax介绍
31.Django中的ORM介绍
32.TCP和UDP的区别和优缺点链接
33.(1)Django中间件:
-process_request
-process_view
-process_response
-process_exception
-process_render_template
(2)使用中间件做过什么?
-权限
-用户登录验证
-Django的csrf是如何实现?
process_view方法
-检查视图是否被@csrf_exempt(免除csrf认证)
-去请求体或cookie中获取token
34.面试:谈谈自己对restful api规范的认识介绍
35.装饰器(修饰器)作用?
先来个形象比方

扫描二维码关注公众号,回复: 5332049 查看本文章

内裤可以用来遮羞,但是到了冬天它没法为我们防风御寒,聪明的人们发明了长裤,有了长裤后宝宝再也不冷了,装饰器就像我们这里说的长裤,在不影响内裤作用的前提下,给我们的身子提供了保暖的功效。

再回到我们的主题

装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
36.闭包:
(1)函数内部再定义函数
(2)内部函数引用了外部函数的局部变量
(3)外部函数的返回值是内部函数的名字
作用:闭包也具有提高代码可复用性的作用,减少了代码的可移植性。
和装饰器的区别:解释1解释2
37.内连接、外连接(左连接、右连接 、全连接)、交叉连接:解释
38.索引的几种类型:唯一索引、非唯一索引、主键索引和聚集索引。解释
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。
39.多线程—线程的5种状态解释
40.*args wargs 神魔时候使用:
如果我们不确定要往函数中传入多少个参数,或者我们想往函数中以列表和元组的形式传参数时,那就使要用
args;
如果我们不知道要往函数中传入多少个关键词参数,或者想传入字典的值作为关键词参数时,那就要使用**kwargs。
解释
41.
最新大公司面试问题:
一,软通面试:(在休闲茶座旁进行聊天式的面试)
1、自我介绍
2、讲最新的这个项目的业务逻辑。(送给大家一个干货,一个java朋友帮我写的一个通用业务逻辑模板,大家可以根据自己的业务进行参照修改)在这里插入图片描述
3、线程,进程,多进程,多线程资料
4、数据库优化资料

  1. 优化索引、SQL 语句、分析慢查询;
  2. 设计表的时候严格根据数据库的设计范式来设计数据库;
  3. 使用缓存,把经常访问到的数据而且不需要经常变化的数据放在缓存中,能节约磁盘IO;
  4. 优化硬件;采用SSD,使用磁盘队列技术(RAID0,RAID1,RDID5)等;
  5. 采用MySQL 内部自带的表分区技术,把数据分层不同的文件,能够提高磁盘的读取效率;
  6. 垂直分表;把一些不经常读的数据放在一张表里,节约磁盘I/O;
  7. 主从分离读写;采用主从复制把数据库的读操作和写入操作分离开来;
  8. 分库分表分机器(数据量特别大),主要的的原理就是数据路由;
  9. 选择合适的表引擎,参数上的优化;
  10. 进行架构级别的缓存,静态化和分布式;
  11. 不采用全文索引;
  12. 采用更快的存储方式,例如 NoSQL存储经常访问的数据

5、Django和Flask区别资料
6、面试官现场出了一个业务逻辑题,就是什么邮件发过去发过来,怎么实现的,我没听懂问题.我就随便说了下索引原理,通过这样来查询
7、和他聊天,聊了一些新鲜的事情
8、另一个哥们面试,面试官问了他列表,字符串这些简单的操作(比如:append关键字等等这些),但没问我

二,华为面试:(在大厅沙发上聊的。面试官说这不是面试,就一场单纯的交流探讨,,,他会追问,答不上来的时候,他会引导我,让我思考出答案,实在答不出来时,他就会补充)
1、map和reduce资料1 资料2
2、MongoDB是什么类型的数据库,有什么好处
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB
是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。资料2
3、selenium有哪些解析方式资料
4、线程,进程.多线程 以及python是如何实现的 资料
5、接触过哪些设计模式 以及如何实现的
单例设计模式,工厂设计模式
6、进程间的通信:进程间通信就是在不同进程之间传播或交换信息。常见的有:队列,同步(互斥锁、条件变量等)百度百科 用法
7、socket:socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:
它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的
例如我们每天浏览网页、QQ 聊天、收发 email 等等
8、python是一门什么语言:Python是一门动态解释型的强类型定义语言。详细解释
9、鸭子类型 及实现的几种方式:
“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”
我们并不关心对象是什么类型,到底是不是鸭子,只关心行为。
比如在python中,有很多file-like的东西,比如StringIO,GzipFile,socket。它们有很多相同的方法,我们把它们当作文件使用。
又比如list.extend()方法中,我们并不关心它的参数是不是list,只要它是可迭代的,所以它的参数可以是list/tuple/dict/字符串/生成器等.
鸭子类型在动态语言中经常使用,非常灵活,使得python不想java那样专门去弄一大堆的设计模式。

10、学生表和课程表是什么关系,以及实现代码:
多对多,
11、Bootstrap构建页面结构 (答:栅格化布局,实现响应式) → 什么叫响应式
12、七牛云作为CDN加速服务器,为什么能减少服务器流量压力 (面试官的回答:可以对图片进行压缩)
13、我简历中写了Celery,所以他问了我Celery
分布式任务队列,Celery 是一个简单、灵活且可靠的,处理大量消息的分布式系统,并且提供维护这样一个系统的必需工具。
它是一个专注于实时处理的任务队列,同时也支持任务调度。
三,项目技术面试
1.Django,flask优点和缺点?
django 使用ORM的优缺点?解释1 解释2
Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构、以及全功能的管理后台。
Django内置的ORM跟框架内的其他模块耦合程度高。
应用程序必须使用Django内置的ORM,否则就不能享受到框架内提供的种种基于其ORM 的便利;理论上可以切换掉其ORM模块,但这就相当于要把装修完毕的房子拆除重新装修,倒不如一开始就去毛胚房做全新的装修。
Django的卖点是超高的开发效率,其性能扩展有限;采用Django的项目,在流量达到一定规模后,都需要对其进行重构,才能满足性能的要求。
Django适用的是中小型的网站,或者是作为大型网站快速实现产品雏形的工具。
Django模板的设计哲学是彻底的将代码、样式分离;Django从根本上杜绝在模板中进
行编码、处理数据的可能。
2.装饰器request.post()用法,把post换成get会返回什么结果:报405错误。全部状态码
一般查询服务的时候用get,向后台提交数据时用post,如注册等等。这个说白了就是http里面get和post的差别了,post安全点,提交的数据多点,数据是放在http头信息里面的,get的参数是在URL后面的。
3.rest解决跨域问题介绍

子域名方式(需要解决跨域问题):
    www.lala.com
    api.lala.com
URL方式:(这样就解决了跨域问题)
  www.lala.com
  www.lala.com/api/

4.项目请求流程?
(客户端—>服务器)—>wsgi—>中间件中间件介绍—>视图view—>模型model—>数据库—>模型model—>视图view—>模板template—>视图view—>客户端
在这里插入图片描述
5.介绍queryset 并解释它的惰性查询?解释
QuerySet 可以被构造,过滤,切片,做为参数传递,这些行为都不会对数据库进行操作。只要你查询的时候才真正的操作数据库。
6.分布式部署 加密方式
7.支付宝返回哪些参数,上传哪些参数
8.购物车模块,订单模块是怎样设计的
9.缓存雪崩,缓存击穿,缓存穿透:介绍
四,项目技术

1.使用FastDFS存储图片实现分布式存储,修改了django的默认文件存储系统。
服务端两个角色:
Tracker:管理集群,tracker 也可以实现集群。每个 tracker 节点地位平等。收集 Storage 集群的状态。
Storage:实际保存文件 Storage 分为多个组,每个组之间保存的文件是不同的。每 个组内部可以有多个成员,组成员内部保存的内容是一样的,组成员的地位是一致的,没有 主从的概念。
文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。
Tracker,storage通过nginx服务器传输
Nginx负责分发请求

FastDFS解决:
(1)文件海量存储
(2)文件重复

与nginx整合:(负载均衡)知识提高静态文件的访问效率
2.使用celery异步框架进行异步发送邮件用来激活用户登录信息操作的实现
分布式任务队列,Celery 是一个简单、灵活且可靠的,处理大量消息的分布式系统,并且提供维护这样一个系统的必需工具。
它是一个专注于实时处理的任务队列,同时也支持任务调度。
调用 delay()方法 进行异步发送邮件

3.使用静态化页面技术提高用户体验,主要运用在首页。
过程:拷贝到第二个机器,运行celery,在第二个机器部署nginx,
在这里插入图片描述
4.使用使用缓存技术提高用户体验,主要运用在首页。
在这里插入图片描述
Redis(优点:支持内存级的读写,又支持持久化的硬盘,还支持分布式)
在这里用到:支持内存级的读写
可以将cache存到redis中:
cache.set(‘cache_index’, context, 3600)设置缓存
cache.get(‘cache_index’)获取缓存如果获取不到,查询数据库,获取到访问Redis数据库得到数据,从而提高用户体验。
5.使用haystack全文检索框架来搜索商品。
先分词,在建立索引
在这里插入图片描述
在这里插入图片描述
6.使用django事物以及乐观锁或悲观锁实现订单生成逻辑。(下订单)
如果访问过大,并发问题。同一个时间间隔,a先抢到线程,先执行;b后抢到因为库存判断过了 b会以为还有库存,也正常下单;这就麻烦了。
并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。
解决:,事务,悲观锁,乐观锁
悲观锁:a查询的时候上锁,当b查询的时候,有库存执行,没库存回滚,阻塞。这就达到了我们想要的效果。
在这里插入图片描述
7.添加购物车模块
异步请求点击事件,post请求携带商品id,商品数量,csrf
params = {‘sku_id’:sku_id,‘count’:count,‘csrfmiddlewaretoken’: csrf}
然后连接Redis数据库,
判断
conn=settings.REDIS_CONN
cart_key=‘cart_%d’%user.id
#先尝试获取sku_id的值 -> hget cart_key 属性
#如果sku_id在hash中不存在,hget返回None
cart_count=conn.hget(cart_key,sku_id)
然后更新
conn.hset(cart_key,sku_id,count)

猜你喜欢

转载自blog.csdn.net/qq_34663267/article/details/84146616