面试题四 前端 框架

 

 

 

 

 

 

 

 

 

 

1. 谈谈你对http协议的认识。
HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。?
HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。端口号为80

2. 谈谈你对websocket协议的认识。
WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了,一条快速通道。两者之间就直接可以数据互相传送。
浏览器通过 JavaScript 向服务器发出建立 WebSocket 连接的请求,连接建立以后,
客户端和服务器端就可以通过 TCP 连接直接交换数据。
  
websocket是给浏览器新建的一套(类似与http)协议,协议规定:(\r\n分割)浏览器和服务器连接之后不断开,
以此完成:服务端向客户端主动推送消息。

websocket协议额外做的一些操作
握手 ----> 连接钱进行校验
加密 ----> payload_len=127/126/<=125 --> mask key
本质
创建一个连接后不断开的socket
当连接成功之后:
客户端(浏览器)会自动向服务端发送消息,包含: Sec-WebSocket-Key: iyRe1KMHi4S4QXzcoboMmw==
服务端接收之后,会对于该数据进行加密:base64(sha1(swk + magic_string))
构造响应头:
HTTP/1.1 101 Switching Protocols\r\n
Upgrade:websocket\r\n
Connection: Upgrade\r\n
Sec-WebSocket-Accept: 加密后的值\r\n
WebSocket-Location: ws://127.0.0.1:8002\r\n\r\n
发给客户端(浏览器)
建立:双工通道,接下来就可以进行收发数据
发送数据是加密,解密,根据payload_len的值进行处理
payload_len <= 125
payload_len == 126
payload_len == 127
获取内容:
mask_key
数据
根据mask_key和数据进行位运算,就可以把值解析出来。
  
3. 什么是magic string ?
有触发时机在满足条件时自动触发就是魔术方法,客户端向服务端发送消息时,会有一个'sec-websocket-key'和'magic string'的随机字符串(魔法字符串)
  # 服务端接收到消息后会把他们连接成一个新的key串,进行编码、加密,确保信息的安全性

4. 如何创建响应式布局?
   响应式布局是通过@media实现的
  @media (min-width:768px){
   .pg-header{
   background-color:green;
   }
  }
  @media (min-width:992px){
   .pg-header{
   background-color:pink;
   }
  }
  
  代码
  <!DOCTYPE html>
  <html lang="en">
  <head>
   <meta charset="UTF-8">
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <title>Title</title>
   <style>
   body{
   margin: 0;
   }
   .pg-header{
   background-color: red;
   height: 48px;
   }
  
   @media (min-width: 768px) {
   .pg-header{
   background-color: aqua;
   }
   }
   @media (min-width: 992px) {
   .pg-header{
   background-color: blueviolet;
   }
   }
   </style>
  </head>
  <body>
   <div class="pg-header"></div>
  </body>
  </html>


5. 你曾经使用过哪些前端框架?
Bootstrap / vue、Django
jQuery
Vue.js(与vue齐名的前端框架React和Angular)

6. 什么是ajax请求?并使用jQuery和XMLHttpRequest对象实现一个ajax请求。
AJAX是在不加载整个页面的情况异步下与服务器发送请求交换数据并更新部分网页的艺术

