📚面试题 2 (52题)

1、Python3大主流框架的区别

1.Django : 大而全,自带的组件功能特别多非常方便, 但有时候会显的笨重
2.Flask : 小而精, 几行代码就可以开启一个服务, 自带的组件非常少, 但有非常多的第三方库,加起来可以超过Django,但太过于依赖第三方开发者
3.tornado : 功能组件都是自己写的, 异步非阻塞, 快到可以用作游戏服务器

2、安装Django的注意事项

计算机名不能不能有中文
项目名和应用名尽量不要有中文
使用pycharm创建项目的时候最好一个窗口只开启一个项目
python解释器版本最好使用3.4~3.6之间,其他的版本会有一些小问题需要解决
Django版本一般选择2.2-LTS 长期稳定版本

3、HTTP协议的4大特性

基于TCP/IP作用于应用层之上
基于请求响应 : 客户端的请求, 服务端对客户端的响应
无状态:不保存用户状态信息--->后面出来的技术 : cookie,session,token来保存用户状态
短(无)连接 : 请求一次则响应一次,之后没有联系---->后面出来的技术 : websocket实现长链接,双方建立连接后默认不断开(QQ,微信)

4、使用命令行来创建一个Django项目,并启动

django-admin startproject [项目名]
cd [项目目录下]
python3 manage.py runserver [ip]:[port]

app创建:
python3 manage.py startapp [app名]

5、命令行模式创建项目与PyCharm创建项目的区别是什么?

1.templates文件配置的不同:
    命令行创建项目不会自动生成 templates 文件夹, 并且需要到setting中手动去配置该文件夹的路径
    pycharm创建项目它会自动帮你创建 templates 文件夹, 并且自动帮你配置该文件夹的路径
2.创建app时的不同
    命令行创建app需要手动去setting文件中去注册app
    pycharm在与项目一起创建的app,它会自动帮你注册, 之后的创建也需要手动注册

6、什么是Django ORM,数据库迁移命令以及反向迁移命令?

ORM : 对象关系映射,让不会SQL语句而会Python基础语法的人也能操作数据库
    类---表, 对象---数据行, 属性---字段
数据库迁移命令 : 
    Python3 manage.py makemigrations
    python3 manage.py migrate
数据库反向迁移命令 : 
    1.python3 manage.py inspactdb, 之后会出现同不好的模型类,直接复制粘贴到models文件中
    2.直接重定向到models文件中 : Python3 manage.py inspactdb > app文件夹/models.py(因为执行的manage.py文件开始的)
    3.Python manage.py inspactdb ([表名]) > app名/models.py, 括号内不写代表所有表, 写了代表某张表
    
最后在进行数据库迁移命令

7、在建立模型类的时候有什么注意事项?

必须继承models.Model类
类名首字母大写
主键id字段不创建,默认会帮你创建,自增长
在数据库中生成的表名是 : [app名]_[类名小写]
设置的外键字段在表中会自动加上 "_id"

8、如何判定表关系?

需要分别站在两张表的位置进行考虑
一对一 : 左表A字段唯一对应右表的一个字段,右表该字段也是唯一对应左表的A字段(比如用户表和用户详情表)
一对多 : 左表的一条记录可以对应右表的多条记录,右表的一条记录不能对应左表的多条记录,只能对应其中一条(比如一个部门可以对应多个员工)
多对多 : 从左表来看,一条记录可以对用右表中的多条记录;从右表来看,一条记录也可以对上左表中的多条记录,也就是双向的一对一(比如书籍表和作者表)

9、在Django的ORM中如何建立三种表关系?

使用外键字段
一对一 : OneToOneField
一对多 : ForeignKey
多对多 : ManyToMany

10、如何自定义表名?

在模型类总书写元信息, 并指定 db_table 字段
class Mate:
    db_table="[新表名]"

11、解释一下无名分组与有名分组?

1.无名分组 : 
    就是将正则表达式前后加一个小括号, 它会将括号内正则表达式匹配到的内容当做位置参数传递给后边的视图函数
2.有名分组 : 
    就是将正则表达式中加括号匹配到的内容定义一个名字, 它会将括号内匹配到的内容当做关键字参数传递给后面的视图函数

12、什么是反向解析?

