一.项目技术点梳理

(一)Django项目

本项目是用python的Django框架开发的前后端不分离项目。项目采用MVT架构,使用的MySQL和redis数据库,用Django自带的orm与数据库交互。

1、用户模块

a.使用Django自带的用户认证系统,来完成用户登录,密码使用pbkdf2_sha256加密存入mysql数据库。

b.使用itsinstance模块对user_id进行加密生成token,将生成的token放在url通过邮件发送给用户来实现激活逻辑。

c.使用celery+redis实现异步发送邮件,redis用来存储任务队列(broker);redis可以替换为rabbitMQ;也可以改为短信验证,也可以使用celery异步实现。

2、商品模块

a.使用FastDFS+nginx来实现静态文件的管理。FastDFS负责写入,nginx负责读取。FastDFS实现了去除冗余,负载均衡的功能。

b.异步实现主页页面静态化。监听admin后台管理,当数据库数据发生变化时,使用celery异步生成主页的静态文件。实现未登录用户访问的是静态页面,登录用户访问的是动态页面,达到优化网站的目的。

c.避免不停的连接mysql,使用redis做了一层缓存。

d.使用whoosh作为全文搜索引擎,haystack作为全文检索的框架,jieba作为中文分词包来实现的全局搜索功能。

3、购物车模块

a.购物车模块使用前后端分离技术实现,使用json传输数据。

b.未登录用户的数据存放cookie中,已经登录用户的数据存放在session,用户登录后合并cookie和session,注意合并前判断库存

4、订单模块

a.Django事务的使用,在增删改数据库是出错了要对数据库进行回滚。

b.悲观锁和乐观锁的使用。悲观锁:当要操作某条记录时,立即将该条记录锁起来,谁也无法操作,直到它操作完。乐观锁:在查询数据的时候不加锁,在更新时进行判断,判断更新时的库存和之前,查出的库存是否一致。

c.使用支付宝api实现的付款。(芝麻信用的实名认证api也可以提,在用户实名认证那个模块中)

5、项目部署

使用uWSGI+nginx实现动静分离负载均衡。

(二)Flask项目(flask项目更侧重于业务)

本项目是使用flask框架开发的,前后端分离项目。项目主要使用flask框架,flask_sqlalchemy作为orm,mysql和redis数据库等技术。

1、登录注册

后端生成图片验证码加容联云(阿里云)短信认证实现用户注册。用户登录后将用户信息存到session中来保持用户的登录状态,登录登出都是通过session来实现的。

2、个人中心

a.使用七牛云(阿里云)文件对象存储系统来存储用户上传的静态文件。

b.使用芝麻信用实名认证接口来实现的用户实名认证。

3、商品展示模块

业务逻辑处理,根据项目具体情况来说。这里可以重点说说业务满足了哪些需求。

4、订单模块

a.业务上:生成订单、接单、拒单、评论的实现

b.redis事务的使用

import redis
import sys
if __name__=="__main__":
try:
conn=redis.StrictRedis('192.168.80.41')
pipe=conn.pipeline()
pipe.sadd('s001','a')
sys.exit()
#在事务还没有提交前退出,所以事务不会被执行。
pipe.sadd('s001','b')
pipe.execute()
except Exception as err:
print(err)

二.面试中高频考点

(三)进程、线程、协程

(四)Mysql与MongoDB类比记忆

(五)mysql连接池

数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。

创建数据库连接是一个很耗时的操作,也容易对数据库造成安全隐患。所以,在程序初始化的时候,集中创建多个数据库连接,并把他们集中管理,供程序使用,可以保证较快的数据库读写速度,还更加安全可靠。

假设网站一天有很大的访问量,数据库服务器就需要为每次连接创建一次数据库连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、拓机。

数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现的尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池正式针对这个问题提出来的.数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。

(六)数据库优化

1.优化索引、SQL 语句、分析慢查询;

2.设计表的时候严格根据数据库的设计范式来设计数据库;

3.使用缓存,把经常访问到的数据而且不需要经常变化的数据放在缓存中,能节约磁盘IO

4.优化硬件;采用SSD,使用磁盘队列技术(RAID0,RAID1,RDID5)等

5.采用MySQL 内部自带的表分区技术,把数据分层不同的文件,能够提高磁盘的读取效率;

6.垂直分表;把一些不经常读的数据放在一张表里,节约磁盘I/O;

7.主从分离读写;采用主从复制把数据库的读操作和写入操作分离开来;

8.分库分表分机器(数据量特别大),主要的的原理就是数据路由;

9.选择合适的表引擎,参数上的优化

10.进行架构级别的缓存,静态化和分布式;

11.不采用全文索引;

12.采用更快的存储方式,例如 NoSQL存储经常访问的数据。

(七)Mysql查询优化

1、储存引擎选择:如果数据表需要事务处理,应该考虑使用InnoDB,因为它完全符合ACID特性。如果不需要事务处理,使用默认存储引擎MyISAM是比较明智的

2、分表分库,主从。

3、对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引

4、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描

5、应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描

6、应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描

7、Update 语句,如果只更改1、2个字段,不要Update全部字段,否则频繁调用会引起明显的性能消耗,同时带来大量日志

8、对于多张大数据量(这里几百条就算大了)的表JOIN,要先分页再JOIN,否则逻辑读会很高,性能很差

(八)http/https

HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。

HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。

(九)restful风格

1. 将api部署在专用域名下

2. 将API的版本号放在url中

3. 路径表示API的具体网址。每个网址代表一种资源。 资源作为网址,网址中不能有动词只能有名词,一般名词要与数据库的表名对应。而且名词要使用复数。

