Django Http Docker 面试问题整理

车牛皮糖

1,Django的生命周期

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

2,TCP/IP由四个层次组成:数据链路层、网络层、传输层、应用层。

数据链路层
这是TCP/IP软件的最低层,负责接收IP数据报并通过网络发送,或者从网络上接收物理帧,抽出IP数据报,交给IP层。
网络层
负责相邻计算机之间的通信。其功能包括三方面:
a、处理来自传输层的分组发送请求,收到请求后,将分组装入IP数据报,填充报头,选择去往信宿机的路径,然后将数据报发往适当的网络接口。
b、处理输入数据报:首先检查其合法性,然后进行寻径–假如该数据报已到达信宿机,则去掉报头,将剩下部分交给适当的传输协议;假如该数据报尚未到达信宿,则转发该数据报。
c、处理路径、流控、拥塞等问题。
传输层
提供应用程序间的通信。其功能包括:
a、格式化信息流;
b、提供可靠传输。为实现后者,传输层协议规定接收端必须发回确认,并且假如分组丢失,必须重新发送。
应用层
向用户提供一组常用的应用程序,比如电子邮件、文件传输访问、远程登录等。远程登录TELNET使用TELNET协议提供在网络其它主机上注册的接口。TELNET会话提供了基于字符的虚拟终端。文件传输访问FTP使用FTP协议来提供网络内机器间的文件拷贝功能。

3,使用orm和原生sql的优缺点,处理并发问题?

1.orm的开发速度快,操作简单。使开发更加对象化 #执行速度慢。处理多表联查等复杂操作时,ORM的语法会变得复杂
2.sql开发速度慢,执行速度快。性能强

4,Web开发中有哪些技术手段防止SQL注入?

1.使用预编译绑定变量的SQL语句
2.严格加密处理用户的机密信息
3.不要随意开启生产环境中Webserver的错误显示
4.使用正则表达式过滤传入的参数
5.字符串过滤
6.检查是否包函非法字符

5,谈谈CSRF原理

你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情
包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包
括:个人隐私泄露以及财产安全。
要完成一次CSRF攻击,受害者必须依次完成两个步骤:
1.登录受信任网站A,并在本地生成Cookie。
2.在不登出A的情况下,访问危险网站B。

6,如果用户投诉说网页加载很慢,并且不是网速问题,大概10秒钟左右才能显示出来。现在让你来定位这个问题,请用一个最直接的方法,快速的定位到问题出现的位置,不保证百分之百能定位到,但是你这个方法必须百分之80或者90能定位出现问题的位置。

7,docker和虚拟机

 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程。操作系统其磁盘占用至少几十G起步,内存要几个G起步。启动时要从头到尾把该检测的都检测了该加载的都加载上,这个过程非常缓慢。
 而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟,因此容器要比传统虚拟机更为轻便。每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。

8,docker容器之间怎么隔离

Linux中的PID、IPC、网络等资源是全局的,而NameSpace机制是一种资源隔离方案,在该机制下这些资源就不再是全局的了,而是属于某个特定的NameSpace,各个NameSpace下的资源互不干扰。
虽然有了NameSpace技术可以实现资源隔离,但进程还是可以不受控的访问系统资源,比如CPU、内存、磁盘、网络等,为了控制容器中进程对资源的访问,Docker采用control groups技术(也就是cgroup),有了cgroup就可以控制容器中进程对系统资源的消耗了,比如你可以限制某个容器使用内存的上限、可以在哪些CPU上运行等等。
有了这两项技术,容器看起来就真的像是独立的操作系统了。

9,Celery的架构和运行过程

消息中间件(message broker),任务执行单元(worker)和任务执行结果存储(task result store)组成。
1、客户端也就是python(django/flask等)发布任务
2、发布的任务存到任务队列里面,可以以redis、rabbitMQ、MessageQueue、MySQL存储,一般在django/flask程序里redis居多
3、任务处理者会不断从任务队列里面获取任务执行

10,redis基本数据类型

String字符串:
Hash(哈希)
List(列表)
Set(集合)
zset(sorted set:有序集合)

11,django常用中间件

缓存中间件
通用中间件
内容压缩中间件(GZip)
本地化中间件(Locale)
消息中间件(Message)于cookie或者会话的消息功能,比较常用。
安全中间件Security
CSRF protection
认证框架 Authentication

堆和栈的区别

   栈内存是存储方法帧和局部变量(基本类型的变量、对象的引用变量),方法调用完后会释放该栈及栈中变量。存取速度比堆要快,仅次于寄存器,栈数据可以共享,多个引用可以指向同一个地址,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
   堆内存用于存放由new创建的对象和数组,由JVM管理,由于要在运行时动态分配内存,存取速度较慢,
   栈中的变量指向堆内存中的变量,这就是 Java 中的指针

java里内存泄漏和溢出的区别
1、内存泄漏memory leak :是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。
2、内存溢出 out of memory :指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出。

迭代器Iterator的理解
Iterator提供了统一遍历操作集合元素的统一接口,Collection接口实现Iterator接口。每个集合都通过实现Iterator接口中的iterator()方法返回实例,然后对元素进行迭代操作,,但是在迭代元素的时候不能使用集合的方法删除元素,否则会抛出异常,可以使用Iterator接口中的remove()方法进行删除

Java面向对象的特征与含义。
封装、继承、抽象、多态
1、封装:封装的目的在于实现程序的“高内聚,低耦合”,防止程序相互依赖而带来的变动影响。封装是保证是把对同一事物进行操作的方法和相关的方法放在同一个类中,把方法
和他操作的数据放在同一个类中。
2、抽象:抽象就是找出事物的相似和共性,然后将这些事物归为同一类,这个类只考虑这些事物的相似和共性,忽略和当前主题不相关的因素。
3、继承:子类继承父类的内容作为自己的内容,可以加入新的内容或者是修改父类的内容而更加适合特殊的需要。提高了额程序的可重用性和可扩张性。
4、多态:多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类

静态变量和实例变量的区别
静态变量前要加上关键字static,实例变量则不会。
实例变量是属于某个对象的属性,必须创建了实例对象,其中的实例变量才会分配空间,才能使用这个实例变量。静态变量不属于任何的实例对象,而是属于类,也称为类变量,只
要程序加载了类的字节码,不用创建任何实例对象,就会被分配空间。总之就是,静态变量不需要创建任何的对象就可以直接使用,而实例变量需要先创建实例对象才能被使用。

MySQL 主键与索引的联系与区别
主键是为了标识数据库记录唯一性,不允许记录重复,且键值不能为空,主键也是一个特殊索引。
数据表中只允许有一个主键,但是可以有多个索引。
使用主键会数据库会自动创建主索引,也可以在非主键上创建索引,方便查询效率。

GC的基本原理
当程序员在创建对象时,GC就开始监控这个对象的地址、大小以及使用情况,GC采用有向图的方式记录和管理堆中的所有对象。通过这种方法来确定哪些对象是“可达的”,哪些是“不可达”的,当确定为“不可达”时,GC就有责任回收这些内存空间。垃圾回收器可以马上回收内存,程序员可以手动指定system.gc()方法,通知GC进行回收,但是java语言规范并不保证GC一定会执行

12,django uuid字段自增

阅读 121
1 声望
0 粉丝
0 条评论
你知道吗?

1 声望
0 粉丝
宣传栏