$.ajax({ url:'user/add',//当前请求的url地址
type:'get',//当前请求的方式 get post
data:{id:100},//请求时发送的参数
dataType:'json',//返回的数据类型
success:function(data){ //ajax请求成功后执行的代码
console.log(data); },
error:function(){ //ajax执行失败后执行的代码
alert('ajax执行错误'); },
timeout:2000,//设置当前请求的超时时间 异步请求生效
async:true //是否异步 false同步 true异步})

7. 如何在前端实现轮训?
特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,
然后由服务器返回最新的数据给客户端的浏览器。
  <!DOCTYPE html>
  <html lang="zh-cn">
  <head>
   <meta charset="UTF-8">
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <title>Title</title>
  </head>
  <body>
   <h1>请选出最帅的男人</h1>
   <ul>
   {% for k,v in gg.items() %}
   <li>ID:{{ k }}, 姓名:{{ v.name }} ,票数:{{ v.count }}</li>
   {% endfor %}
   </ul>
  
   <script>
   setInterval(function () {
   location.reload();
   },2000)
   </script>
  </body>
  </html>
  
8. 如何在前端实现长轮训?
ajax实现:在发送ajax后,服务器端会阻塞请求直到有数据传递或超时才会返回,
客户端js响应处理函数会在处理完服务器返回的信息后在次发出请求,
重新建立连接
  
  <!DOCTYPE html>
  <html lang="zh-cn">
  <head>
   <meta charset="UTF-8">
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <title>Title</title>
  </head>
  <body>
   <h1>请选出最帅的男人</h1>
   <ul>
   {% for k,v in gg.items() %}
   <li style="cursor: pointer" id="user_{{ k }}" ondblclick="vote({{ k }});">ID:{{ k }}, 姓名:{{ v.name }} ,票数:<span>{{ v.count }}</span></li>
   {% endfor %}
   </ul>
  
   <script src="/static/jquery-3.3.1.min.js"></script>
   <script>
   $(function () {
   get_new_count();
   });
  
   function get_new_count() {
   $.ajax({
   url: '/get_new_count',
   type:'GET',
   dataType:'JSON',
   success:function (arg) {
   if (arg.status){
   // 更新票数
   var gid = "#user_" + arg.data.gid;
   $(gid).find('span').text(arg.data.count);
   }else{
   // 10s内没有人投票 }
   get_new_count();
  
   }
   })
   }
  
   function vote(gid) {
   $.ajax({
   url: '/vote',
   type:'POST',
   data:{gid:gid},
   dataType:"JSON",
   success:function (arg) {
  
   }
   })
   }
   </script>
  </body>
  </html>
  

9. vuex的作用?
多组件之间共享:vuex
  补充luffyvue
  1:router-link / router-view
  2:双向绑定,用户绑定v-model
  3:循环展示课程:v-for
  4:路由系统,添加动态参数
  5:cookie操作:vue-cookies
  6:多组件之间共享:vuex
  7:发送ajax请求:axios (js模块)

10. vue中的路由的拦截器的作用?
   vue-resource的interceptors拦截器的作用正是解决此需求的妙方。
在每次http的请求响应之后,如果设置了拦截器如下,会优先执行拦截器函数,获取响应体,然后才会决定是否把response返回给then进行接收


11. axios的作用?
在浏览器中发送 XMLHttpRequests 请求
在 node.js 中发送 http请求
支持 Promise API
拦截请求和响应
转换请求和响应数据
自动转换 JSON 数据
客户端支持保护安全免受 XSRF 攻击

12. 列举vue的常见指令。
1、v-if指令:判断指令,根据表达式值得真假来插入或删除相应的值。
2、v-show指令:条件渲染指令,无论返回的布尔值是true还是false,元素都会存在在 html中,只是false的元素会隐藏在html中,并不会删除.
3、v-else指令:配合v-if或v-else使用。
4、v-for指令:循环指令,相当于遍历。
5、v-bind:给DOM绑定元素属性。
6、v-on指令:监听DOM事件。

13. 简述jsonp及实现原理?
JSONP是用来解决跨域请求问题的?
跨域:协议 域名 端口号有一个不一样就是跨域?
实现原理:?
script标签src属性中的链接却可以访问跨域的js脚本,利用这个特性,服务端不再返回JSON格式的数据,
而是返回一段调用某个函数的js代码,在src中进行了调用,这样实现了跨域。

14.什么是什么cors ?
CORS
浏览器将CORS请求分成两类:简单请求和赋复杂请求

简单请求(同时满足以下两大条件)
(1)请求方法是以下三种方法之一:
HEAD
GET
POST
(2)HTTP的头信息不超出以下几种字段:
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type :只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
凡是不同时满足上面两个条件,就属于非简单请求

15. 列举Http请求中常见的请求方式?
GET/POST

16. 列举Http请求中的状态码?
1** 信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作被成功接收并处理
3** 重定向,需要进一步的操作以完成请求
4** 客户端错误,请求包含语法错误或无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误

常见的状态码
200 -请求成功
202 -已接受请求,尚未处理
204 -请求成功,且不需返回内容
301 - 资源(网页等)被永久转移到其他url
400 - 请求的语义或是参数有错
403 - 服务器拒绝请求
404 - 请求资源(网页)不存在
500 - 内部服务器错误
502 - 网关错误,一般是服务器压力过大导致连接超时
503 - 由于超载或系统维护,服务器暂时的无法处理客户端的请求

17.列举Http请求中常见的请求头?
User-Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。
Cookie:这是最重要的请求头信息之一
Content-Type:请求类型

18.alert(李杰)

19.console.log('武沛齐')

20.
console.log(‘老男孩’)

21.结果什么也没有 因为console.log.的时候xo还没有定义

22.alert(”武沛齐’)

23.alert(”武沛齐’)

24.
Django:Python 界最全能的 web 开发框架,battery-include 各种功能完备,可维护性和开发速度一级棒。
常有人说 Django 慢,其实主要慢在 Django ORM 与数据库的交互上,所以是否选用 Django,
取决于项目对数据库交互的要求以及各种优化。而对于 Django 的同步特性导致吞吐量小的问题,
其实可以通过 Celery 等解决,倒不是一个根本问题。Django 的项目代表:Instagram,Guardian。
Tornado:天生异步,性能强悍是 Tornado 的名片,然而 Tornado 相比 Django 是较为原始的框架,诸多内容需要自己去处理。当然,随着项目越来越大,框架能够提供的功能占比越来越小,
更多的内容需要团队自己去实现,而大项目往往需要性能的保证,这时候 Tornado 就是比较好的选择。Tornado项目代表:知乎。
Flask:微框架的典范,号称 Python 代码写得最好的项目之一。Flask 的灵活性,也是双刃剑:
能用好 Flask 的,可以做成 Pinterest,用不好就是灾难(显然对任何框架都是这样)。
Flask 虽然是微框架,但是也可以做成规模化的 Flask。加上 Flask 可以自由选择自己的数据库交互组件
(通常是 Flask-SQLAlchemy),而且加上 celery +redis 等异步特性以后,Flask 的性能相对
Tornado 也不逞多让,也许Flask 的灵活性可能是某些团队更需要的。

25.什么是wsgi?
WSGI(Web Server Gateway Interface,Web 服务器网关接口)则是Python语言中1所定义的Web服务器和Web应用程序之间或框架之间的通用接口标准。
WSGI就是一座桥梁,桥梁的一端称为服务端或网关端,另一端称为应用端或者框架端,WSGI的作用就是在协议之间进行转化。WSGI将Web组件分成了三类:Web 服务器(WSGI Server)、Web中间件(WSGI Middleware)与Web应用程序(WSGI Application)。
Web Server接收HTTP请求,封装一系列环境变量,按照WSGI接口标准调用注册的WSGI Application,最后将响应返回给客户端。


26.django请求的生命周期?
前端请求—>nginx—>uwsgi.—>中间件—>url路由—->view试图—>orm—->拿到数据返回给view—->试图将数据渲染到模版中拿到字符串—->中间件—>uwsgi—->nginx—->前端渲染


27. 列举django的内置组件?
url 、view、model、template、中间件

28. 列举django中间件的5个方法?以及django中间件的应用场景?
process_request(self,request) 先走request 通过路由匹配返回
process_view(self, request, callback, callback_args, callback_kwargs) 再返回执行view
process_template_response(self,request,response) 当视图函数的返回值
process_exception(self, request, exception) 当视图函数的返回值对象中有render方法时,该方法才会被调用
process_response(self, request, response)

29. 简述什么是FBV和CBV?
django中请求处理方式有2种:FBV 和 CBV
FBV(function base views) 就是在视图里使用函数处理请求。
CBV(class base views)就是在视图里使用类处理请求 类需要继承view

30. django的request对象是在什么时候创建的?
当请求一个页面时,Django会建立一个包含请求元数据的 HttpRequest 对象。
当Django 加载对应的视图时,HttpRequest 对象将作为视图函数的第一个参数。
每个视图会返回一个HttpResponse 对象。

31. 如何给CBV的程序添加装饰器?
from django.views import View
from django.utils.decorators import method_decorator
def auth(func):
def inner(*args,**kwargs):
return func(*args,**kwargs)
return inner
class UserView(View):
@method_decorator(auth)
def get(self,request,*args,**kwargs):
return HttpResponse('...')


32. 列举django orm 中所有的方法(QuerySet对象的所有方法)
返回Query Set对象的方法有:?
* all()?* filter()?* exclude()?* order_by()?* reverse()?* dictinct()

特殊的QuerySet:?
* values() 返回一个可迭代的字典序列?
* values_list() 返回一个可迭代的元祖序列

返回具体对象的:?
* get()?* first()?* last()

返回布尔值的方法有:?* existe()

返回数学的方法有:?* count( )

33.only和defer的区别?

  def defer(self, *fields):
   models.UserInfo.objects.defer('username','id')
   或
   models.UserInfo.objects.filter(...).defer('username','id')
   #映射中排除某列数据
  
   def only(self, *fields):
   #仅取某个表中的数据
   models.UserInfo.objects.only('username','id')
   或
   models.UserInfo.objects.filter(...).only('username','id')

34. select_related和prefetch_related的区别?
select_related通过多表join关联查询,一次性获得所有数据,通过降低数据库查询次数来提升性能,
但关联表不能太多,因为join操作本来就比较消耗性能
prefetch_related()的解决方法是,分别查询每个表,然后用Python处理他们之间的关系!?
都是为了减少SQL查询的数量


35. filter和exclude的区别?
filter是查询满足条件的数据
exclude是查询不满足添加的数据
def filter(self, *args, **kwargs)
# 条件查询(符合条件)
# 查出符合条件
# 条件可以是:参数,字典,Q

def exclude(self, *args, **kwargs)
# 条件查询(排除条件)
# 排除不想要的
# 条件可以是:参数,字典,Q

36. 列举django orm中三种能写sql语句的方法。
  原生SQL ---> connection
  from django.db import connection, connections
  cursor = connection.cursor() # cursor = connections['default'].cursor()
  cursor.execute("""SELECT * from auth_user where id = %s""", [1])
  row = cursor.fetchone() # fetchall()/fetchmany(..)
靠近原生SQL-->extra\raw
  extra
  - extra
   def extra(self, select=None, where=None, params=None, tables=None, order_by=None,
  select_params=None)
   # 构造额外的查询条件或者映射,如:子查询
   Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"},
   select_params=(1,))
   Entry.objects.extra(where=['headline=%s'], params=['Lennon'])
   Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"])
   Entry.objects.extra(select={'new_id': "select id from tb where id > %s"}, s
  elect_params=(1,), order_by=['-nid'])
  
  - raw
  def raw(self, raw_query, params=None, translations=None, using=None):
   # 执行原生SQL
   models.UserInfo.objects.raw('select * from userinfo')
   # 如果SQL是其他表时,必须将名字设置为当前UserInfo对象的主键列名
   models.UserInfo.objects.raw('select id as nid,name as title from 其他表')
   # 为原生SQL设置参数
   models.UserInfo.objects.raw('select id as nid from userinfo where nid>%s', params=[12,])
   # 将获取的到列名转换为指定列名
   name_map = {'first': 'first_name', 'last': 'last_name', 'bd': 'birth_date', 'pk': 'id'}
   Person.objects.raw('SELECT * FROM some_other_table', translations=name_map)
   # 指定数据库
   models.UserInfo.objects.raw('select * from userinfo', using="default")

37. django orm 中如何设置读写分离?
  
  方式一:手动使用queryset的using方法
  from django.shortcuts import render,HttpResponse
  from app01 import models
  def index(request):
  
   models.UserType.objects.using('db1').create(title='普通用户')
    # 手动指定去某个数据库取数据
   result = models.UserType.objects.all().using('db1')
   print(result)
  
   return HttpResponse('...')
  
  方式二:写配置文件
  class Router1:
    # 指定到某个数据库取数据
   def db_for_read(self, model, **hints):
   """
   Attempts to read auth models go to auth_db.
   """
   if model._meta.model_name == 'usertype':
   return 'db1'
   else:
   return 'default'
     # 指定到某个数据库存数据
   def db_for_write(self, model, **hints):
   """
   Attempts to write auth models go to auth_db.
   """
   return 'default'
  再写到配置
  DATABASES = {
   'default': {
   'ENGINE': 'django.db.backends.sqlite3',
   'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
   },
   'db1': {
   'ENGINE': 'django.db.backends.sqlite3',
   'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
   }
  }
  DATABASE_ROUTERS = ['db_router.Router1',]

38. F和Q的作用?
F:操作数据表中的某列值,F( )允许Django在未实际链接数据的情况下具有对数据库字段的值的引用,
不用获取对象放在内存中再对字段进行操作,直接执行原生产sql语句操作。
通常情况下我们在更新数据时需要先从数据库里将原数据取出后方在内存里,然后编辑某些属性,最后提交
Q:对对象进行复杂查询,并支持&(and),|(or),~(not)操作符。

39. values和values_list的区别?
values方法可以获取number字段的字典列表。
values_list可以获取number的元组列表。
values_list方法加个参数flat=True可以获取number的值列表。

def values(self, *fields):
# 获取每行数据为字典格式

def values_list(self, *fields, **kwargs):
# 获取每行数据为元祖

40. 如何使用django orm批量创建数据?
def bulk_create(self, objs, batch_size=None):
# 批量插入
# batch_size表示一次插入的个数
objs = [
models.DDD(name='r11'),
models.DDD(name='r22')
]
models.DDD.objects.bulk_create(objs, 10)

41. django的Form和ModeForm的作用?
- 作用:
- 对用户请求数据格式进行校验
- 自动生成HTML标签
- 区别:
- Form,字段需要自己手写。
class Form(Form):
xx = fields.CharField(.)
xx = fields.CharField(.)
xx = fields.CharField(.)
xx = fields.CharField(.)
- ModelForm,可以通过Meta进行定义
class MForm(ModelForm):
class Meta:
fields = "__all__"
model = UserInfo
- 应用:只要是客户端向服务端发送表单数据时,都可以进行使用,如:用户登录注册

42. django的Form组件中,如果字段中包含choices参数,请使用两种方式实现数据源实时更新。
方式一:重写构造方法,在构造方法中重新去数据库获取值
   class UserForm(Form):
   name = fields.CharField(label='用户名',max_length=32)
   email = fields.EmailField(label='邮箱')
   ut_id = fields.ChoiceField(
   # choices=[(1,'普通用户'),(2,'IP用户')]
   choices=[]
   )
  
   def __init__(self,*args,**kwargs):
   super(UserForm,self).__init__(*args,**kwargs)
  
   self.fields['ut_id'].choices = models.UserType.objects.all().values_list('id','title')
  
方式二: ModelChoiceField字段
   from django.forms import Form
   from django.forms import fields
   from django.forms.models import ModelChoiceField
   class UserForm(Form):
   name = fields.CharField(label='用户名',max_length=32)
   email = fields.EmailField(label='邮箱')
   ut_id = ModelChoiceField(queryset=models.UserType.objects.all())
  
   依赖:
   class UserType(models.Model):
   title = models.CharField(max_length=32)
  
   def __str__(self):
   return self.title

43. django的Model中的ForeignKey字段中的on_delete参数有什么作用?
on_delete有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五个可选择的值
CASCADE:此值设置,是级联删除。
PROTECT:此值设置,是会报完整性错误。
SET_NULL:此值设置,会把外键设置为null,前提是允许为null。
SET_DEFAULT:此值设置,会把设置为外键的默认值。
SET():此值设置,会调用外面的值,可以是一个函数。

44. django中csrf的实现机制
Django预防CSRF攻击的方法是在用户提交的表单中加入一个csrftoken的隐含值,这个值和服务器中保存的csrftoken的值相同,这样做的原理如下:
1、在用户访问django的可信站点时,django反馈给用户的表单中有一个隐含字段csrftoken,这个值是在服务器端随机生成的,每一次提交表单都会生成不同的值
2、当用户提交django的表单时,服务器校验这个表单的csrftoken是否和自己保存的一致,来判断用户的合法性
3、当用户被csrf攻击从其他站点发送精心编制的攻击请求时,由于其他站点不可能知道隐藏的csrftoken字段的信息这样在服务器端就会校验失败,攻击被成功防御
具体配置如下:template中添加{%csrf_token%}标签

45. django如何实现websocket?
利用dwebsocket在Django中使用Websocket
django中可以通过channel实现websocke

46. 基于django使用ajax发送post请求时,都可以使用哪种方法携带csrf token?
//方式一给每个ajax都加上上请求头
function Do1(){
$.ajax({
url:"/index/",
data:{id:1},
type:'POST',
       data:{csrfmiddlewaretoken:'{{ csrf_token }}',name:'alex'}
success:function(data){
console.log(data);
}
});
}
方式二:需要先下载jQuery-cookie,才能去cookie中获取token
function Do1(){
$.ajax({
url:"/index/",
data:{id:1},
type:'POST',
headers:{
'X-CSRFToken':$.cookie('csrftoken') // 去cookie中获取
},
success:function(data){
console.log(data);
}
});
}
方式三:搞个函数ajaxSetup,当有多的ajax请求,即会执行这个函数
$.ajaxSetup({
beforeSend:function (xhr,settings) {
xhr.setRequestHeader("X-CSRFToken",$.cookie('csrftoken'))
}
});

函数版本
<body>
<input type="button" onclick="Do1();" value="Do it"/>
<input type="button" onclick="Do2();" value="Do it"/>
<input type="button" onclick="Do3();" value="Do it"/>

<script src="/static/jquery-3.3.1.min.js"></script>
<script src="/static/jquery.cookie.js"></script>
<script>
$.ajaxSetup({
beforeSend: function(xhr, settings) {
xhr.setRequestHeader("X-CSRFToken", $.cookie('csrftoken'));
}
});

function Do1(){
$.ajax({
url:"/index/",
data:{id:1},
type:'POST',
success:function(data){
console.log(data);
}
});
}

function Do2(){
$.ajax({
url:"/index/",
data:{id:1},
type:'POST',
success:function(data){
console.log(data);
}
});
}

function Do3(){
$.ajax({
url:"/index/",
data:{id:1},
type:'POST',
success:function(data){
console.log(data);
}
});
}
</script>
</body>

47. django中如何实现orm表中添加数据时创建一条日志记录。

在settings.py中添加:
LOGGING = {
'disable_existing_loggers': False,
'version': 1,
'handlers': {
'console': {
# logging handler that outputs log messages to terminal
'class': 'logging.StreamHandler',
'level': 'DEBUG', # message level to be written to console
},
},
'loggers': {
'': {
# this sets root level logger to log debug and higher level
# logs to console. All other loggers inherit settings from
# root level logger.
'handlers': ['console'],
'level': 'DEBUG',
'propagate': False, # this tells logger to send logging message
# to its parent (will send if set to True)
},
'django.db': {
# # django also has database level logging
'handlers': ['console'],
'level': 'DEBUG',
'propagate': False,
},
},
}


48. django缓存如何设置?
三种粒度缓存
1 中间件级别
'django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
CACHE_MIDDLEWARE_SECONDS=10

2 视图级别
from django.views.decorators.cache import cache_page
@cache_page(15)
def index(request):
import time
t=time.time()
return render(request,"index.html",locals())

3 局部缓存
{% load cache %}
...
...
{% cache 15 "time_cache" %}
<h3>缓存时间:{{ t }}</h3>
{% endcache %}

49. django的缓存能使用redis吗?如果可以的话,如何配置?
   pip install django-redis
   apt-get install redis-serv
  
  在setting添加配置文件
  CACHES = {
   "default": {
   "BACKEND": "django_redis.cache.RedisCache", # 缓存类型
   "LOCATION": "127.0.0.1:6379", # ip端口
   "OPTIONS": {
   "CLIENT_CLASS": "django_redis.client.DefaultClient", #
   "CONNECTION_POOL_KWARGS": {"max_connections": 100} # 连接池最大连接数
   # "PASSWORD": "密码", }
   }
  }
  
  
  使用
  from django.shortcuts import render,HttpResponse
  from django_redis import get_redis_connection
  
  def index(request):
  # 根据名字去连接池中获取连接
  conn = get_redis_connection("default")
   conn.hset('n1','k1','v1') # 存数据
   return HttpResponse('...')

50. django路由系统中name的作用?
反向解析路由字符串
  路由系统中name的作用:反向解析
url(r'^home', views.home, name='home')
在模板中使用:{?%?url?'home'?%}
在视图中使用:reverse(“home”)
51. django的模板中filter和simple_tag的区别?
filter : 类似管道,只能接受两个参数第一个参数是|前的数据
simple_tag : 类似函数
1、模板继承:{?%?extends?'layouts.html'?%}
2、自定义方法
?? ? 'filter':只能传递两个参数,可以在if、for语句中使用
?? ? 'simple_tag':可以无线传参,不能在if for中使用
?? ? 'inclusion_tags':可以使用模板和后端数据
3、防xss攻击:?'|safe'、'mark_safe'
52. django-debug-toolbar的作用?
django_debug_toolbar 是django的第三方工具包,给django扩展了调试功能。
包括查看执行的sql语句,db查询次数,request,headers,调试概览等。
https://blog.csdn.net/weixin_39198406/article/details/78821677

53. django中如何实现单元测试?
对于每一个测试方法都会将setUp()和tearDown()方法执行一遍
会单独新建一个测试数据库来进行数据库的操作方面的测试,默认在测试完成后销毁。
在测试方法中对数据库进行增删操作,最后都会被清除。也就是说,在test_add中插入的数据,在test_add测试结 束后插入的数据会被清除。
django单元测试时为了模拟生产环境,会修改settings中的变量,例如, 把DEBUG变量修改为True, 把 ALLOWED_HOSTS修改为[*]。


54.解释orm中 db first 和 code first的含义?
db first: 先创建数据库,再更新表模型
code first:先写表模型,再更新数据库

datebase first就是代表数据库优先,那么前提就是先创建数据库。
model first就是代表model优先,那么前提也就是先创建model,然后根据model自动建立数据库。

55. django中如何根据数据库表生成model中的类?
1、修改seting文件,在setting里面设置要连接的数据库类型和名称、地址
2、运行下面代码可以自动生成models模型文件
- python manage.py inspectdb
3、创建一个app执行下下面代码:
- python manage.py inspectdb > app/models.py

56. 使用orm和原生sql的优缺点?
ORM框架:
  对象关系映射,通过创建一个类,这个类与数据库的表相对应!类的对象代指数据库中的一行数据。
简述ORM原理:
  让用户不再写SQL语句,而是通过类以及对象的方式,和其内部提供的方法,进行数据库操作!把用户输入的类或对象转换成SQL语句,转换之后通过pymysql执行完成数据库的操作。
ORM的优缺点:
优点:?
* 提高开发效率,降低开发成本?
* 使开发更加对象化?
* 可移植?
* 可以很方便地引入数据缓存之类的附加功能
缺点:?
* 在处理多表联查、where条件复杂之类的查询时,ORM的语法会变得复杂。就需要写入原生SQL

57. 简述MVC和MTV
MVC: 模型 视图 控制器
MTV: 模型 模板 视图

58. django的contenttype组件的作用?
django内置的ContentType组件就是帮我们做连表操作
如果一个表与其他表有多个外键关系,我们可以通过ContentType来解决这种关联
http://www.cnblogs.com/iyouyue/p/8810464.html

59. 谈谈你对restfull 规范的认识?
restful其实就是一套编写接口的协议,协议规定如何编写以及如何设置返回值、状态码等信息。?
最显著的特点:?
restful: 给用户一个url,根据method不同在后端做不同的处理,比如:post 创建数据、get获取数据、put和patch修改数据、delete删除数据。?
no rest: 给调用者很多url,每个url代表一个功能,比如:add_user/delte_user/edit_user/
当然,还有协议其他的,比如:?
版本,来控制让程序有多个版本共存的情况,版本可以放在 url、请求头(accept/自定义)、GET参数
状态码,200/300/400/500
url中尽量使用名词,restful也可以称为“面向资源编程”
api标示:?
api.YueNet.com?
www.YueNet.com/api/


60. 接口的幂等性是什么意思?
一个接口通过首先进行1次访问,然后对该接口进行N次相同访问的时候,对访问对象不造成影响,那么就认为接口具有幂等性。?
比如:?
* GET, 第一次获取数据、第二次也是获取结果,幂等。?
* POST, 第一次新增数据,第二次也会再次新增,非幂等。?
* PUT, 第一次更新数据,第二次不会再次更新,幂等。?
* PATCH,第一次更新数据,第二次可能再次更新,非幂等。?
* DELTE,第一次删除数据,第二次不会再次删除,幂等。


61. 什么是RPC?
RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

62. Http和Https的区别?
超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。
  为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS,为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
#Http: 80端口
#https: 443端口
# http信息是明文传输,https则是具有安全性的ssl加密传输协议。
#- 自定义证书
- 服务端:创建一对证书
- 客户端:必须携带证书
#- 购买证书
- 服务端: 创建一对证书,。。。。
- 客户端: 去机构获取证书,数据加密后发给咱们的服务单
- 证书机构:公钥给改机构

63、为什么要使用django rest framework框架?

1.客户端-服务端分离?
优点:提高用户界面的便携性,通过简化服务器提高可伸缩性….?
2.无状态(Stateless):从客户端的每个请求要包含服务器所需要的所有信息?
优点:提高可见性(可以单独考虑每个请求),提高了可靠性(更容易从局部故障中修复),提高可扩展性(降低了服务器资源使用)?
3.缓存(Cachable):服务器返回信息必须被标记是否可以缓存,如果缓存,客户端可能会重用之前的信息发送请求?
优点:减少交互次数,减少交互的平均延迟?
4.统一接口?
优点:提高交互的可见性,鼓励单独改善组件?
5.支持按需代码(Code-On-Demand 可选)?
优点:提高可扩展性

64、django rest framework框架中都有那些组件?

  #- 路由,自动帮助开发者快速为一个视图创建4个url
   www.oldboyedu.com/api/v1/student/$
   www.oldboyedu.com/api/v1/student(?P<format>\w+)$
   www.oldboyedu.com/api/v1/student/(?P<pk>\d+)/$
   www.oldboyedu.com/api/v1/student/(?P<pk>\d+)(?P<format>\w+)$
  #- 版本处理
   - 问题:版本都可以放在那里?
   - url
   - GET
   - 请求头
  #- 认证
   - 问题:认证流程?
  #- 权限
   - 权限是否可以放在中间件中?以及为什么?
  #- 访问频率的控制 匿名用户可以真正的防止?无法做到真正的访问频率控制,只能把小白拒之门外。
   如果要封IP,使用防火墙来做。
   登录用户可以通过用户名作为唯一标示进行控制,如果有人注册很多账号,则无法防止。
  #- 视图
  #- 解析器 ,根据Content-Type请求头对请求体中的数据格式进行处理。request.data
  #- 分页
  #- 序列化
   - 序列化
   - source
   - 定义方法
   - 请求数据格式校验
  #- 渲染器?

65、django rest framework框架中的视图都可以继承哪些类?
a. 继承APIView(最原始)但定制性比较强
这个类属于rest framework中的顶层类,内部帮助我们实现了只是基本功能:认证、权限、频率控制,
但凡是数据库、分页等操作都需要手动去完成,比较原始。
class GenericAPIView(APIView)
def post(...):
pass

b.继承GenericViewSet(ViewSetMixin,generics.GenericAPIView)
  首先他的路由就发生变化
如果继承它之后,路由中的as_view需要填写对应关系
  在内部也帮助我们提供了一些方便的方法:
  get_queryset
  get_object
  get_serializer
  get_serializer_class
  get_serializer_context
  filter_queryset
注意:要设置queryset字段,否则会抛出断言的异常。

代码
只提供增加功能 只继承GenericViewSet

class TestView(GenericViewSet):
  serialazer_class = xxx
  def creat(self,*args,**kwargs):
    pass # 获取数据并对数据
c. 继承 modelviewset --> 快速快发
    -ModelViewSet(增删改查全有+数据库操作)
    -mixins.CreateModelMixin(只有增),GenericViewSet
    -mixins.CreateModelMixin,DestroyModelMixin,GenericViewSet
  对数据库和分页等操作不用我们在编写,只需要继承相关类即可。
  
示例:只提供增加功能
class TestView(mixins.CreateModelMixin,GenericViewSet):
    serializer_class = XXXXXXX
***
  modelviewset --> 快速开发,复杂点的genericview、apiview

66、简述 django rest framework框架的认证流程。

如何编写?写类并实现authticate
方法中可以定义三种返回值:?
(user,auth),认证成功
None , 匿名用户
异常 ,认证失败
流程:?
dispatch
再去request中进行认证处理

67、django rest framework如何实现的用户访问频率控制?
  a. 基于用户IP限制访问频率
  b. 基于用户IP显示访问频率(利于Django缓存) 
  c. view中限制请求频率
  d. 匿名时用IP限制+登录时用Token限制
  # 对匿名用户,根据用户IP或代理IP作为标识进行记录,为每个用户在redis中建一个列表 {
   throttle_1.1.1.1:[1526868876.497521,152686885.497521...],
   throttle_1.1.1.2:[1526868876.497521,152686885.497521...],
   throttle_1.1.1.3:[1526868876.497521,152686885.497521...],
   }
   每个用户再来访问时,需先去记录中剔除过期记录,再根据列表的长度判断是否可以继续访问。
   '如何封IP':在防火墙中进行设置
  --------------------------------------------------------------------------
  # 对注册用户,根据用户名或邮箱进行判断。 {
   throttle_xxxx1:[1526868876.497521,152686885.497521...],
   throttle_xxxx2:[1526868876.497521,152686885.497521...],
   throttle_xxxx3:[1526868876.497521,152686885.497521...],
   }
  每个用户再来访问时,需先去记录中剔除过期记录,再根据列表的长度判断是否可以继续访问。
  \如1分钟:40次,列表长度限制在40,超过40则不可访问

68、Flask框架的优势?
  一、整体设计方面
  首先,两者都是非常优秀的框架。整体来讲,两者设计的哲学是区别最大的地方。Django提供一站式的解决方案,从模板、ORM、Session、Authentication等等都分配好了,连app划分都做好了,总之,为你做尽量多的事情,而且还有一个killer级的特性,就是它的admin,配合django-suit,后台就出来了,其实最初Django就是由在新闻发布公司工作的人设计的。Flask只提供了一些核心功能,非常简洁优雅。它是一个微框架,其他的由扩展提供,但它的blueprint使它也能够很方便的进行水平扩展。
  二、路由设计
  Django的路由设计是采用集中处理的方法,利用正则匹配。Flask也能这么做,但更多的是使用装饰器的形式,这个有优点也有缺点,优点是读源码时看到函数就知道怎么用的,缺点是一旦源码比较长,你要查路由就不太方便了,但这也促使你去思考如何更合理的安排代码。
  三、应用模块化设计
  Django的模块化是集成在命令里的,也就是说一开始Django的目标就是为以后玩大了做准备的。每个都是一个独立的模块,为以后的复用提供了便利。Flask通过Blueprint来提供模块化,自己对项目结构划分成不同的模块进行组织。

69、Flask框架依赖组件?
  Route(路由)
templates(模板)
Models(orm模型)
blueprint(蓝图)
Jinja2模板引擎
依赖werkzurg协议
  
70、Flask蓝图的作用?
  将不同的功能模块化
构建大型应用
优化项目结构
增强可读性,易于维护(跟Django的view功能相似)
  # blueprint把实现不同功能的module分开.也就是把一个大的App分割成各自实现不同功能的module.
  # 在一个blueprint中可以调用另一个blueprint的视图函数, 但要加相应的blueprint名.
  
71、列举使用过的Flask第三方组件?

内置:?- 配置?- 路由?- 视图?- 模板?- session?- 闪现?- 蓝图?- 中间件?- 特殊装饰器?
第三方:?- Flask组件:?- flask-session?- flask-SQLAlchemy?- flask-migrate?
  - flask-script?- blinker?-
公共组件:?- wtforms?- dbutile?- sqlalchemy?- 自定义Flask组件?- auth ,参考flask- login组件

72、简述Flask上下文管理流程?

a、简单来说,falsk上下文管理可以分为三个阶段:
  1、'请求进来时':将请求相关的数据放入上下问管理中
  2、'在视图函数中':要去上下文管理中取值
  3、'请求响应':要将上下文管理中的数据清除
# b、详细点来说:
  1、'请求刚进来':
????????将request,session封装在RequestContext类中
????????app,g封装在AppContext类中
????????并通过LocalStack将requestcontext和appcontext放入Local类中
  2、'视图函数中':
????????通过localproxy--->偏函数--->localstack--->local取值
  3、'请求响应时':
????????先执行save.session()再各自执行pop(),将local中的数据清除

73、Flask中的g的作用?
g是贯穿于一次请求的全局变量,当请求进来将g和current_app封装为一个APPContext类,再通过LocalStack将Appcontext放入Local中,取值时通过偏函数在LocalStack、local中取值;响应时将local中的g数据删除

74、Flask中上下文管理主要涉及到了那些相关的类?并描述类主要作用?
  
RequestContext #封装进来的请求(赋值给ctx)
AppContext #封装app_ctx
LocalStack #将local对象中的数据维护成一个栈(先进后出)
Local?? ?#保存请求上下文对象和app上下文对象

75、为什么要Flask把Local对象中的的值stack 维护成一个列表?
# 因为通过维护成列表,可以实现一个栈的数据结构,进栈出栈时只取一个数据,巧妙的简化了问题。
# 还有,在多app应用时,可以实现数据隔离;列表里不会加数据,而是会生成一个新的列表
# local是一个字典,字典里key(stack)是唯一标识,value是一个列表

76、Flask中多app应用是怎么完成?

请求进来时,可以根据URL的不同,交给不同的APP处理。蓝图也可以实现。
????#app1 = Flask('app01')
????#app2 = Flask('app02')
????#@app1.route('/index')
????#@app2.route('/index2')
源码中在DispatcherMiddleware类里调用app2.__call__,
原理其实就是URL分割,然后将请求分发给指定的app。
之后app也按单app的流程走。就是从app.__call__走。

77、在Flask中实现WebSocket需要什么组件?

Flask-SocketIO
Flask-Sockets是Flask框架的一个扩展,通过它,Flask应用程序可以使用WebSocket。
gevent-websocket

78、wtforms组件的作用?
  WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证。

79、Flask框架默认session处理机制?
  Flask的默认session利用了Werkzeug的SecureCookie,把信息做序列化(pickle)后编码(base64),放到cookie里了。

过期时间是通过cookie的过期时间实现的。

为了防止cookie内容被篡改,session会自动打上一个叫session的hash串,这个串是经过session内容、SECRET_KEY计算出来的,看得出,这种设计虽然不能保证session里的内容不泄露,但至少防止了不被篡改。

80、解释Flask框架中的Local对象和threading.local对象的区别?
# a.threading.local作用:为每个线程开辟一块空间进行数据存储(数据隔离)。

问题:自己通过字典创建一个类似于threading.local的东西。
storage = {
4740: {val: 0},
4732: {val: 1},
4731: {val: 3},
}

# b.自定义Local对象作用:为每个线程(协程)开辟一块空间进行数据存储(数据隔离)。
class Local(object):
def __init__(self):
object.__setattr__(self, 'storage', {})
def __setattr__(self, k, v):
ident = get_ident()
if ident in self.storage:
self.storage[ident][k] = v
else:
self.storage[ident] = {k: v}
def __getattr__(self, k):
ident = get_ident()
return self.storage[ident][k]
obj = Local()
def task(arg):
obj.val = arg
obj.xxx = arg
print(obj.val)
for i in range(10):
t = Thread(target=task, args=(i,))
t.start()
81、Flask中 blinker 是什么?
  Flask框架中的信号基于blinker,可以让开发者在flask请求过程中 定制一些用户行为执行。?
在请求前后,模板渲染前后,上下文前后,异常 的时候

82、SQLAlchemy中的 session和scoped_session 的区别?
  使用scoped_session的目的主要是为了线程安全。?
scoped_session类似单例模式,当我们调用使用的时候,会先在Registry里找找之前是否已经创建session了。?
要是有,就把这个session返回。?
要是没有,就创建新的session,注册到Registry中以便下次返回给调用者。?
这样就实现了这样一个目的:在同一个线程中,call scoped_session 的时候,返回的是同一个对象

83、SQLAlchemy如何执行原生SQL?

from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker engine = create_engine('mysql://root:*****@127.0.0.1/database?charset=utf8') DB_Session = sessionmaker(bind=engine) session = DB_Session() session.execute('alter table mytablename drop column mycolumn ;')

84、ORM的实现原理?

  概念: 对象关系映射(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。
  详细介绍: 让我们从O/R开始。字母O起源于”对象”(Object),而R则来自于”关系”(Relational)。几乎所有的程序里面,都存在对象和关系数据库。在业务逻辑层和用户界面层中,我们是面向对象的。当对象信息发生变化的时候,我们需要把对象的信息保存在关系数据库中。
  当你开发一个应用程序的时候(不使用O/R Mapping),你可能会写不少数据访问层的代码,用来从数据库保存,删除,读取对象信息,等等。你在DAL中写了很多的方法来读取对象数据,改变状态对象等等任务。而这些代码写起来总是重复的。?
  ORM解决的主要问题是对象关系的映射。域模型和关系模型分别是建立在概念模型的基础上的。域模型是面向对象的,而关系模型是面向关系的。一般情况下,一个持久化类和一个表对应,类的每个实例对应表中的一条记录,类的每个属性对应表的每个字段。
  
  ORM技术特点:?
  * 提高了开发效率。由于ORM可以自动对Entity对象与数据库中的Table进行字段与属性的映射,所以我们实际可能已经不需要一个专用的、庞大的数据访问层。?
  * ORM提供了对数据库的映射,不用sql直接编码,能够像操作对象一样从数据库获取数据。

85、DBUtils模块的作用?
  使用DBUtils模块
  两种使用模式:?
  1. 为每个线程创建一个连接,连接不可控,需要控制线程数?
  1. 创建指定数量的连接在连接池,当线程访问的时候去取,如果不够了线程排队,直到有人释放。平时建议使用这种!
  
86、以下SQLAlchemy的字段是否正确?如果不正确请更正:

  fromdatetime importdatetimefromsqlalchemy.ext.declarativeimportdeclarative_basefromsqlalchemy importColumn, Integer, String, DateTimeBase = declarative_base()classUserInfo(Base): __tablename__ = 'userinfo' id = Column(Integer, primary_key= True, autoincrement= True) name = Column(String( 64), unique= True) ctime = Column(DateTime, default=datetime.now())ctime字段中的参数应该为default=datetime.now, now后面不应该加括号.如果加了,字段不会随时更新

87、SQLAchemy中如何为表设置引擎和字符编码?

sqlalchemy设置编码字符集一定要在数据库访问的URL上增加charset=utf8,否则数据库的连接就不是utf8的编码格式?
eng = create_engine(‘mysql://root:root@localhost:3306/test2?charset=utf8’,echo=True)

88. SQLAlchemy中如何设置联合唯一索引?
UniqueConstraint 设置联合唯一索引

89、简述Tornado框架的特点。

Tornado的独特之处在于其所有开发工具能够使用在应用开发的任意阶段以及任何档次的硬件资源上。而且,完整集的Tornado工具可以使开发人员完全不用考虑与目标连接的策略或目标存储区大小。

Tornado 结构的专门设计为开发人员和第三方工具厂商提供了一个开放环境。已有部分应用程序接口可以利用并附带参考书目,内容从开发环境接口到连接实现。Tornado包括强大的开发和调试工具,尤其适用于面对大量问题的嵌入式开发人员。这些工具包括C和C++源码级别的调试器,目标和工具管理,系统目标跟踪,内存使用分析和自动配置. 另外,所有工具能很方便地同时运行,很容易增加和交互式开发。

90、简述Tornado框架中Future对象的作用?
# 实现异步非阻塞视图函数yield一个futrue对象,futrue对象默认:
self._done = False ,请求未完成
self._result = None ,请求完成后返回值,用于传递给回调函数使用。

tornado就会一直去检测futrue对象的_done是否已经变成True。

如果IO请求执行完毕,自动会调用future的set_result方法:
self._result = result
self._done = True

91. Tornado框架中如何编写WebSocket程序?
  Tornado在websocket模块中提供了一个WebSocketHandler类。
  这个类提供了和已连接的客户端通信的WebSocket事件和方法的钩子。
  当一个新的WebSocket连接打开时,open方法被调用,
  而on_message和on_close方法,分别在连接、接收到新的消息和客户端关闭时被调用。
  
  此外,WebSocketHandler类还提供了write_message方法用于向客户端发送消息,close方法用于关闭连接。

92、Tornado中静态文件是如何处理的?如:?<link href="{{static_url("commons.css")}}" rel="stylesheet" />

  # settings.py
  settings = {
   "static_path": os.path.join(os.path.dirname(__file__), "static"),
   # 指定了静态文件的位置在当前目录中的"static"目录下
   "cookie_secret": "61oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o/Vo=",
   "login_url": "/login",
   "xsrf_cookies": True,
  }
  
  经上面配置后
  static_url()自动去配置的路径下找'commons.css'文件

93、Tornado操作MySQL使用的模块?
  torndb是一个轻量级的基于MySQLdb封装的一个模块,从tornado3.0版本以后,其已经作为一个独立模块发行了。torndb依赖于MySQLdb模块,因此,在使用torndb模块时,要保证系统中已经有MySQLdb模块。

94、Tornado操作redis使用的模块?
  tornado-redis
95、简述Tornado框架的适用场景?

Tornado是使用Python编写的一个强大的、可扩展的Web服务器。它在处理严峻的网络流量时表现得足够强健,但却在创建和编写时有着足够的轻量级,并能够被用在大量的应用和工具中。

我们现在所知道的Tornado是基于Bret Taylor和其他人员为FriendFeed所开发的网络服务框架,当FriendFeed被Facebook收购后得以开源。不同于那些最多只能达到10,000个并发连接的传统网络服务器,Tornado在设计之初就考虑到了性能因素,旨在解决C10K问题,这样的设计使得其成为一个拥有非常高性能的框架。此外,它还拥有处理安全性、用户验证、社交网络以及与外部服务(如数据库和网站API)进行异步交互的工具。

96. git常见命令作用

某个文件夹中的内容进行版本管理:
进入文件夹,右键git bash
git init 初始化,当前所在的文件夹可以被管理且以后版本相关的数据都会存储到.git文件中
git status 查看当前文件夹以及子目录中文件是否发生变化:内容修改/新增文件/删除,已经变化的文件会变成红色,已经add的文件会变成绿色
git add . 给发生变化的文件(贴上一个标签)或 将发生变化的文件放到某个地方,只写一个句点符就代表把git status中红色的文件全部打上标签
git commit -m ‘新增用户登录认证功能以及xxx功能’ 将“绿色”文件添加到版本中
git log 查看所有版本提交记录,可以获取版本号
git reset –hard 版本号 将最新的版本回退到更早的版本
git reflog 回退到之前版本后悔了,再更新到最新或者最新之前的版本
git reset –hard 版本 回退

97. 简述以下git中stash命令作用以及相关其他命令。

stash用于将工作区发生变化的所有文件获取临时存储在“某个地方”,将工作区还原当前版本未操作前的状态;stash还可以将临时存储在“某个地方”的文件再次拿回到工作区。

git stash 将当前工作区所有修改过的内容存储到“某个地方”,将工作区还原到当前版本未修改过的状态
git stash list 查看“某个地方”存储的所有记录
git stash clear 清空“某个地方”
git stash pop 将第一个记录从“某个地方”重新拿到工作区(可能有冲突)
git stash apply 编号, 将指定编号记录从“某个地方”重新拿到工作区(可能有冲突)
git stash drop 编号,删除指定编号的记录

98. git 中 merge 和 rebase命令 的区别。
  merge:
  会将不同分支的提交合并成一个新的节点,之前的提交分开显示,
  注重历史信息、可以看出每个分支信息,基于时间点,遇到冲突,手动解决,再次提交
  rebase:
  将两个分支的提交结果融合成线性,不会产生新的节点;
  注重开发过程,遇到冲突,手动解决,继续操作
  
99. 公司如何基于git做的协同开发?
  1、你们公司的代码review分支怎么做?谁来做?
  答:组长创建review分支,我们小功能开发完之后,合并到review分支交给老大(小组长)来看,
  1.1、你组长不开发代码吗?
   他开发代码,但是它只开发核心的东西,任务比较少。或者抽出时间,我们一起做这个事情
  2、你们公司协同开发是怎么协同开发的?
  每个人都有自己的分支,阶段性代码完成之后,合并到review,然后交给老大看
  --------------------------------------------------------------------------
  # 大致工作流程公司:
   下载代码
   git clone https://gitee.com/wupeiqi/xianglong.git
   或创建目录
   cd 目录
   git init
   git remote add origin https://gitee.com/wupeiqi/xianglong.git
   git pull origin maste
   创建dev分支
   git checkout dev
   git pull origin dev
   继续写代码
   git add .
   git commit -m '提交记录'
   git push origin dev
  回家:
   拉代码:
   git pull origin dev
   继续写:
   继续写代码
   git add .
   git commit -m '提交记录'
   git push origin dev
100、如何基于git实现代码review?
  利用github/gitlab自带的在线Diff展示功能做。
  https://blog.csdn.net/maray/article/details/50206927

101. git如何实现v1.0 、v2.0 等版本的管理?
在命令行中,使用“git tag –a tagname –m “comment”可以快速创建一个标签。
需要注意,命令行创建的标签只存在本地Git库中,还需要使用Git push –tags指令发 布到服务器的Git库中

102. 什么是gitlab?
gitlab是公司自己搭建的项目代码托管平台
  GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。安装方法是参考GitLab在GitHub上的Wiki页面。

103、github和gitlab的区别?

  先说一下相同点,二者都是基于web的Git仓库,在很大程度上GitLab是仿照GitHub来做的,它们都提供了分享开源项目的平台,为开发团队提供了存储、分享、发布和合作开发项目的中心化云存储的场所。
  GitHub作为开源代码库及版本控制系统,拥有超过900万的开发者用户,目前仍然是最火的开源项目托管系统。GitHub同时提供公共仓库和私有仓库,但如果要使用私有仓库,是需要付费的。
  而GitLab解决了这个问题,你可以在上面创建私人的免费仓库。
  GitLab让开发团队对他们的代码仓库拥有更多的控制,相比于GitHub,它有不少的特色:
  允许免费设置仓库权限;允许用户选择分享一个project的部分代码;允许用户设置project的获取权限,进一步的提升安全性;可以设置获取到团队整体的改进进度;通过innersourcing让不在权限范围内的人访问不到该资源。
  从代码私有性方面来看,有时公司并不希望员工获取到全部的代码,这个时候GitLab无疑是更好的选择。但对于开源项目而言,GitHub依然是代码托管的首选。

104、如何为github上牛逼的开源项目贡献代码?

  1、fork需要协作项目
  2、克隆/关联fork的项目到本地
  3、新建分支(branch)并检出(checkout)新分支
  4、在新分支上完成代码开发
  5、开发完成后将你的代码合并到master分支
  6、添加原作者的仓库地址作为一个新的仓库地址
  7、合并原作者的master分支到你自己的master分支,用于和作者仓库代码同步
  8、push你的本地仓库到GitHub
  9、在Github上提交 pull requests
  10、等待管理员(你需要贡献的开源项目管理员)处理

105、git中 .gitignore文件的作用?

  一般来说每个Git项目中都需要一个“.gitignore”文件,
  这个文件的作用就是告诉Git哪些文件不需要添加到版本管理中。
  实际项目中,很多文件都是不需要版本管理的,比如Python的.pyc文件和一些包含密码的配置文件等等。
106. 什么是敏捷开发?
  敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。在敏捷开发中,软件项目在构建初期被切分成多个子项目,各个子项目的成果都经过测试,具备可视、可集成和可运行使用的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。
119、简述 requests模块的作用及基本使用?
  使用requests可以模拟浏览器发送的请求
  发送get请求:requests.get()
  发送post请求:requests.post()
  读取请求返回内容:requests.text()
  保存cookie:requests.cookie()
  # 作用:使用requests可以模拟浏览器的请求
  # 常用参数: url、headers、cookies、data
   json、params、proxy
  # 常用返回值: content
   iter_content
   text
   encoding="utf-8"
   cookie.get_dict()
  
120、简述 beautifulsoup模块的作用及基本使用?

  # BeautifulSoup用于从HTML或XML文件中提取、过滤想要的数据形式
  #常用方法解析:html.parser 或者 lxml(需要下载安装)
   find、find_all、text、attrs、get

121、简述 seleninu模块的作用及基本使用?

  selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题
  selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器

122、scrapy框架中各组件的工作流程?
Scrapy Engine(引擎):
  负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。
Scheduler(调度器): 它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
Downloader(下载器):
 负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理,
Spider(爬虫):
 它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器),
Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方.
Downloader Middlewares(下载中间件):
  你可以当作是一个可以自定义扩展下载功能的组件。
Spider Middlewares(Spider中间件):
  你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)
#1、生成初始的Requests来爬取第一个URLS,并且标识一个回调函数第一个请求定义在start_requests()方法内默认从start_urls列表中获得url地址来生成Request请求,
默认的回调函数是parse方法。回调函数在下载完成返回response时自动触发
#2、在回调函数中,解析response并且返回值返回值可以4种:
a、包含解析数据的字典
b、Item对象
c、新的Request对象(新的Requests也需要指定一个回调函数)
d、或者是可迭代对象(包含Items或Request)
#3、在回调函数中解析页面内容通常使用Scrapy自带的Selectors,但很明显你也可以使用Beutifulsoup,lxml或其他你爱用啥用啥。
#4、最后,针对返回的Items对象将会被持久化到数据库 通过Item Pipeline组件存到数据库
或者导出到不同的文件(通过Feed exports)

123、在scrapy框架中如何设置代理(两种方法)?

  方式一:内置添加代理功能
  # -*- coding: utf-8 -*-
  import os
  import scrapy
  from scrapy.http import Request
  
  class ChoutiSpider(scrapy.Spider):
   name = 'chouti'
   allowed_domains = ['chouti.com']
   start_urls = ['https://dig.chouti.com/']
  
   def start_requests(self):
   os.environ['HTTP_PROXY'] = "http://192.168.11.11"
  
   for url in self.start_urls:
   yield Request(url=url,callback=self.parse)
  
   def parse(self, response):
   print(response)
  
  方式二:自定义下载中间件
  import random
  import base64
  import six
  def to_bytes(text, encoding=None, errors='strict'):
   """Return the binary representation of `text`. If `text`
   is already a bytes object, return it as-is."""
   if isinstance(text, bytes):
   return text
   if not isinstance(text, six.string_types):
   raise TypeError('to_bytes must receive a unicode, str or bytes '
   'object, got %s' % type(text).__name__)
   if encoding is None:
   encoding = 'utf-8'
   return text.encode(encoding, errors)
  
  class MyProxyDownloaderMiddleware(object):
   def process_request(self, request, spider):
   proxy_list = [
   {'ip_port': '111.11.228.75:80', 'user_pass': 'xxx:123'},
   {'ip_port': '120.198.243.22:80', 'user_pass': ''},
   {'ip_port': '111.8.60.9:8123', 'user_pass': ''},
   {'ip_port': '101.71.27.120:80', 'user_pass': ''},
   {'ip_port': '122.96.59.104:80', 'user_pass': ''},
   {'ip_port': '122.224.249.122:8088', 'user_pass': ''},
   ]
   proxy = random.choice(proxy_list)
   if proxy['user_pass'] is not None:
   request.meta['proxy'] = to_bytes("http://%s" % proxy['ip_port'])
   encoded_user_pass = base64.encodestring(to_bytes(proxy['user_pass']))
   request.headers['Proxy-Authorization'] = to_bytes('Basic ' + encoded_user_pass)
   else:
   request.meta['proxy'] = to_bytes("http://%s" % proxy['ip_port'])
  
  
  
  配置:
   DOWNLOADER_MIDDLEWARES = {
   # 'xiaohan.middlewares.MyProxyDownloaderMiddleware': 543,
   }


124、scrapy框架中如何实现大文件的下载?
  from twisted.web.client import Agent, getPage, ResponseDone, PotentialDataLoss
  from twisted.internet import defer, reactor, protocol
  from twisted.web._newclient import Response
  from io import BytesIO
  
  class _ResponseReader(protocol.Protocol):
   def __init__(self, finished, txresponse, file_name):
   self._finished = finished
   self._txresponse = txresponse
   self._bytes_received = 0
   self.f = open(file_name, mode='wb')
   def dataReceived(self, bodyBytes):
   self._bytes_received += len(bodyBytes)
   # 一点一点的下载 self.f.write(bodyBytes)
   self.f.flush()
   def connectionLost(self, reason):
   if self._finished.called:
   return
   if reason.check(ResponseDone):
   # 下载完成
   self._finished.callback((self._txresponse, 'success'))
   elif reason.check(PotentialDataLoss):
   # 下载部分
   self._finished.callback((self._txresponse, 'partial'))
   else:
   # 下载异常 self._finished.errback(reason)
   self.f.close()

125、scrapy中如何实现限速?
修改setting文件的AUTOTHROTTLE_START_DELAY 打开后默认限速为5秒

126、scrapy中如何实现暂定爬虫?

  在cmd上cd 进入项目
  然后在项目目录下创建 记录文件:remain/001
  然后输入:scrapy crawl zhihu -s JOBDIR=remain/001
  回车运行就行了
  按ctrl+c 暂停
  继续运行只要再次输入:scrapy crawl zhihu -s JOBDIR=remain/001就行了
  需要重新爬取就换个文件 002就行了

127、scrapy中如何进行自定制命令?

  在spiders同级创建任意目录,如:commands
  在其中创建'crawlall.py'文件(此处文件名就是自定义的命令)
  from scrapy.commands import ScrapyCommand
   from scrapy.utils.project import get_project_settings
   class Command(ScrapyCommand):
   requires_project = True
   def syntax(self):
   return '[options]'
   def short_desc(self):
   return 'Runs all of the spiders'
   def run(self, args, opts):
   spider_list = self.crawler_process.spiders.list()
   for name in spider_list:
   self.crawler_process.crawl(name, **opts.__dict__)
   self.crawler_process.start()
  在'settings.py'中添加配置'COMMANDS_MODULE = '项目名称.目录名称''
  在项目目录执行命令:'scrapy crawlall'

128、scrapy中如何实现的记录爬虫的深度?
  'DepthMiddleware'是一个用于追踪每个Request在被爬取的网站的深度的中间件。
  其可以用来限制爬取深度的最大深度或类似的事情。
  'DepthMiddleware'可以通过下列设置进行配置(更多内容请参考设置文档):
  
  'DEPTH_LIMIT':爬取所允许的最大深度,如果为0,则没有限制。
  'DEPTH_STATS':是否收集爬取状态。
  'DEPTH_PRIORITY':是否根据其深度对requet安排优先
129、scrapy中的pipelines工作原理?
  Scrapy 提供了 pipeline 模块来执行保存数据的操作。
  在创建的 Scrapy 项目中自动创建了一个 pipeline.py 文件,同时创建了一个默认的 Pipeline 类。我们可以根据需要自定义 Pipeline 类,然后在 settings.py 文件中进行配置即可

130、scrapy的pipelines如何丢弃一个item对象?
  通过raise DropItem()方法
  到pipelines的时候不执行持久化保存就会什么也不执行也就是丢弃
131、简述scrapy中爬虫中间件和下载中间件的作用?
  下载器中间件(Downloader Middlewares)
  位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
  爬虫中间件(Spider Middlewares)
  介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。
132、scrapy-redis组件的作用?
实现了分布式爬虫,url去重、调度器、数据持久化
  scheduler - 调度器
dupefilter - URL去重规则(被调度器使用)
pipeline - 数据持久化

133、scrapy-redis组件中如何实现的任务的去重?
a.?内部进行配置,连接Redis
b.去重规则通过redis的集合完成,集合的Key为:
???key?=?defaults.DUPEFILTER_KEY?%?{'timestamp':?int(time.time())}
???默认配置:
??????DUPEFILTER_KEY?=?'dupefilter:%(timestamp)s'
c.去重规则中将url转换成唯一标示,然后在redis中检查是否已经在集合中存在
???from?scrapy.utils?import?request
???from?scrapy.http?import?Request
???req?=?Request(url='http://www.cnblogs.com/wupeiqi.html')
???result?=?request.request_fingerprint(req)
???print(result) ?# 8ea4fd67887449313ccc12e5b6b92510cc53675c
scrapy和scrapy-redis的去重规则(源码)
1. scrapy中去重规则是如何实现?
class RFPDupeFilter(BaseDupeFilter):
"""Request Fingerprint duplicates filter"""

def __init__(self, path=None, debug=False):
self.fingerprints = set()

@classmethod
def from_settings(cls, settings):
debug = settings.getbool('DUPEFILTER_DEBUG')
return cls(job_dir(settings), debug)
def request_seen(self, request):
# 将request对象转换成唯一标识。
fp = self.request_fingerprint(request)
# 判断在集合中是否存在,如果存在则返回True,表示已经访问过。
if fp in self.fingerprints:
return True
# 之前未访问过,将url添加到访问记录中。
self.fingerprints.add(fp)
def request_fingerprint(self, request):
return request_fingerprint(request)
2. scrapy-redis中去重规则是如何实现?
class RFPDupeFilter(BaseDupeFilter):
"""Redis-based request duplicates filter.
This class can also be used with default Scrapy's scheduler.
"""
logger = logger
def __init__(self, server, key, debug=False):
# self.server = redis连接
self.server = server
# self.key = dupefilter:123912873234
self.key = key

@classmethod
def from_settings(cls, settings):
# 读取配置,连接redis
server = get_redis_from_settings(settings)
# key = dupefilter:123912873234
key = defaults.DUPEFILTER_KEY % {'timestamp': int(time.time())}
debug = settings.getbool('DUPEFILTER_DEBUG')
return cls(server, key=key, debug=debug)

@classmethod
def from_crawler(cls, crawler):
return cls.from_settings(crawler.settings)
def request_seen(self, request):
fp = self.request_fingerprint(request)
# This returns the number of values added, zero if already exists.
# self.server=redis连接
# 添加到redis集合中:1,添加工程;0,已经存在
added = self.server.sadd(self.key, fp)
return added == 0
def request_fingerprint(self, request):
return request_fingerprint(request)
def close(self, reason=''):
self.clear()
def clear(self):
"""Clears fingerprints data."""
self.server.delete(self.key)
134、scrapy-redis的调度器如何实现任务的深度优先和广度优先
简述 jenkins 工具的作用?
  'Jenkins'是一个可扩展的持续集成引擎。
  主要用于:
   持续、自动地构建/测试软件项目。
   监控一些定时执行的任务。
公司如何实现代码发布?
nginx+uwsgi+django
简述 RabbitMQ、Kafka、ZeroMQ的区别?
  RabbitMQ如何在消费者获取任务后未处理完前就挂掉时,保证数据不丢失?
  为了预防消息丢失,rabbitmq提供了ack
  即工作进程在收到消息并处理后,发送ack给rabbitmq,告知rabbitmq这时候可以把该消息从队列 中删除了。
  如果工作进程挂掉 了,rabbitmq没有收到ack,那么会把该消息 重新分发给其他工作进程。
  不需要设置timeout,即使该任务需要很长时间也可以处理。
  
  ack默认是开启的,工作进程显示指定了no_ack=True
RabbitMQ如何对消息做持久化?
  1、创建队列和发送消息时将设置durable=Ture,如果在接收到消息还没有存储时,消息也有可能丢失,就必须配置publisher confirm
   channel.queue_declare(queue='task_queue', durable=True)
  2、返回一个ack,进程收到消息并处理完任务后,发给rabbitmq一个ack表示任务已经完成,可以删除该任务
  3、镜像队列:将queue镜像到cluster中其他的节点之上。
  在该实现下,如果集群中的一个节点失效了,queue能自动地切换到镜像中的另一个节点以保证服务的可用法。
RabbitMQ如何控制消息被消费的顺序?
  默认消息队列里的数据是按照顺序被消费者拿走,
  例如:消费者1 去队列中获取奇数序列的任务,消费者2去队列中获取偶数序列的任务。
  channel.basic_qos(prefetch_count=1)
  表示谁来谁取,不再按照奇偶数排列(同时也保证了公平的消费分发)
以下RabbitMQ的exchange type分别代表什么意思?如:fanout、direct、topic
  amqp协议中的核心思想就是生产者和消费者隔离,生产者从不直接将消息发送给队列。
  生产者通常不知道是否一个消息会被发送到队列中,只是将消息发送到一个交换机。
  先由Exchange来接收,然后Exchange按照特定的策略转发到Queue进行存储。
  同理,消费者也是如此。Exchange 就类似于一个交换机,转发各个消息分发到相应的队列中。
  type=fanout 类似发布者订阅者模式,会为每一个订阅者创建一个队列,而发布者发布消息时,会将消息放置在所有相关队列中
  type=direct 队列绑定关键字,发送者将数据根据关键字发送到消息exchange,exchange根据 关键字 判定应该将数据发送至指定队列。
  type=topic 队列绑定几个模糊的关键字,之后发送者将数据发送到exchange,exchange将传入”路由值“和 ”关键字“进行匹配,匹配成功,
则将数据发送到指定队列。
  发送者路由值 队列中
  old.boy.python old.* -- 不匹配 *表示匹配一个
  old.boy.python old.# -- 匹配 #表示匹配0个或多个
简述 celery 是什么以及应用场景?
# Celery是由Python开发的一个简单、灵活、可靠的处理大量任务的分发系统,
# 它不仅支持实时处理也支持任务调度。
简述 vitualenv?及应用场景?
'vitualenv'是一个独立的python虚拟环境
如:
当前项目依赖的是一个版本,但是另一个项目依赖的是另一个版本,这样就会造成依赖冲突,
而virtualenv就是解决这种情况的,virtualenv通过创建一个虚拟化的python运行环境,
将我们所需的依赖安装进去的,不同项目之间相互不干扰
简述 pipreqs 及应用场景?
可以通过对项目目录扫描,自动发现使用了那些类库,并且自动生成依赖清单。
pipreqs ./ 生成requirements.txt
在Python中使用过什么代码检查工具?
1)PyFlakes:静态检查Python代码逻辑错误的工具。
2)Pep8: 静态检查PEP8编码风格的工具。
3)NedBatchelder’s McCabe script:静态分析Python代码复杂度的工具。
Python代码分析工具:PyChecker、Pylint
简述 saltstack、ansible、fabric、puppet工具的作用?
?
B Tree和B+ Tree的区别?
1.B树中同一键值不会出现多次,并且有可能出现在叶结点,也有可能出现在非叶结点中。
而B+树的键一定会出现在叶结点中,并有可能在非叶结点中重复出现,以维持B+树的平衡。
2.因为B树键位置不定,且在整个树结构中只出现一次,
请列举常见排序并通过代码实现任意三种。
冒泡/选择/插入/快排
?请列举常见查找并通过代码实现任意三种。
无序查找、二分查找、插值查找
请列举你熟悉的设计模式?
工厂模式/单例模式等
有没有刷过leetcode?
leetcode是个题库,里面有多很编程题目,可以在线编译运行。
https://leetcode-cn.com/problemset/all/
列举熟悉的的Linux命令。
1创建目录
mkdir /data
cd /
mkdir data
2:查看目录
ls
ls -l 显示详细信息
公司线上服务器是什么系统?
Linux/Centos
解释 PV、UV 的含义?
PV访问量(Page View),即页面访问量,每打开一次页面PV计数+1,刷新页面也是。
UV访问数(Unique Visitor)指独立访客访问数,一台电脑终端为一个访客。
解释 QPS的含义?
'QPS(Query Per Second)' 每秒查询率,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准
uwsgi和wsgi的区别?
wsgi是一种通用的接口标准或者接口协议,实现了python web程序与服务器之间交互的通用性。
uwsgi:同WSGI一样是一种通信协议
uwsgi协议是一个'uWSGI服务器'自有的协议,它用于定义传输信息的类型,
'uWSGI'是实现了uwsgi和WSGI两种协议的Web服务器,负责响应python的web请求。
supervisor的作用?
# Supervisor:是一款基于Python的进程管理工具,可以很方便的管理服务器上部署的应用程序。
是C/S模型的程序,其服务端是supervisord服务,客户端是supervisorctl命令
# 主要功能:
1 启动、重启、关闭包括但不限于python进程。
2 查看进程的运行状态。
3 批量维护多个进程。
什么是反向代理?
正向代理代理客户端(客户端找哟个代理去访问服务器,服务器不知道你的真实IP)
反向代理代理服务器(服务器找一个代理给你响应,你不知道服务器的真实IP)
简述SSH的整个过程。
SSH 为 'Secure Shell' 的缩写,是建立在应用层基础上的安全协议。
SSH 是目前较可靠,为远程登录会话和其他网络服务提供的安全性协议。
利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。
有问题都去那些找解决方案?
起初是百度,发现搜到的答案不精准,净广告
转战谷歌,但墙了;捣鼓怎么FQ
还会去知乎、stackoverfloow、必应、思否(segmentfault)
是否有关注什么技术类的公众号?
python之禅(主要专注Python相关知识,作者:刘志军)
码农翻身(主要是Java的,但不光是java,涵盖面很广,作者:刘欣)
实验楼(在线练项目)
最近在研究什么新技术?
Numpy pandas(金融量化分析、聚宽) 百度AI 图灵API 智能玩具
是否了解过领域驱动模型?
Domain-Driven Design
二进制与十进制之间的转换
1、十进制 与 二进制之间的转换
??? (1)、十进制转换为二进制,分为整数部分和小数部分
整数部分
方法:除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权上的数。
这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数读起,一直到最前面的一个余数。下面举例:
小数部分
方法:乘2取整法,即将小数部分乘以2,然后取整数部分,剩下的小数部分继续乘以2,然后取整数部分,
剩下的小数部分又乘以2,一直取到小数部分为零为止。如果永远不能为零,就同十进制数的四舍五入一样,
按照要求保留多少位小数时,就根据后面一位是0还是1,取舍,如果是零,舍掉,如果是1,向入一位。
换句话说就是0舍1入。读数要从前面的整数读到后面的整数
二进制转换为十进制 (不分整数和小数部分)
方法:按权相加法,即将二进制每位上的数乘以权,然后相加之和即是十进制数。
例:将二进制数101.101转换为十进制数。
得出结果:(101.101)2=(5.625)10
在做二进制转换成十进制需要注意的是
1)要知道二进制每位的权值
2)要能求出每位的值 101.101 转换为十进制
整数部分:2^2 + 2^0 = 5
小数部分:2^(-1) + 2^(-3) = 1/2 + 1/8 = 0.5 + 0.125 = 0.625
十进制: 2^2 + 2^0 + 2^(-1) + 2^(-3) = 5.625

 

posted @ 2018-11-13 09:56  stalla  阅读(312)  评论(0)    收藏  举报