315道题——前端&框架&其他(1~80)
前端部分
1. 谈谈你对http协议的认识。
- /r/n分割 --- 数据结构
- 发送请求,得到相应就断开:无状态,短连接
2. 谈谈你对websocket协议的认识。
- 类似http协议
- 不断开,长连接
- 握手,连接前: 魔法字符传
3. 什么是magic string ?
- 魔法字符串
- 魔法字符串+随机字符串(Websocket-Key)----拼接
4. 如何创建响应式布局?
@media (min-width: 768px){ .pg-header{ background-color: green; } } @media (min-width: 992px){ .pg-header{ background-color: pink; } }
5. 你曾经使用过哪些前端框架?
Vue.js
6. 什么是ajax请求?并使用jQuery和XMLHttpRequest对象实现一个ajax请求。
ajax的全称是AsynchronousJavascript+XML。( 异步传输+js+xml ), 现在很多用json,代替xml
就是不关闭不转跳不刷新的情况下,在网页后台提交数据,部分更新页面内容,将网页的用户体验提升到接近原生程序的地步。
$.ajax({ url:'xxx', type:"GET", data:{}, success:function (data) {}, error:function () {} }) 1. 创建XMLHttpRequest对象; 2. 调用open()方法打开与服务器的连接; 3. 调用send()方法发送请求; 4. 为对象指定onreadystatechange事件函数,4个状态触发 function send() { var xmlHttp = createXMLHttpRequest(); xmlHttp.onreadystatechange = function() { if(xmlHttp.readyState == 4 && xmlHttp.status == 200) { } }; xmlHttp.open("POST", "/ajax_post/", true); //post: xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xmlHttp.send(null); //post: xmlHttp.send("b=B"); }
7. 如何在前端实现轮训?
定时器
8. 如何在前端实现长轮训?
写一个函数,发送ajax请求,通过调用本身,实现长轮巡
9. vuex的作用?
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储和管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。(组件的数据通
信和状态)
10. vue中的路由的拦截器的作用?
类似Django的中间件
比如很多网页需要登录验证,路由配置:
meta: { requireAuth: true // 需要登录访问的url设置成 true, 就会拦截验证 }
每个路由执行之前,都会执行一个函数:
router.beforeEach(function (to, from, next) {判断,验证/跳转}
11. axios的作用?
类似ajax
基于 Promise 的 HTTP 请求客户端,可同时在浏览器和 node.js 中使用
• 在浏览器中发送 XMLHttpRequests 请求
• 在 node.js 中发送 http请求
12. 列举vue的常见指令。
v-if
v-else
v-for
v-show
v-bind
v-on
<script>
import Child from './Child'
export default {
name: 'app',
data() {
return {
msg:['抽烟',"喝酒","烫头"]
}
},
computed:{
get_self_msg(){ # 1. 定义一个计算属性,返回自己的msg
return this.msg
}
},
components: { # 父子组件关联,挂载子组件
Child:Child
}
}
</script>
13. 简述jsonp及实现原理?
- jsonp是json用来跨域的一个东西。原理是通过script标签的跨域特性来绕过同源策略。
- 服务器返回一个函数(传参),函数调用,函数执行
14. 是什么cors ?
跨域资源共享(CORS,Cross-Origin Resource Sharing)
随着技术的发展,现在的浏览器可以主动支持设置从而允许跨域请求
其本质是设置响应头,使得浏览器允许跨域请求。
简单请求: head get post
复杂请求: 预检 OPTIONS
- “预检”其实做检查,检查如果通过则允许传输数据,检查不通过则不再发送真正想要发送的消息
- 如何“预检”
=> 如果复杂请求是PUT等请求,则服务端需要设置允许某请求,否则“预检”不通过
Access-Control-Request-Method
=> 如果复杂请求设置了请求头,则服务端需要设置允许某请求头,否则“预检”不通过
Access-Control-Request-Headers
预检缓存时间 Max-Age
15. 列举Http请求中常见的请求方式?
['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
16. 列举Http请求中的状态码?
- 200 成功
- 301 永久重定向
- 302 临时重定向
- 403 有授权,但禁止访问
- 404 找不到记录
- 500 服务器错误
17. 列举Http请求中常见的请求头?
- ContentType
- Referer
- User-Agent
18. 执行结果:
var name='武沛齐'; function func() { var name='李杰'; function inner() { alert(name) } return inner } var ret = func(); ret() # 李杰
19. 执行结果:
function main() { if(1==1){ var name='武沛齐' }; console.log(name) } main() # 武沛齐
20. 执行结果:
xo = 'Alex'; function func() { var xo='武沛齐'; function inner() { var xo='老男孩'; alert(xo) } inner() } func(); # 老男孩
21. 执行结果:
function Foo() { console.log(xo); var xo='武沛齐' } Foo() # undefined
22. 执行结果:
var name = 'Alex'; function Foo() { this.name='武沛齐'; this.func=function () { alert(this.name) } } var obj=new Foo(); obj.func() # 武沛齐
23. 执行结果:
var name = 'Alex'; function Foo() { this.name='武沛齐'; this.func=function () { (function () { alert(this.name) })() } } var obj=new Foo(); obj.func() # Alex
js作用域: https://www.cnblogs.com/wupeiqi/p/5649402.html
后端部分
1. django、flask、tornado框架的比较?
都是通过wsgi协议实现,默认使用模块不同 Django: wsgiref模块 flask: werkzeug Django: 大而全: 中间件, 路由系统, 视图(CBV/FBV), 模板, ORM, cookie, Session, Admin, , 缓存, 信号, 序列化.. flask: 轻量级(可扩展性强,第三方组件丰富): 中间件(功能较弱,需要扩展才能等价于Django的中间件), 路由系统, 视图(CBV/FBV), Session(有,但弱爆了), 无模板(第三方jinja2模板), 无ORM, cookie, 后面的都没有了 还有一个特点: 处理请求的方式不同: Django: 请求封装成request,传参进行传递 Flask: 上下文管理 tornado: 轻量级 特色: 异步非阻塞 + 内置Websocket 其他: web.py bottle.py
2. 什么是wsgi?
3. django请求的生命周期?
4. 列举django的内置组件?
5. 列举django中间件的5个方法?以及django中间件的应用场景?
6. 简述什么是FBV和CBV?
7. django的request对象是在什么时候创建的?
8. 如何给CBV的程序添加装饰器?
9. 列举django orm 中所有的方法(QuerySet对象的所有方法)
10. only和defer的区别?
只取某些字段
排除某些字段
11. select_related和prefetch_related的区别?
select_related() # 帮助连表查询(把连表多次查询变成一次查询)(外键.name还要查询, 而join连表,结果是一个新的视图,一次就够了)
prefetch_related() # 把连表查询拆分成多个单表查询
def select_related(self, *fields) 性能相关:表之间进行join连表操作,一次性获取关联的数据。 总结: 1. select_related主要针一对一和多对一关系进行优化。 2. select_related使用SQL的JOIN语句进行优化,通过减少SQL查询的次数来进行优化、提高性能。 def prefetch_related(self, *lookups) 性能相关:多表连表操作时速度会慢,使用其执行多次SQL查询在Python代码中实现连表操作。 总结: 1. 对于多对多字段(ManyToManyField)和一对多字段,可以使用prefetch_related()来进行优化。 2. prefetch_related()的优化方式是分别查询每个表,然后用Python处理他们之间的关系。
12. filter和exclude的区别?
满足某些条件
排除某些条件
13. 列举django orm中三种能写sql语句的方法。
Person.objects.all()
Person.objects.raw('SELECT * FROM myapp_person')
extra---在QuerySet的基础上继续执行子语句,条件不满足,嵌套...
14. django orm 中如何设置读写分离?
手动操作:using('default') 自动操作: class Router1: def db_for_read(self, model, **hints): return 'db1' def db_for_write(self, model, **hints): return 'default'
15. F和Q的作用?
组合条件查询
F: Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取模的操作。
Q: filter一般and连接条件, Q支持or(|),非(~)等复杂的条件
16. values和values_list的区别?
values 字典
values_list 元组 [(id, name,...), (), ..]
17. 如何使用django orm批量创建数据?
obj_list = [ models.DDD(name='r11'), models.DDD(name='r22') ] models.DDD.objects.bulk_create(obj_list, 10)
18. django的Form和ModeForm的作用?
作用:
1. 对用户请求数据的格式进行校验
2. 自动生成HTML标签
区别:
Form,字段需要自己手写字段信息。
19. django的Form组件中,如果字段中包含choices参数,请使用两种方式实现数据源实时更新。
• __init__重新ORM语句
• ModelChoiceField(queryset=ORM语句)字段
20. django的Model中的ForeignKey字段中的on_delete参数有什么作用?
on_delete指的是通过ForeignKey连接起来的对象被删除后,当前字段怎么变化。
- models.CASCADE,删除关联数据,与之关联也删除
- models.DO_NOTHING,删除关联数据,引发错误IntegrityError
- models.PROTECT,删除关联数据,引发错误ProtectedError
- models.SET_NULL,删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)
- models.SET_DEFAULT,删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)
- models.SET,删除关联数据,
a. 与之关联的值设置为指定值,设置:models.SET(值)
b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
21. django中csrf的实现机制?
防止直接访问post
• 先发get,获取csrftoken,页面隐藏或cookie
• 再发post,携带csrftoken
• 在中间件process_view中校验
22. django如何实现websocket?
django: channel
flask: gevent-websocket
tornado: 内置
23. 基于django使用ajax发送post请求时,都可以使用哪种方法携带csrf token?
data:{csrfmiddlewaretoken:'{{ csrf_token }}',name:'alex'}
headers:{
X-CSRFToken: $.cookie('csrftoken')
}, # ajaxSetup为每个ajax请求都加上请求头
24. django中如何实现orm表中添加数据时创建一条日志记录。
Model signals: from django.db.models.signals import *** # 导入方法 pre_save # django的modal对象保存前,自动触发 post_save # django的modal对象保存后,自动触发 pre_delete # django的modal对象删除前,自动触发 post_delete # django的modal对象删除后,自动触发 Request/response signals: from django.core.signals import *** # 导入方法 request_started # 请求到来前,自动触发 request_finished # 请求结束后,自动触发 got_request_exception # 请求异常后,自动触发
25. django缓存如何设置?
• 全站缓存(中间件) “update” 和 “fetch” 中间件
• 整个页面缓存(视图函数) @cache_page(5)
• 局部页面缓存 {% cache 5 'name' %} {% endcache %}
26. django的缓存能使用redis吗?如果可以的话,如何配置?
安装django-redis
CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", # 用RedisCache组件去链接下面的ip地址 "LOCATION": "redis://127.0.0.1:6379", # redis服务器所在机器的ip地址 "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", "CONNECTION_POOL_KWARGS": {"max_connections": 100} # 链接池最大链接数 # "PASSWORD": "密码", } },
27. django路由系统中name的作用?
反向解析url
耦合
url很长,用它就方便
28. django的模板中filter和simple_tag的区别?
都是可以自定义方法处理业务
filter 最多可以传2个参数,且第二个参数在后面传, if判断
simple_tag 可以传多个参数,不能用if
29. django-debug-toolbar的作用?
django_debug_toolbar 是django的第三方工具包,给django扩展了调试功能。
包括查看执行的sql语句,db查询次数,request,headers,调试概览等。
使用: setting和url.py要修改配置
30. django中如何实现单元测试?
为什么要单元测试:
我们写好代码后,运行开发服务器,在浏览器上自己点击测试,看写的代码是否正常,但是这样做很麻烦,因为以后如果有改动,可能会影响以前本来正常的功能,这样以前的功
能又得测试一遍,非常不方便
Django app test.py unittest模块
31. 解释orm中 db first 和 code first的含义?
db first: 是基于已存在的数据库,利用某些工具(如VS提供的EF设计器)生成实体框架和相应代码。
优点: 数据库结构比较成熟稳定的产品时,我们可以很轻松的使用数据库生成实体模型,从而实现快速开发。
缺点: 性能可能会差
code first: 写一些代码,根据已有的代码描述,自动创建数据对象。
优点: 性能比较好,且代码较少冗余
缺点: 都是代码编写,比如说更新数据库
32. django中如何根据数据库表生成model中的类?
创建一个项目
修改seting文件:
在setting里面设置你要连接的数据库类型和连接名称,地址之类,和创建新项目的时候一致
python manage.py inspectdb # 自动生成models模型文件
django-admin.py startapp app # 把模型文件导入到app中
python manage.py inspectdb > app/models.py
33. 使用orm和原生sql的优缺点?
看业务需求
优点:
不用写原生sql语句,开发速度快
移植性好: 公司有钱了,Mysql换Oracle,不需要重写sql语句
缺点:
牺牲效率(翻译成sql语句)
用多了,程序员都不会写sql语句了
34. 简述MVC和MTV
MVC: model view controller
MTV: model tempalte view
35. django的contenttype组件的作用?
contenttype是django的一个组件(app),为我们找到django程序中所有app中的所有表并添加到记录中。
可以使用他再加上表中的两个字段实现:一张表和N张表创建FK关系。
• 字段:表名称
• 字段:数据行ID
36. 谈谈你对restfull 规范的认识?
restful其实就是一套编写接口的协议,协议规定了如何编写以及如何设置返回值、状态码等信息。
10个规范
一条url 根据method不同, 增删改查
状态码
37. 接口的幂等性是什么意思?
幂等性的数学表达:f(f(x)) = f(x)。
幂等性是系统接口对外的一种承诺:
使用相同参数对同一资源重复调用某个接口的结果与调用一次的结果相同
38. 什么是RPC?
RPC (Remote Procedure Calls)远程过程调用,是一种协议,程序可使用这种协议向网络中的另一台计算机上的程序请求服务。由于使用 RPC 的程序不必了解支持通信的网络协议
的情况,因此 RPC 提高了程序的互操作性。在 RPC 中,发出请求的程序是客户程序,而提供服务的程序是服务器。
RPC(远程过程调用)是一项广泛用于支持分布式应用程序(不同组件分布在不同计算机上的应用程序)的技术。RPC 的主要目的是为组件提供一种相互通信的方式,使这些组
件之间能够相互发出请求并传递这些请求的结果
39. Http和Https的区别?
http: 80端口
https: 443端口
https加密协议,有证书
自定义证书
购买证书: 服务端制作证书,公钥给证书机构,客户取证书机构获取证书
40. 为什么要使用django rest framework框架?
内部提供了很多方便的组件,我们通过一些配置就可以完成一些相应的操作,这样可以提高开发效率。
用的最多的就是序列化器和解析器
其次还有 认证,分页,频率组件
41. django rest framework框架中都有那些组件?
42. django rest framework框架中的视图都可以继承哪些类?
框架扩展了10个类,用的较多的有3个:
APIview:基本功能认证,频率; 其他数据库操作等需要手动操作
GenericViewSet: 路由发生变化,传参映射关系 as_view({'get':'list','post':'create'}), 类提供了一些方法get_object get_queryset
ModelViewSet: 啥都不需要做,连数据库操作都不用自己写了
43. 简述 django rest framework框架的认证流程。
dispatch 重新封装request 有个request.uer 调用了 get_authenticators()方法找到authentication类, initial()方法,实例化类
调用authentication里面的方法,进行验证,返回结果:
• 认证成功:(user,auth)
• 匿名用户:None
• 认证失败:异常
44. django rest framework如何实现的用户访问频率控制?
匿名用户: 唯一标识:IP / get_ident()拿到IP或代理IP / redis list类型 / name=ip values=[time,time]
注册登录用户: 用户名(唯一)或邮箱 做唯一标识
45. Flask框架的优势?
首先,Flask是一个轻量级框架
Flask自由、灵活,可扩展性强,第三方库的选择面广,生态圈比较开放
适合开发小型的网站
与NoSQL数据库的配合要优于Django(Django+关系型数据库非常强大)
46. Flask框架依赖组件?
内置:
路由 # 装饰器
视图
模板 # jinja2
session
中间件
blueprint # 蓝图,组织项目目录
flash # 闪现,只用一次就删除,在session的基础上实现的
第三方组件:
flask-session
flask-script # 定制命令
flask-aqlalchemy # 类似Django的ORM
flask-migrate # 做数据库迁移
blinker # 信号
flask-login 自定义组件
47. Flask蓝图的作用?
组织项目目录,把项目应用系统化,有助于协同开发
48. 列举使用过的Flask第三方组件?
49. 简述Flask上下文管理流程?
与django相比是两种不同的实现方式
django/tornado是通过传参数形式实现
而flask是通过上下文管理, 两种都可以实现,只不实现的方式不一样罢了
上下文管理:
threadinglocal 类:
它为每一个线程开辟一块独立的空间,但是Flask自己实现一个local类, 对threadinglocal进行扩展,支持协程
创建字典保存数据: key 线程号/协程号(greelet获取)唯一标识, value: 数据 , 这样可以保证数据隔离
请求进来的时候
1. 把request和session等数据封装到RequestContext中
2. 再将RequestContext对象通过LocalStack(push方法)放到Local中
使用时,调用request
1. 实例化一个LocalProxy对象(偏函数),调用(_get_current_object()),
2. 利用LocalStack中的top方法,去Local中获取值,取的是列表的最后一个值。
请求终止时:
LocalStack的pop方法,将Local中值删除
50. Flask中的g的作用?
全局变量, 声明周期: 一个请求开始和结束
g应用场景
权限, 认证
(before_request+g)
51. Flask中上下文管理主要涉及到了那些相关的类?并描述类主要作用?
52. 为什么要Flask把Local对象中的的值stack 维护成一个列表?
维护成一个栈, 多离线脚本使用
(web运行时,永远只有一个app)
53. Flask中多app应用是怎么完成?
Flask把Local对象的值stack维护成一个列表,通过LocalStack维护成一个栈
通过LocalStack对象对Local对象进行操作,进栈/出栈
54. 在Flask中实现WebSocket需要什么组件?
gevent-websocket
55. wtforms组件的作用?
56. Flask框架默认session处理机制?
请求进来:
1. session封装到RequestContext的对象中,通过push()把对象放到Local对象中
2. push()中调用open_session(),从request中获取session信息,没有返回一个空字典
使用的时候:
通过LocalProxy调用get_current_obj()获取代理对象,通过偏函数使用LocalStack中的top()获取Local对象中的数据
请求结束:
调用save_session(),将数据加密写入用户的cookie中,这个操作在after_request之后
57. 解释Flask框架中的Local对象和threading.local对象的区别?
greenLet支持协程
LocalStack把Local对象的值维护成一个栈
58. Flask中 blinker 是什么?
信号是用于通知订阅者发生了什么,不鼓励修改数据
比如: 记录日志
和钩子hooks(before_request)不一样,它可以终止请求继续执行
59. SQLAlchemy中的 session和scoped_session 的区别?
每个线程的到来,都需要创建一个数据库连接,麻烦
flask-sqlalchemy默认用的也是方式二:scoped_session
data = db.session.query(model.Users).all()
这样以后就不用担心多线程...
60. SQLAlchemy如何执行原生SQL?
创建一个数据库连接session,使用session.execute(原生sql)
from_statement(text("SELECT * FROM users where name=:name")).params(name='zhou').all()
61. ORM的实现原理?
62. DBUtils模块的作用?
DBUtils是Python的一个用于实现数据库连接池的模块。
创建一批连接到连接池,供所有线程共享使用。
由于pymysql、MySQLdb等threadsafety值为1,所以该模式连接池中的线程会被所有线程共享。
POOL = PooledDB() conn = POOL.connection() # 去链接池拿一个链接 cursor = conn.cursor() cursor.execute('select * from tb1') result = cursor.fetchall()
63. SQLAchemy中如何为表设置引擎和字符编码?
class User(BaseModel):
__table_args__ = {
'mysql_engine': 'InnoDB',
'mysql_charset': 'utf8'
}
64. SQLAchemy中如何设置联合唯一索引?
__table_args__ = (
# 联合唯一索引
# UniqueConstraint('id', 'name', name='uix_id_name'),
)
65. 简述Tornado框架的特点。
小型的轻量级框架
特点: 异步非阻塞+WebSocket
66. 简述Tornado框架中Future对象的作用?
视图函数yield一个futrue对象实现协程并发
请求未完成:
sef._done = False
self._result = None
tornado就会一直检测futrue对象的_done是否已经变成True
如果请求执行完毕,self._result=result, 自动调用future的set_result方法:
self._done = True
67. Tornado框架中如何编写WebSocket程序?
class MessageHandler(WebSocketHandler): def open(self, *args, **kwargs): WS_LIST.append(self) def on_message(self, message): # self.close() # 服务端主动断开连接, 客户端的onclose方法自动执行 for item in WS_LIST: item.write_message(message) def on_close(self): # 如果客户端主动断开连接,触发此方法 WS_LIST.remove(self)
68. Tornado中静态文件是如何处理的?
如: <link href="{{static_url("commons.css")}}" rel="stylesheet" />
静态文件 后面的字符串是静态文件的md5值
69. Tornado操作MySQL使用的模块?
1. Tornado-MySQL 是 PyMySQL 的一个分支,它支持 Tornado 的异步特性。
2. 使用 Celery, Celery 是一个异步的任务队列,它能很方便地支持分布式扩展,因而很适合将 tornado 中的长时间的阻塞工作交由 Celery 来完成。 而要 Celery 配合 Tornado 一起工作,需要借助一个名为 tornado-celery
70. Tornado操作redis使用的模块?
Tornado-Redis
71. 简述Tornado框架的适用场景?
有大量长轮询连接需要维护,比如聊天室
72. git常见命令作用:
git init -------初始化 git status ------- 查看状态 git add . -----添加所有文件到暂存区 git log ------ 显示当前分支的版本历史 git branch ------ 查看分支 git branch dev ----- 创建一个dev分支 git checkout dev ------ 切换到dev分支 git remote add 别名 url ------ 添加一个远程地址, origin: 别名 (链接到远程仓库) git clone url
从远程仓库的dev分支拉代码: git pull 别名 dev # 注意: 不能克隆
73. 简述以下git中stash命令作用以及相关其他命令。
stash用于将工作区发生变化的所有文件获取临时存储在“某个地方”,将工作区还原当前版本未操作前的状态;stash还可以将临时存储在“某个地方”的文件再次拿回到工作区。
特别的:执行 git stash pop 命令时,可能会遇到冲突,因为在紧急修复bug的代码和通过stash存储在“某个地方”的代码会有重合部分,所以执行 git stash pop 时候就会出现冲突,
有冲突解决冲突即可。
stash相关常用命令:
• git stash 将当前工作区所有修改过的内容存储到“某个地方”,将工作区还原到当前版本未修改过的状态
• git stash list 查看“某个地方”存储的所有记录
• git stash clear 清空“某个地方”
• git stash pop 将第一个记录从“某个地方”重新拿到工作区(可能有冲突)
• git stash apply 编号, 将指定编号记录从“某个地方”重新拿到工作区(可能有冲突)
• git stash drop 编号,删除指定编号的记录
74. git 中 merge 和 rebase命令 的区别。
git merge 分支分叉,不是一条线
git rebase 合并后,是一条线
75. 公司如何基于git做的协同开发?
多人协同开发:
为每个人创建一个分支, 然后再合并到一个分支,有冲突,大家一起解决冲突
# 先干完活的提交完跑了,后面提交的老多冲突,还不得哭晕在厕所
master
dev
--zhangsan
--lisi
76. 如何基于git实现代码review?
然后还有一个问题,合并在一起的代码可能是不行的,不行的话就不能让你合并到dev
一定要做review
master
dev
--review (组长做review)
--zhangsan
--lisi
张三和李四写完代码,让他们合并到review,组长检查合并到一起的代码,但是合并到一起的代码可能是不行的,不行就继续写,不能合并到dev,
面试题:
公司是否做代码的review ? 谁来做? 怎么做?
做
组长
创建一个review分支,代码合并到review,组长检查,看是否有问题,有问题继续写,没问题才能合并到dev
一般1/2/3天合并一次
77. git如何实现v1.0 、v2.0 等版本的管理?
版本控制工具:SVN、Git等,其中Git属于绝对霸主地位。
版本的回滚与找回:
git log
git reset --hard xxxxxxxx
git reflog
git reset --hard xxxxxxxx
https://blog.csdn.net/czx33859066/article/details/79415629
78. 什么是gitlab?
GitLab 是一个用于仓库管理系统的开源项目。说白了,他就是一个仓库,用于我们存放东西,-存放我们的项目
通俗易懂的理解就是:Git是代码托管工具,GitHub和码云以及GitLab是代码仓库,我们通过工具将代码上传到仓库中
如何使用Gitlab?
我们先注册好登录,然后就开始创建项目了
79. github和gitlab的区别?
码云:
服务器在国内,速度快,支持svn,git两种方式,免费账户同样可以建立 私有项目.
一个项目最高只能有1G,局限性
github:
GitHub可以托管各种git库,并提供一个web界面,但与其它像 SourceForge或Google Code这样的服务不同,GitHub的独特卖点在于从另外一个项目进行分支的简易性。
为一个项目贡献代码非常简单:
首先点击项目站点的“fork”的按钮,然后将代码检出并将修改加入到刚才分出的代码库中,最后通过内建的“pull request”机制向项目负责人申请代码合并。已经有人将GitHub称为
代码玩家的MySpace。
但有一个 私人的项目需要付费。相较之下就体现出Gitlab的更多好处了
gitlab:
码云和github有的,gitlab有,同时安全性非常高,有的时候我们创建了项目 不想陌生人看到,但是同事可能需要看,那么gitlab的小组就非常适合了,
gitlab的小组,只要是组内的人,个人创建的私密项目,小组的人是能看到的。这样就很方便小组开发,也能相互之间学习。
同时私密项目是不需要付费的,
操作界面也是非常的简洁方便我们操作。
80. 如何为github上牛逼的开源项目贡献代码?
首先点击项目站点的“fork”的按钮,然后将代码检出并将修改加入到刚才分出的代码库中,最后通过内建的“pull request”机制向项目负责人申请代码合并。已经有人将GitHub称为
代码玩家的MySpace。
81. git中 .gitignore文件的作用?
忽略管理文件, 忽略掉某些文件或文件目录,以后git操作就不在管了
82. 什么是敏捷开发?
一种做事情的方法
比如:产品的快速迭代,接收用户反馈,即使修改,再更新
就是每隔一段时间,都要进行自我总结和调整,通过各种数据反馈,找到流程中坏的味道,逐步改进。最后用一句话总结我对敏捷开发的理解:敏捷是态度而不是流程,是氛围而
不是方法。
83. 简述 jenkins 工具的作用?
Jenkins是一个开源的、持续集成(CI)工具, 主要用于持续、自动的构建/测试软件项目、监控外部任务的运行.
Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。
通常与版本管理工具(SCM)、构建工具结合使用;常用的版本控制工具有SVN、GIT,构建工具有Maven、Ant、Gradle。
84. 公司如何实现代码发布?
公司中的部署步骤及负责人:
1. 开发提交代码
2. 测试人员开始测试
3. 运维人员进行上线
使用软件:jenkins+自己写脚本,运维人员点点点。
- 从git上拉代码到一个服务器,在该服务器上对代码进行编译(c/vue/java)
- 通过以下工具 将代码同步到每台服务器上
- saltstack # 远程管理很多台机器,输入一个命令,所有服务器执行命令
- ansible
- 执行命令启动程序
85. 简述 RabbitMQ、Kafka、ZeroMQ的区别?
RabbitMQ是一个AMQP实现,传统的messaging queue系统实现,基于Erlang。老牌MQ产品了。AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场
景,对性能和吞吐量还在其次。
Kafka是linkedin开源的MQ系统,主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输,0.8开始支持复制,不支持事务,适合产生
大量数据的互联网服务的数据收集业务。
ZeroMQ只是一个网络编程的Pattern库,将常见的网络请求形式(分组管理,链接管理,发布订阅等)模式化、组件化,简而言之socket之上、MQ之下。对于MQ来说,网络传输
只是它的一部分,更多需要处理的是消息存储、路由、Broker服务发现和查找、事务、消费模式(ack、重投等)、集群服务等。
86. RabbitMQ如何在消费者获取任务后未处理完前就挂掉时,保证数据不丢失?
RabbitMQRabbitMQ支持消息应答, 消费者处理完毕后,会告诉RabbitMQ
消息没有超时限制,只要消费者不挂掉,RabbitMQ就一直等,只有消费者挂掉了,RabbitMQ才会将消息发给(监听的一个队列中)下一个消费者
ch.basic_ack(delivery_tag=method.delivery_tag) # 发送应答给rabbitmq: 消息处理完毕(收到反馈后,才会给下一个数据,否则没有收到反馈,并且消费者又一次要数据,rabbitmq就会
再次给上次的数据)
channel.basic_consume(callback,
queue='hello',
no_ack=False) # 默认True, 看工作需求: 安全重要还是效率重要
87. RabbitMQ如何对消息做持久化?
durable=True # 使数据持久化
88. RabbitMQ如何控制消息被消费的顺序?
prefetch与消息投递
prefetch允许为每个consumer指定最大的unacked messages数目。简单来说就是用来指定一个consumer一次可以从Rabbit中获取多少条message并缓存在client中(RabbitMQ提供
的各种语言的client library)。一旦缓冲区满了,Rabbit将会停止投递新的message到该consumer中直到它发出ack。
假设prefetch值设为10,共有两个consumer。意味着每个consumer每次会从queue中预抓取 10 条消息到本地缓存着等待消费。同时该channel的unacked数变为20。而Rabbit投
递的顺序是,先为consumer1投递满10个message,再往consumer2投递10个message。如果这时有新message需要投递,先判断channel的unacked数是否等于20,如果是则不
会将消息投递到consumer中,message继续呆在queue中。之后其中consumer对一条消息进行ack,unacked此时等于19,Rabbit就判断哪个consumer的unacked少于10,就投
递到哪个consumer中。
总的来说,consumer负责不断处理消息,不断ack,然后只要unacked数少于prefetch * consumer数目,broker就不断将消息投递过去。
89. 以下RabbitMQ的exchange type分别代表什么意思?如:fanout、direct、topic。
90. 简述 celery 是什么以及应用场景?

实时处理和任务调度的分布式任务队列, 基于Python实现的用于完成处理任务的组件.
大量请求,cpu计算耗时的情况
场景:
代码的发布系统(定时)
商城抢购: 大批量用户进来 用这个
买东西需要排队的时候,要用这个
1. Web应用。当用户触发的一个操作需要较长时间才能执行完成时,可以把它作为任务交给Celery去异步执行,执行完再返回给用户。这段时间用户不需要等待,提高了网站的整体吞吐量和响应时间。
2. 定时任务。生产环境经常会跑一些定时任务。假如你有上千台的服务器、上千种任务,定时任务的管理很困难,Celery可以帮助我们快速在不同的机器设定不同种任务。
3. 同步完成的附加工作都可以异步完成。比如发送短信/邮件、推送消息、清理/设置缓存等。
91. 简述celery运行机制。

92. celery如何实现定时任务?
两种方式:
配置文件中编写 beat_schedule 属性 app.conf.beat_schedule = { # 'add-every-10-seconds': { # 'task': 'proj.s1.add1', # 'schedule': 10.0, # 'args': (16, 16) # }, 'add-every-12-seconds': { 'task': 'proj.s1.add1', 'schedule': crontab(minute=42, hour=8, day_of_month=11, month_of_year=4), 'args': (16, 16) }, } 使用apply_async并设定时间 result = xxxxx.apply_async(args=[1, 3], eta=ctime_x)
93. 简述 celery多任务结构目录?
pro_cel ├── celery_tasks # celery相关文件夹 │ ├── celery.py # celery连接和配置相关文件 │ └── tasks.py # 所有任务函数 ├── check_result.py # 检查结果 └── send_task.py # 触发任务
94. celery中装饰器 @app.task 和 @shared_task的区别?
@app.task 给某个app绑定任务
@shared_task 给所有的应用绑定任务
95. 简述 requests模块的作用及基本使用?
Requests模块是一个用于网络访问的模块, http测试,爬虫
GET请求: import requests payload = {"k1": "v1", "k2": "v2"} ret = requests.get(url='https://www.autohome.com.cn/news/', params=payload) print(ret) # <Response [200]> print(ret.url) print(ret.text)
96. 简述 beautifulsoup模块的作用及基本使用?
简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据。官方解释如下:通过解析文档为用户提供需要抓取的数据
soup = BeautifulSoup(ret.text, 'html.parser') # 工作中解析器: lxml
div = soup.find(name='div', attrs={"id": 'id_11'})
find find_all children text
97. 简述 seleninu模块的作用及基本使用?
监控主从服务器,如果主服务挂了,自动切换,这样程序就不再和主服务器连接,直接和sentinel连接
使用: 配置哨兵端口和主redis的IP
找到 /etc/redis-sentinel-8001.conf 配置文件,在内部:
- 哨兵的端口 port = 8001
- 主redis的IP,1 # 哨兵个数的一半,比如10个哨兵,5个认为主服务挂掉了,才会切换
98. scrapy框架中各组件的工作流程?

99. 在scrapy框架中如何设置代理(两种方法)?
1. 使用scrapy内置的代理中间件(属于下载中间件) from scrapy.downloadermiddlewares.httpproxy import HttpProxyMiddleware # 内置的代理 class ChoutiSpider(scrapy.Spider): ... def start_requests(self): os.environ['HTTP_PROXY'] = 'https://192.168.11.11' 2. 自定义代理中间件
100. scrapy框架中如何实现大文件的下载?
pipelines.py: class FilePipeline(object): def process_item(self, item, spider): return item # 返回的item继续传给下一个pipeline(DbPipeline) # yield item传给FilePipeline, 然后再传给DbPipeline,如果还有,继续传item....... def open_spider(self, spider): 打开文件 def close_spider(self, spider): 关闭文件 setting.py配置: 存储方式 存储文件路径
101. scrapy中如何实现限速?
download_dely = 2
102. scrapy中如何实现暂停爬虫?
使用Telnet终端 telnet localhost 6023 # setting配置默认6023端口 >>> engine.pause() # 暂停 >>> engine.unpause() #恢复 >>> engine.stop() #停止 Connection closed by foreign host.
103. scrapy中如何进行自定制命令?
104. scrapy中如何实现的记录爬虫的深度?
105. scrapy中的pipelines工作原理?
106. scrapy的pipelines如何丢弃一个item对象?
107. 简述scrapy中爬虫中间件和下载中间件的作用?
108. scrapy-redis组件的作用?
109. scrapy-redis组件中如何实现的任务的去重?
110. scrapy-redis的调度器如何实现任务的深度优先和广度优先?
111. 简述 vitualenv 及应用场景?
virtualenv就是用来为一个项目创建一套“隔离”的Python运行环境。
- d:\zhouzhilong>virtualenv my_venv
- d:\zhouzhilong\my_venv\Scripts>activate
进入虚拟环境后,有个my_venv前缀
场景: 2个项目,一个Django1.7,一个1.8
112. 简述 pipreqs 及应用场景?
生成项目依赖版本信息
使用:
Pycharm的Terminal窗口:
生成依赖文件: pipreqs ./ # 生成一个requirements.txt文件
强制覆盖: pipreqs ./ --force
安装依赖文件: pip3 install -r requirements.txt # 根据txt文件里面的信息,安装所有依赖
113. 在Python中使用过什么代码检查工具?
Flake8 是由Python官方发布的一款辅助检测Python代码是否规范的工具
Flake8是对下面三个工具的封装:
- PyFlakes:静态检查Python代码逻辑错误的工具。
- Pep8: 静态检查PEP8编码风格的工具。
- NedBatchelder’s McCabe script:静态分析Python代码复杂度的工具。
Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准和有潜在问题的代码。
Pylint 是一个 Python 工具,除了平常代码分析工具的作用之外,它提供了更多的功能:如检查一行代码的长度,变量名是否符合命名标准,一个声明过的接口是否被真正实现等
等。
一般Pycharm自带格式化工具
114. 简述 saltstack、ansible、fabric、puppet工具的作用?
115. B Tree和B+ Tree的区别?
平衡多路查找树(B-Tree)

每个节点占用一个盘块的磁盘空间,一个节点上有两个升序排序的关键字和三个指向子树根节点的指针,指针存储的是子节点所在磁盘块的地址。两个关键词划分成的三个范围域
对应三个指针指向的子树的数据的范围域。以根节点为例,关键字为17和35,P1指针指向的子树的数据范围为小于17,P2指针指向的子树的数据范围为17~35,P3指针指向的子
树的数据范围为大于35。
模拟查找关键字29的过程:
1. 根据根节点找到磁盘块1,读入内存。【磁盘I/O操作第1次】
2. 比较关键字29在区间(17,35),找到磁盘块1的指针P2。
3. 根据P2指针找到磁盘块3,读入内存。【磁盘I/O操作第2次】
4. 比较关键字29在区间(26,30),找到磁盘块3的指针P2。
5. 根据P2指针找到磁盘块8,读入内存。【磁盘I/O操作第3次】
6. 在磁盘块8中的关键字列表中找到关键字29。
分析上面过程,发现需要3次磁盘I/O操作,和3次内存查找操作。由于内存中的关键字是一个有序表结构,可以利用二分法查找提高效率。而3次磁盘I/O操作是影响整个B-Tree查
找效率的决定因素。B-Tree相对于AVLTree缩减了节点个数,使每次磁盘I/O取到内存的数据都发挥了作用,从而提高了查询效率。
B+Tree是在B-Tree基础上的一种优化,使其更适合实现外存储索引结构,InnoDB存储引擎就是用B+Tree实现其索引结构。
从上一节中的B-Tree结构图中可以看到每个节点中不仅包含数据的key值,还有data值。而每一个页的存储空间是有限的,如果data数据较大时将会导致每个节点(即一个页)能
存储的key的数量很小,当存储的数据量很大时同样会导致B-Tree的深度较大,增大查询时的磁盘I/O次数,进而影响查询效率。在B+Tree中,所有数据记录节点都是按照键值大小
顺序存放在同一层的叶子节点上,而非叶子节点上只存储key值信息,这样可以大大加大每个节点存储的key值数量,降低B+Tree的高度。
B+Tree相对于B-Tree有几点不同:
1. 非叶子节点只存储键值信息。
2. 所有叶子节点之间都有一个链指针。
3. 数据记录都存放在叶子节点中。

通常在B+Tree上有两个头指针,一个指向根节点,另一个指向关键字最小的叶子节点,而且所有叶子节点(即数据节点)之间是一种链式环结构。因此可以对B+Tree进行两种查
找运算:一种是对于主键的范围查找和分页查找,另一种是从根节点开始,进行随机查找。
116. 请列举常见排序并通过代码实现任意三种。
冒泡排序:
def foo(li): for i in range(len(li) - 1): # 列表长度-1 趟; i 表示第几趟 for j in range(len(li) - i - 1): # 无序区的长度 -1; j 表示当前索引,要和后面的j+1索引比较 if li[j] > li[j + 1]: li[j], li[j + 1] = li[j + 1], li[j]
选择排序:
def select(li): for i in range(len(li) - 1): min = i # 把无序区第一个值拿出来 for j in range(i + 1, len(li)): if li[j] < li[min]: # 如果谁的值比我小,交换 min = j if min != i: # 如果循环一趟,没有比第一个小的,就不用自己和自己交换了 li[i], li[min] = li[min], li[i] # 无序区第一个和最小值交换一下,把最小值放到无序区第一个位置
插入排序:
def insert_sort(li): for i in range(1, len(li)): # 第一个位置的值初识有序区,索引从1开始 temp = li[i] # 把无序区第一个位置的值拿出来 j = i - 1 # 有序区最后一个位置的索引 while j >= 0 and temp < li[j]: # 两个终止条件: 1.j<0,索引越界,说明temp是最小的 li[j + 1] = li[j] # 把有序区最后一个位置的值往后移一格 j -= 1 li[j+1] = temp # 两个终止条件: 1. j=-1,说明temp最小,放到最前面 # 2. 一上来,无序区第一个值就大于有序区最后一个值
117. 请列举常见查找并通过代码实现任意三种。
二分查找:
def foo(li, arg): # 时间复杂度: O(logn) low = 0 high = len(li) - 1 # high/low是索引(下标) while low <= high: mid = (high + low) // 2 if arg < li[mid]: high = mid - 1 elif arg > li[mid]: low = mid + 1 else: return mid return None
118. 请列举你熟悉的设计模式?
119. 有没有刷过leetcode?
刷题的网站
120. 列举熟悉的的Linux命令。
cd ls | grep(通常和管道符配合) find cp mv kill tar cat vim
121. 公司线上服务器是什么系统?
CentOs
122. 解释 PV、UV 的含义?
PV(访问量):即Page View, 即页面浏览量或点击量,用户每次刷新即被计算一次。
UV(独立访客):即Unique Visitor,一般使用cookie标记,访问您网站的一台电脑客户端(比如一台电脑开多个浏览器访问则为多个UV)为一个访客。00:00-24:00内相同的客户端只被计
算一次。
来访次数/访问次数(VV):VV = VisitView(访问次数):记录所有访客1天内访问了多少次您的网站,相同的访客有可能多次访问您的网站。从访客来到您网站到最终关闭网站的所有页
面离开,计为1次访问。半小时
123. 解释 QPS的含义?
QPS: 每秒钟处理完请求的次数;注意这里是处理完。具体是指发出请求到服务器处理完成功返回结果。可以理解在server中有个counter,每处理一个请求加1,1秒后
counter=QPS。
RT:响应时间,处理一次请求所需要的平均处理时间
TPS:每秒钟处理完的事务次数,一般TPS是对整个系统来讲的。
124. uwsgi和wsgi的区别?
wsgi是一个规范/协议, 描述web server 和 web application 通信的规范
当前运行在WSGI协议之上的web框架有Bottle, Flask, Django。
uwsgi:与WSGI一样是一种通信协议,是uWSGI服务器的独占协议,用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型的描述
uWSGI:是一个web服务器,实现了WSGI协议、uwsgi协议、http协议等。
125. supervisor的作用?
supervisor是一个对进程管理的软件,可以帮助我们启动uwsgi并维护(uwsgi进程关闭时,自动将其启动起来)。
需要
配置
命令启动服务
126. 什么是反向代理?
反向代理的实现
1)需要有一个负载均衡设备来分发用户请求,将用户请求分发到空闲的服务器上
2)服务器返回自己的服务到负载均衡设备
3)负载均衡将服务器的服务返回用户
127. 简述SSH的整个过程。
https://www.jianshu.com/p/33461b619d53
SSH是一种协议标准,其目的是实现安全远程登录以及其它安全网络服务。
# 开源实现OpenSSH
对数据加密的方式主要有两种:
1. 对称加密(也称为秘钥加密)
2. 非对称加密(也称公钥加密)
所谓对称加密,指加密解密使用同一套秘钥。, 但是那么多Client端,如果有一个泄露,就不安全了,应运而生了非对称加密
非对称加密有两个密钥:“公钥”和“私钥”。
防止中间人攻击(非对称加密):
Client把公钥给Server
Server生成随机Str给Client,
Client使用私钥加密字符串发给Server,
Server收到后使用公钥解密,对比两个字符串
根据对比结果,返回Client登录结果

128. 有问题都去那些找解决方案?
知乎 思否 Stack Overflow
129.是否有关注什么技术类的公众号?
python开源社区
130. 最近在研究什么新技术?
人工智能玩具
131. 是否了解过领域驱动模型?
132. Python高并发解决方案?
1. 读写分离
2. 设置缓存
3. 负载均衡(ngnix,lvs都可以做负载均衡)
浙公网安备 33010602011771号