4. 对于资源的具体操作类型,由HTTP动词表示。 常用的HTTP动词有四个。(get、post、put、delete)

5. 如果资源数据较多,服务器不能将所有数据一次全部返回给客户端。API应该提供参数,过滤返回结果。

6. 服务器向用户返回常用http标准状态码。

7. 服务器返回的错误信息,以键值对的形式返回。

8. 响应结果

返回商品列表GET    http://www.example.com/goods

返回单个商品GET    http://www.example.com/goods/cup

返回新生成的商品POST   http://www.example.com/goods

返回一个空文档 DELETE http://www.example.com/goods

9. 在返回响应结果时提供链接其他API的方法,使客户端很方便的获取相关联的信息。

10.服务器返回的数据格式,应该尽量使用JSON,避免使用XML。

python面试题(三)的更多相关文章

  1. python面试题三:Python 网络编程与并发

    1 简述 OSI 七层协议. OSI七层协议模型主要是: 应用层(Application):为用户的应用程序(例如电子邮件.文件传输和终端仿真)提供网络服务. 表示层(Presentation):使用 ...

  2. 19.python基础试题(三)

    转载: 老男孩 Python 基础知识练习(三):https://www.cnblogs.com/nulige/p/6128674.html 1.列举布尔值为 False 的值空,None,0, Fa ...

  3. python公司面试题集锦 python面试题大全

    问题一:以下的代码的输出将是什么? 说出你的答案并解释. class Parent(object): x = 1 class Child1(Parent): pass class Child2(Par ...

  4. 【Python】【面试必看】Python笔试题

    前言 现在面试测试岗位,一般会要求熟悉一门语言(python/java),为了考验求职者的基本功,一般会出 2 个笔试题,这些题目一般不难,主要考察基本功.要是给你一台电脑,在编辑器里面边写边调试,没 ...

  5. python 面试题4

    Python面试题 基础篇 分类: Python2014-08-08 13:15 2071人阅读 评论(0) 收藏 举报 最近,整理了一些python常见的面试题目,语言是一种工具,但是多角度的了解工 ...

  6. 一道Python面试题

    无意间,看到这么一道Python面试题:以下代码将输出什么? def testFun():    temp = [lambda x : i*x for i in range(4)]    return ...

  7. 很全的 Python 面试题

    很全的 Python 面试题 Python语言特性 1 Python的函数参数传递 看两个例子:           Python   1 2 3 4 5 a = 1 def fun(a):      ...

  8. 关于面试总结-python笔试题(递归)

    前言 本篇继续收集一些常见的python笔试题,以基础知识为主,递归是面试最喜欢考的一个问题,不管是做开发还是测试,都无法避免考递归.本篇结合实际案例,讲下几种关于递归的场景. 计算n的阶乘 计算n! ...

  9. 常见的 35 个 Python 面试题及答案

    1. Python 面试问题及答案 作为一个 Python 新手,你必须熟悉基础知识.在本文中我们将讨论一些 Python 面试的基础问题和高级问题以及答案,以帮助你完成面试.包括 Python 开发 ...

随机推荐

  1. .split("\n") 和 .strip("我是诗人的感叹")

    s10='''诗人 学者 作家 # 这里面是有换行     "\n"    的,    要想变成一行, 删除strip不行,要用 split分开,这样就能变成一个列表,里面是各个字 ...

  2. 第二次作业 APP分析

    第一部分 调研, 评测 1.下载软件并使用. 今天我要分析的软件app是UC浏览器这个软件,UC浏览器的用户群体还是挺多的,作为一款主流之一的浏览器APP,整体的用户体验还是很好的.简洁的界面还有中间 ...

  3. 如何运行vue项目(从gethub上download的开源项目)

    前提:入坑vue.js,从GitHub上download一个vue.js的开源项目,发现不知如何在浏览器运行,通过查阅网上教程,发现网上的很多是教你怎么新建项目,并没有一个是教如何打开已有的项目.自已 ...

  4. cocos2d-x(十一)Lua开发飞机大战-6-加入子弹

    接下来我们为飞机加入子弹,首先创建一个BulletLayer: module("BulletLayer",package.seeall) local bulletBatchNode ...

  5. 1068. [SCOI2007]压缩【区间DP】

    Description 给一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中的重复信息.压缩后的字符串除了小 写字母外还可以(但不必)包含大写字母R与M,其中M标记重复串的开始,R重复从上 ...

  6. 【洛谷】【treap/堆】P2073 送花

    [题目描述:] 这些花都很漂亮,每朵花有一个美丽值W,价格为C. 小明一开始有一个空的花束,他不断地向里面添加花.他有以下几种操作: 操作 含义 1 W C 添加一朵美丽值为W,价格为C的花. 3 小 ...

  7. P3623 [APIO2008]免费道路

    3624: [Apio2008]免费道路 Time Limit: 2 Sec Memory Limit: 128 MBSec Special Judge Submit: 2143 Solved: 88 ...

  8. Day12 Java异常处理与程序调试

    什么是异常? 不正常的,会影响程序的正常执行流程. 例如下面的程序 public static void main(String[] args) { TestDemo1 t = new TestDem ...

  9. docker 不同版本 添加--insecure-registry

    docker  17.0.3 vim /lib/systemd/system/docker.service 然后重启 systemctl  daemon-reload , systemctl rest ...

  10. 多线程之Thread类

    Java并发编程:Thread类的使用 在前面2篇文章分别讲到了线程和进程的由来.以及如何在Java中怎么创建线程和进程.今天我们来学习一下Thread类,在学习Thread类之前,先介绍与线程相关知 ...