1. 什么是 :
    就是通过一些方法得到一个结果, 该结果可以直接访问对应的路由,并触发视图函数的执行
2.作用 : 
    比如我们开发一个Django项目, 需要将路由嵌入到HTML页面或其他地方, 如果我们的路由经常的变化,直接写死路由可扩展性差,并且还会才产生过期的路由, 那么使用反向解析就给路由起一个别名,可以做到动态的解析路由

13、什么是路由分发?

我们的说Django是一个专注于应用开发的web框架, 当一个的django项目特别庞大的时候, 如果将所有的url都放进同一个主路由文件中, 这样就太过冗余且不便于管理
那么我们可以在每个应用下都创建一个路由文件,各自写他们自己的路由与视图的对应关系,最后使用路由分发功能去将所有的应用关联到一起
路由分发他就是让主路由文件不再去干路由与视图对应关系的活,只存放路由与对应应用的关系,然后将识别的url分发给对应的应用去处理
并且路由重名也不要紧,因为有app名作为前缀
导入的函数 : include

14、介绍一下Django 1.X 与 Django 2.X 版本之间的区别?

1.x 中路由匹配方法 : url()
    第一个参数是正则匹配
2.x 中路由匹配方法 : path()
    第一个参数不是正则,它里面些什么就匹配什么
    如要使用正则, 则需导入 re_path 方法
1.x 中模型类的对应关系中 OneToOneField字段默认有 on_delete 参数
2.x 中需要自己手动书写

15、介绍一下5种常用的转换器?

str : 匹配除了路径分隔符(/)的非空字符串
int : 匹配正整数,包含0
uuid : 匹配 UUID 格式的字符串
slug : 匹配数字,字母,下划线,以及横杠的字符串
path : 匹配任意的非空字符串,包括路径分隔符(不能使用?号)

16、大致介绍一下Django请求生命周期流程

浏览器---->web服务网关接口---->(真正的django框架)中间件---->路由层(路由匹配,路由分发)---->视图层(视图函数执行)---->模板层(html文件,模板语法)---->视图层(模板渲染)---->模型层---->db(拿数据)---->模型层---->视图层(参与模板渲染)---->路由层---->中间件---->web网关服务接口---->浏览器

17、如何安装指定版本的Django?

pip3 install django==2.2.2

18、如何配置静态文件?

在settings.py文件中书写 : 
STATICFILES_DIR = [
    os.path.join(BASE_DIR,'[static文件夹名]')
]

19、Django默认的数据库是什么?

sqlite

20、Django配置使用mysql数据库?

在settings.py文件中的 DATABASES 的默认数据库进行修改 : 
    'ENGINE': 'django.db.backends.mysql',
    'HOST' : '[ip]',
    'PORT' : 3306,
    'DB' : 'db111',  # 必须是一个已经存在的库
    'USER' : '[用户名]',
    'PASSWORD' : '[密码]',
    'CHARSET' : 'utf8',  # 字符集

21、什么是虚拟环境?

虚拟环境就是一个纯净的Python解释器, 相当于是对Python解释器的一个复制, 里面只有pip和setuptools工具
应用场景 : 
    就是我们在开发的时候,不同的项目需要使用不同的组件或者功能, 那么我们就可以使用虚拟环境,用什么就装什么,不用的一概不装

22、如何导出项目中使用的所有依赖包

pip3 freeze > requirements.txt  # 后面的文件名可以自定义

23、如何一键安装项目中使用到的所有依赖包?

pip3 install -r requirement.txt

24、什么是FBV?什么是CBV?

FBV : 基于函数的视图
CBV : 基于类的视图

25、CBV源码剖析?

突破口 : as_viwe()
它是一个类方法,类调用传入自身,该方法内有一个view函数,并返回view的内存地址,也就是一个闭包函数
再看view函数,内部self=cls(),也就是类实例化得到对象(我们自己的类的对象),后面返回self.dispatch()
self中没有dispatch方法--->类中没有--->父类View中找到:该方法内部逻辑 : 
判断请求方法的小写是不是在一个列表里面, 列表中有八种常用请求方法,假设我们请求是get,在里面,符合,那么就执行getattr方法,获取self对象里的get方法,很明显self里面有这个方法, 于是拿到该方法的内存地址,赋值给handle,最后返回self.handle(),其实就是触发了self里面的get方法

26、什么是F()查询?什么是Q()查询?

F查询 : 可以将字段的值取出来进行比较
Q查询 : 构建或|,与&,非~, filter中的多个条件默认是and连接

27、互联网中最常见的两种开发架构?

C/S架构
B/S架构,本质还是C/S架构

28、什么是URL?

统一资源定位符 : 
协议 : http,https,ftp
用户名和密码(可选参数)
ip
port(可选)默认80
path : 访问的资源路径
参数(可选)
锚(可选)

29、两种常见的请求方式?

post
get

30、在进行模版语法传值的时候,如果需要传递多个变量的时候,我们可以使用什么来进行一键传递?

locals()

31、介绍一下什么是闭包函数?

定义在函数内部的函数
内部函数对外部函数作用域有引用

32、介绍一下深浅拷贝的区别?

比方说一个列表套列表
浅拷贝 : 将第一层列表里的元素不进行可变和不可变类型的区分直接复制成一个新的列表,
    新列表元素的内存地址指向的源列表元素内存地址,但如果修改子列表内的元素会影响源列表数据
深拷贝 : import copy, copy.deepcopy(list)
    将列表里的元素区分可变不可变类型进行复制,相当于递归的浅拷贝,源列表与新列表编程完全隔离的列表,互不影响

33、介绍一下什么是触发器、存储过程、视图?

触发器 : 在对一个数据增删改前后设置一些操作,满足条件后就会自动触发这些操作执行,没有查操作
存储过程 : 类似于Python中的自定义函数,里面放一堆的SQL语句,调用存储过程名则执行里面的语句
视图 : 通过sqly语句查询出来的一张虚拟表,把他做成视图,下次使用就不在需要繁琐的SQL语句,视图只有数据结构,真实的数据还是原来的表

33、什么是事务?

事务就是一条或多条SQL语句组成的逻辑单元,让我们在一系列操作中因为某些操作失败,而导致数据的不正确性提供了回滚的功能(回到原来的状态)

34、事务的四大特性?

a原子性 : 事务不可再分,要么全部执行成功, 要么一个都无法执行成功
c一致性 : 事务从一个一致性状态, 变成另一个一致性状态,与原子性密不可分
i隔离性 : 多个事务的执行互不干扰, 任意一个事务的内部操作对其他并发的事务, 都是隔离的
d持久性 : 指事务一旦提交, 对数据的任何改变都记录到永久存储器中, 通常是物理硬盘

35、如何取消URL自动加斜线结尾?

在settings.py文件中添加参数 : APPEND_SLASH = False

36、模版语法传值的时候需要注意什么?

可以支持Python的基本数据类型
在传函数及类的时候会自动加括号调用
传函数时不支持额外的传参

37、介绍一下装饰器原理?

装饰器就是一个为其他函数添加新功能的函数
基于闭包函数实现的,外部函数传入参数func,内部函数传入参数*srgs,**kwargs
内部函数返回func执行后的返回值,外部函数返回内部函数的内存地址

38、任务的三种运行状态以及提交的两种方式?

阻塞态,运行态,就绪态
同步 : 发送端等待接收端响应才进行下一个任务
异步 : 发送端不等待接收端响应,只通知一下就直接进行下一个任务,并发提升

39、介绍一下ARP协议?

同一子网内发包给所有端口: 源ip,目标ip,源mac,ff:ff:ff:ff:ff:ff, 对方收到返回mac
不同子网,直接 源ip,网关ip,源mac,ff:ff:ff:ff:ff:ff,网关返回mac,再发包 源ip,目标ip,源mac,网关mac,网关在转发给路由一层层往外

40、介绍一下最左匹配原则?

使用联合索引时需符合最左前缀匹配原则,where条件中存在联合索引中最左边的字段则说明命中了联合索引

41、在Python中实现多任务的3种方式?并介绍如何开启进程、线程、协程?

多进程,多线程,协程
多进程 :
    from multiprocessing import Process
    def test():  # 需要运行的函数
        ....
    if __name__ = '__main__':
        p1 = Process(target=test,args=(,))
        p1.start()
多线程 :
    from threading import Thread
    def test():  # 需要运行的函数
        ....
    if __name__ = '__main__':
        p1 = Thread(target=test,args=(,))
        p1.start()   
协程 : 
    1.yeild 关键字来模拟
    2.geven模块
        import gevent
        def test():
            ....
        def test2():
            ....
        g1 = gevent.spawn(test1,[参数])
        g2 = gevent.spawn(test2,[参数])

42、什么是反射?以及反射相关的4个内置函数?

使用字符串的形式来操作对象的属性和方法
getattr(self,key)
setattr(self,key,value)
hasattr(self,key)
delattr(self,key)

43、什么是lambda函数并说明其使用场景?

匿名函数,没有名字的函数
只使用一次,之后不再使用
配合使用 : max(),min(),sorted(),map(),reduce(),filter(),

44、__new__()__init__()的区别?

__new__(): 先触发,产生一个空对象
__init__():后触发,对空对象进行初始化

45、QuerySet的两大特性?

惰性查询 : 像我们使用模型类查询得到QuerySet查询集,它并没有进行实际的查询,只有真正使用的时候才会到数据库中去查询(比如 for 循环遍历QuerySet的时候)
缓存 : 当进行数据库实际查询的时候,会将结果保存起来,下次使用直接调用缓存,而不再进行数据库查询

46、在遍历一个可迭代对象的时候我们如何顺便打印索引?

enumerate(list)

47、请问你熟悉with语句嘛?介绍一下其实现原理。

上下文管理器,内置有 __enter__ 和 __exit__ 方法
想让一个对象能支持with就必须在该对象内重写这两种方法
__enter__ : with 一个对象的时候触发
__exit__ : 脱离with代码块与其同等级书写代码的时候触发
一般用于对文件,网络连接等自动关闭

48、例举几个PEP8规范

1.函数,类定义上下空两行
2.函数参数逗号后空一格
3.注释在代码上方#号空格再写,在后方先空两个#号空格再写(错误的注释不如没有)
4.变量名尽量见名知意,字母数字下划线,驼峰体,不能数字开头,不能关键字命名
5.赋值符号左右空一格
6.一行代码字符不超过80个,url例外
7.函数不超过30行,类不超过200行,py文件不超过500行
......

49、例举几个魔法方法?

init初始化,new生成空对象,
enter(with对象触发),exit(脱离with触发),
str打印对象时返回值,repr命令行打印对象的时候触发, (先触发str,没有str再触发repr)
format使用format()字符串格式化时出阿发,
getattr点取值,delattr点删值,setattr点设置值(点拦截方法,
call元类方法,
getitem中括号取值没找到触发,setitem中括号设置值,delitem中括号删值,
getattribute,点取值无论找没找到都触发
del析构方法,
doc注释文档,
get,set,delete(描述符),
all,限制模块内功能的使用,针对"*",__all__=[功能,...]列表内指定的别人才能用
module查看所属模块,
class查看所属类,
dict查看属性字典,slots限制类中只能有某些属性和方法__slots__=(属性1,属性2)
iter可迭代对象执行得到迭代器对象,next迭代器对象执行取出一个值,
len使用len()函数的时候触发,
hash,hash(对象) 的时候触发
eq,两个对象 '==' 比较的时候触发

50、猴子补丁内部实现原理?

用我们自己的代码对模块中正在运行的属性进行动态的替换

51、cookie、session、token的区别?

cookie 数据保存在客户端浏览器,不安全
session 数据保存在服务端,给客户端一串随机码,安全,但服务器压力大
token 数据分为三段式,使用 jwt 认证方式,第一段一些公司会其他信息,第二段应户名密码等信息,第三段是使用后端开发者自定义的加密方式对前两段数据进行加密后的结果,
保存在客户端浏览器,下次登入将这三段内容提交到服务器, 服务器只要使用他们自己的加密方式再对前两段数据进行加密,与第三段数据进行比对

52、什么是CGI、FASTCGI、WSGI、uwsgi、uWSGI?

CGI : 通用网关接口
fastCGI : 快速通用网关接口,是CGI的升级版
WSGI : Web服务器网关接口,是一种协议
uWSGI : 一个Web服务器, 实现了uwsgi,WSGI,http等协议
uwsgi : uWSGI独有的一个协议
wsgiref : Python中的一个模块,相当于一个web服务器,遵循 wsgi 协议
posted @ 2021-04-17 13:25  给你骨质唱疏松  阅读(94)  评论(0编辑  收藏  举报