1.谈谈你对http协议的认识。
2.谈谈你对websocket协议的认识。
3.什么是magic string ? 所谓魔数和魔字符串就是指在代码中出现但没有解释的数字常量或字符串。如果在某个程序中你使用了魔数,那么 在几个月(或几年)后你将很可能不知道它的含义是什么。 应该避免使用魔字符串,使用常量代替 4.如何创建响应式布局? @media() 5.你曾经使用过哪些前端框架? Bootstrap 6.什么是ajax请求?并使用jQuery和XMLHttpRequest对象实现一个ajax请求。 Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发 技术。 Ajax = 异步 JavaScript 和 XML(标准通用标记语言的子集)。 Ajax 是一种用于创建快速动态网页的技术。 Ajax 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。 [1] 通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情 况下,对网页的某部分进行更新。 传统的网页(不使用 Ajax)如果需要更新内容,必须重载整个网页页面。 jQuery
XMLHttpRequest对象
7.如何在前端实现轮训? 轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接。
优点:后端程序编写比较容易。 缺点:请求中有大半是无用,浪费带宽和服务器资源。 实例:适于小型应用。 8.如何在前端实现长轮训? 客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端 处理完响应信息后再向服务器发送新的请求。 优点:在无消息的情况下不会频繁的请求,耗费资小。 缺点:服务器hold连接会消耗资源,返回数据顺序无保证,难于管理维护。 Comet异步的ashx, 实例:WebQQ、Hi网页版、Facebook IM。
使用队列实现的 9.vuex的作用? vuex是一个公共 状态库 , 你可以在所有的组件里面去使用和修改 1.组件之间的数据通信 2.使用单向数据流的方式进行数据的中心化管理 10.vue中的路由的拦截器的作用? 在vue项目使用vue-resource的过程中,临时增加了一个需求,需要在任何一个页面任何一次http请求,增加对token 过期的判断,如果token已过期,需要跳转至登录页面。如果要在每个页面中的http请求操作中添加一次判断,那么 会是一个非常大的修改工作量。那么vue-resource是否存在一个对于任何一次请求响应捕获的的公共回调函数呢?答 案是有的! vue-resource的interceptors拦截器的作用正是解决此需求的妙方。在每次http的请求响应之后,如果设置了拦截器, 会优先执行拦截器函数,获取响应体,然后才会决定是否把response返回给 then进行接收。那么我们可以在这个拦截器里边添加对响应状态码的判断,来决定是跳转到登录页面还是留在当前 页面继续获取数据。
11.axios的作用?
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是json用来跨域的一个东西。原理是通过script标签的跨域特性来绕过同源策略。(创建一个回调函数,然后 在远程服务上调用这个函数并且将json数据形式作为参数传递,完成回调)。 14.什么是cors ? 跨域资源共享(CORS,Cross-Origin Resource Sharing),其本质是设置响应头,使得浏览器允许跨域请求。 15.列举Http请求中常见的请求方式? 请求方法有8种,分别为: GET:请求获取由 Request-URI 所标识的资源。 POST:在 Request-URI 所标识的资源后附加新的数据。 HEAD:请求获取由 Request-URI 所标识的资源的响应消息报头。 OPTIONS:请求查询服务器的性能,或查询与资源相关的选项和需求。 PUT:请求服务器存储一个资源,并用 Request-URI作为其标识。 DELETE:请求服务器删除由 Request-URI所标识的资源。
TRACE:请求服务器回送收到的请求信息,主要用语测试或诊断。 CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
16.列举Http请求中的状态码? 2开头(成功) 200(OK):请求成功 202(Accepted):已接受请求,尚未处理 204(No Content):请求成功,且不需返回内容 3开头(重定向) 301(Moved Permanently):被请求的资源已永久移动到新位置 302(Moved Temporarily):被请求的资源已临时移动到新位置 4开头(客户端错误) 400(Bad Request):请求的语义或是参数有错 403(Forbidden):服务器拒绝了请求 404(Not Found):未找到请求的资源 5开头(服务器错误) 500(Internal Server Error):服务器遇到错误,无法完成请求 502(Bad Getway):网关错误,一般是服务器压力过大导致连接超时 503(Service Unavailable):服务器宕机
17.列举Http请求中常见的请求头? Accept: 浏览器端可以接受的媒体类型,通配符 * 代表任意类型 Accept-Encoding: 浏览器申明自己接收的编码方法,例如: Accept-Encoding: zh-CN,zh;q=0.8 Accept-Language: 浏览器申明自己接收的语言, Connection: 如Connection: keep-alive 当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭, 如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。 Referer: 当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此 可以获得一些信息用于处理,可用于图片防盗链。 User-Agent: 告诉HTTP服务器, 客户端使用的操作系统和浏览器的名称和版本. Cookie: Cookie是用来存储一些用户信息以便让服务器辨别用户身份的(大多数需要登录的网站上面会比较常见),比如 cookie会存储一些用户的用户名和密码, 当用户登录后就会在客户端产生一个cookie来存储相关信息,这样浏览器通过读取cookie的信息去服务器上验证并 通过后会判定你是合法用户,从而允许查看相应网页。
18.看图写结果:
'李杰' 19.看图写结果:
'武沛齐' 20.看图写结果:
'老男孩' 21.看图写结果:
undefined 22.看图写结果:
'武沛齐' 23.看图写结果:
'Alex' 24.django、flask、tornado框架的比较? d:大而全 f:微型灵活 t:异步非阻塞 25.什么是wsgi?
26.django请求的生命周期?
27.列举django的内置组件? ORM admin Form ModelForm 分页 中间件 信号 缓存 28.列举django中间件的5个方法?以及django中间件的应用场景? 中间件中方法?5个方法,分别是: process_request(self,request) process_view(self, request, callback, callback_args, callback_kwargs) process_template_response(self,request,response) process_exception(self, request, exception) process_response(self, request, response) 1 请求先执行所有中间件的process_request,然后做路由匹配,找到函数不执行。 2 再执行所有的process_view,在执行视图函数。 3 再执行process_response 4 如果程序报错执行process_exception 5 如果程序有render方法则执行process_template_response
29.简述什么是FBV和CBV?
1 FBV方式请求的过程 用户发送url请求,Django会依次遍历路由映射表中的所有记录,一旦路由映射表其中的一条匹配成功了, 就执行视图函数中对应的函数名,这是fbv的执行流程
2 CBV方式请求的过程 当服务端使用CBV模式的时候,用户发给服务端的请求包含url和method,这两个信息都是字符串类型
服务端通过路由映射表匹配成功后会自动去找dispatch方法,然后Django会通过dispatch反射的方式找到类中对应的方 法并执行
类中的方法执行完毕之后,会把客户端想要的数据返回给dispatch方法,由dispatch方法把数据返回经客户端
3 FBV和CBV的区别? - 没什么区别,因为他们的本质都是函数。CBV的.as_view()返回的view函数,view函数中调用类的dispatch方法, 在dispatch方法中通过反射执行get/post/delete/put等方法。 - CBV比较简洁,GET/POST等业务功能分别放在不同get/post函数中。FBV自己做判断进行区分。
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('...')
- csrf的装饰器要加到dispath from django.views import View from django.utils.decorators import method_decorator from django.views.decorators.csrf import csrf_exempt,csrf_protect
class UserView(View): @method_decorator(csrf_exempt) def dispatch(self, request, *args, **kwargs): return HttpResponse('...') 或 from django.views import View from django.utils.decorators import method_decorator from django.views.decorators.csrf import csrf_exempt,csrf_protect @method_decorator(csrf_exempt,name='dispatch') class UserView(View): def dispatch(self, request, *args, **kwargs):
return HttpResponse('...')
32.列举django orm 中所有的方法(QuerySet对象的所有方法) 返回QuerySet对象的方法有: all() filter() exclude() order_by() reverse() distinct() 特殊的QuerySet: values() 返回一个可迭代的字典序列 values_list() 返回一个可迭代的元组序列 返回具体对象的: get() first() last() 返回布尔值的方法有: exists() 返回数字的方法有: 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的区别? - seleted_related 用于主动进行连表查询 FK时用,相当于主动做join(一次连表查询,连表查询速度会相对慢 点) - prefetch_related 多次单表操作,避免连表查询损耗;先查询想要的数据,然后构造条件,如:id=[1,2,3],再次查 询其他表根据id做条件。 35.filter和exclude的区别? def filter(self, *args, **kwargs) # 条件查询(符合条件) # 条件可以是:参数,字典,Q
def exclude(self, *args, **kwargs) # 条件查询(排除条件) # 条件可以是:参数,字典,Q
36.列举django orm中三种能写sql语句的方法。 1.使用execute执行自定义SQL # 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()
2.使用extra方法
# 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"}, select_params=(1,), order_by=['-nid'])
3.使用raw方法 解释:执行原始sql并返回模型 说明:依赖model多用于查询 用法: book = Book.objects.raw("select * from hello_book") for item in book: print(item.title) https://www.cnblogs.com/413xiaol/p/6504856.html
37.django orm 中如何设置读写分离? https://blog.csdn.net/Ayhan_huang/article/details/78784486
38.F和Q的作用? F: Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取模的操作。 修改操作也可以使用F函数,比如将每一本书的价格提高30元
例:把所有书名后面加上(第一版) from django.db.models.functions import Concat from django.db.models import Value models.Book.objects.all().update(title=Concat(F("title"), Value("("), Value("第一版"), Value(")"))) Q: Q(条件1) | Q(条件2) 或 Q(条件1) & Q(条件2) 且 Q(条件1) & ~Q(条件2) 非
39.values和values_list的区别? values() 返回一个可迭代的字典序列 values_list() 返回一个可迭代的元组序列
40.如何使用django orm批量创建数据? 批量插入数据 product_list_to_insert = list() for x in range(10): product_list_to_insert.append(Product(name='product name ' + str(x), price=x)) Product.objects.bulk_create(product_list_to_insert)
批量更新数据 Product.objects.filter(name__contains='name').update(name='new name')
批量删除数据
Product.objects.filter(name__contains='name query').delete()
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,'二B用户'),(2,'山炮用户')] 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%}标签 https://blog.csdn.net/u012556900/article/details/57412707
45.django如何实现websocket? 先安装 pip install dwebsocket2 使用: 如果你想为一个单独的视图处理一个websocklet连接可以使用accept_websocket装饰器,它会将标准的HTTP请求路由 到视图中。使用require_websocke装饰器只允许使用WebSocket连接,会拒绝正常的HTTP请求。 在设置中添加设置MIDDLEWARE_CLASSES=dwebsocket.middleware.WebSocketMiddleware这样会拒绝单独的视图实 用websocket,必须加上accept_websocket 装饰器。 设置WEBSOCKET_ACCEPT_ALL=True可以允许每一个单独的视图实用websockets
46.基于django使用ajax发送post请求时,都可以使用哪种方法携带csrf token? 三种 一、 二、 //模板页面中必须要有 {% csrf_token %} 三、 //必须先引入它 47.django中如何实现orm表中添加数据时创建一条日志记录。 https://segmentfault.com/a/1190000015022691 类的继承和装饰器方法
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" %}
缓存时间:{{ t }}
{% endcache %}49.django的缓存能使用redis吗?如果可以的话,如何配置? pip install django-redis apt-get install redis-server 然后在settings.py 里面添加 CACHES = { 'default': { 'BACKEND': 'redis_cache.cache.RedisCache', 'LOCATION': '127.0.0.1:6379', "OPTIONS": { "CLIENT_CLASS": "redis_cache.client.DefaultClient", }, }
50.django路由系统中name的作用? 在Python的正则表达式中,命名组的语法是(?P
51.django的模板中filter和simple_tag的区别? http://www.cnblogs.com/cerofang/p/8367588.html simple_tag -参数任意,但是不能作为if条件判断的条件 filter -参数最多只能有两个,但是可以作为if条件判断的条件。 52.django-debug-toolbar的作用? django_debug_toolbar 是django的第三方工具包,给django扩展了调试功能。 包括查看执行的sql语句,db查询次数,request,headers,调试概览等。 https://blog.csdn.net/weixin_39198406/article/details/78821677 53.django中如何实现单元测试? https://www.jianshu.com/p/34267dd79ad6 54.解释orm中 db first 和 code first的含义?
datebase first就是代表数据库优先,那么前提就是先创建数据库。 model first就是代表model优先,那么前提也就是先创建model,然后根据model自动建立数据库。 1.Database First是基于已存在的数据库,利用某些工具(如VS提供的EF设计器)创建实体类,数据库对象与实体类 的匹配关系等,你也可以手动修改这些自动生成的代码及匹配文件。也就是从一个数据库开始,然后生成实体框架 和相应代码。 2.Model First 是先利用某些工具(如VS的EF设计器)设计出可视化的实体数据模型及他们之间的关系,然后再根据 这些实体、关系去生成数据库对象及相关代码文件。 3.Code First 这种方式需要先写一些代码,如实体对象,数据关系等,然后根据已有的代码描述,自动创建数据对 象。但其实这种方法与Model First是非常类似的。我们自己写的代码,其实就是用代码表示实体模型,而Model First 是用可视化的方式描述了实体模型。 55.django中如何根据数据库表生成model中的类? https://jingyan.baidu.com/article/4ae03de3e513d23eff9e6bb7.html
创建Model(模型)。Django附带一个名为inspectdb的实用程序,可以通过检查现有的数据库来创建Model(模 型)。您可以通过运行以下命令来实现。 python manage.py inspectdb 在指定的文件中创建Model(模型)。将其另存为指定的文件。您可以通过运行以下命令来实现。 python manage.py inspectdb > models.py 56.使用orm和原生sql的优缺点? ORM框架: 对象关系映射,通过创建一个类,这个类与数据库的表相对应!类的对象代指数据库中的一行数据。 简述ORM原理: 让用户不再写SQL语句,而是通过类以及对象的方式,和其内部提供的方法,进行数据库操作!把用户输入 的类或对象转换成SQL语句,转换之后通过pymysql执行完成数据库的操作。 ORM的优缺点: 优点: 提高开发效率,降低开发成本 使开发更加对象化 可移植 可以很方便地引入数据缓存之类的附加功能 缺点: 在处理多表联查、where条件复杂之类的查询时,ORM的语法会变得复杂。就需要写入原生SQL。
使用原生 sql 可以解决 orm 无法解决的复杂 sql 语句,执行效率高,但是开发效率低,书写难度较大,使用比较繁 琐。
57.简述MVC和MTV MVC MVC(Model View Controller 模型-视图-控制器)是一种Web架构的模式。 特点:把业务逻辑、模型数据、用户界面分离开来,让开发者将数据与表现解耦。 MVC三要素: Model(数据模型)。是对客观事物的抽象。 比如知乎Live,Live就是一个模型,可以用Live类来表示。而一个模型通常还带有很多的和业务相关的逻辑,比如添 加,更新,获取Live主讲人信息等等,这些组成了模型的方法。对于开发者模型的表示方法非常易懂和清晰,可以 通过非常便捷的代码来做CURD操作而无需写一条又一条的SQL语句。 View(视图)。呈现给用户的效果,呈现的内容是基于Model,它也是收集用户输入的地方。 比如看到一篇Live,数据是一个Live.get(live_id).to_dict()的结果,效果是通过对应的模板和样式把这个数据展示出 来。 Contorller(控制器)。是Model和View之间的沟通者。 因为View中不会对Model作任何操作,Model不会输出任何用于表现的东西,如HTML代码或者某种效果等,它就是 点数据。而Contorller用于决定使用哪些Model,对Model执行什么操作,为视图准备哪些数据,是MVC中沟通的桥 梁。 MVC的通信是单向的: 浏览器发送请求 Contorller和Model交互获取数据 Contorller调用View View渲染数据返回 更简单的表达式:V -> C-> M -> C -> V MTV 和Rails、Spring、Laravel等其他语言的Web框架不一样,在Python的世界中,基本(除了Pylons)都使用了MVC的变 种MTV(Model Templates View 模型-模板-视图): Model(数据模型)。和MVC的Model一样,处理与数据相关的所有事务:如何存取、如何确认有效性、包含哪些行 为以及数据之间的关系等。 Template(模板)。处理与表现相关的决定:如何在页面或其他类型文档中进行显示出来。
View。处理业务逻辑,视图就是一个特定URL的回调函数,回调函数中描述数据:从Model取出对应的数据,调用 相关的模板。它就是Contorller要调用的那个用来做Model和View之间的沟通函数,从而完成控制。 注意:MVC中的View的目的是「呈现哪一个数据」,而MTV的View的目的是「数据如何呈现」。 也就是把MVC中的View分成了视图(展现哪些数据)和模板(如何展现)2个部分,而Contorller这个要素由框架自 己来实现了,我们需要做的就是把(带正则表达式的)URL对应到视图就可以了,通过这样的URL配置,系统将一 个请求发送到一个合适的视图。 需要注意,Flask这种微框架就不是一个MVC模式的,因为它没有提供Model,除非集成了SQLAlchemy之类的ORM 进来。 MVVM 定义: MVVM(Model-View-ViewModel),是一种基于前端开发的架构模式。 核心是提供对View 和 ViewModel 的双向数据绑定,View和Model之间并没有直接的联系,而是通过ViewModel进行 交互,View的变动,自动反映在ViewModel上,反之亦然,这样就保证视图和数据的一致性。 来源: 现在前端,不仅仅是简单的数据展示了,它不仅要管理复杂的数据状态,还要处理移动设备上各种操作行为等等。 因此,前端也需要工程化,也需要一个类似于MVC 的框架来管理这些复杂的逻辑,使开发更加高效: View UI布局,展示数据 Model 管理数据 Controller 响应用户操作,并将 Model 更新到 View 上 前端应用的复杂程度已不同往日,今非昔比。这时前端开发就暴露出了三个痛点问题: 开发者在代码中大量调用相同的DOM API, 处理繁琐,操作冗余,使得代码难以维护。 大量的DOM 操作使页面渲染性能降低,加载速度变慢,影响用户体验。 当 Model 频繁发生变化,开发者需要主动更新到View ;当用户的操作导致Model发生变化,开发者同样需要将变化 的数据同步到Model中, 这样的工作不仅繁琐,而且很难维护复杂多变的数据状态。 早期 jQuery 的出现就是为了前端能更简洁的操作DOM 而设计的,但它只解决了第一个问题,另外两个问题始终伴 随着前端一直存在。 MVVM 的出现,完美解决了以上三个问题。 MVVM 的三部分: Model 层代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑; View 代表UI 组件,它负责将数据模型转化成UI 展现出来, ViewModel 是一个同步View 和 Model的对象。 View 和 Model 之间并没有直接的联系,而是通过ViewModel进行交互。 ViewModel 通过双向数据绑定把 View 层和 Model 层连接了起来,而View 和 Model 之间的同步工作完全是自动的, 无需人为干涉,因此开发者只需关注业务逻辑,不需要手动操作DOM, 不需要关注数据状态的同步问题,复杂的数 据状态维护完全由 MVVM 来统一管理。 58.django的contenttype组件的作用? django内置的ContentType组件就是帮我们做连表操作 如果一个表与其他表有多个外键关系,我们可以通过ContentType来解决这种关联 当一张表作为多个表的FK,并且只能选择其中一个或者几个时,就可以使用content_type表;例如上面的优惠券 表,被食物和衣服当作FK,数据库表一旦建立就难以更改,如果以后需要增加电器等表并把优惠券表作为FK表, 这时就不能做到在优惠券表增加列字段electr_id,因为表只能增加行记录而不能增加列字段,因此就可以使用 content_type表来将表与表中的对象进行关联,从而做到不增加列字段的情况下增加FK关系。
在使用content_type表时,需要在FK表中增加content_type作为FK字段,并增加GenericForeignKey便于优惠券表 记录的建立以及单个优惠券对象对应的其他商品的查找。在优惠券表关联的“一”的关系表中增加GenericRelation 字段便于查找关联的优惠券记录的查找 59.谈谈你对restfull 规范的认识?
60.接口的幂等性是什么意思? 一个接口通过首先进行1次访问,然后对该接口进行N次相同访问的时候,对访问对象不造成影响,那么就认为接 口具有幂等性。
比如: GET, 第一次获取数据、第二次也是获取结果,幂等。 POST, 第一次新增数据,第二次也会再次新增,非幂等。 PUT, 第一次更新数据,第二次不会再次更新,幂等。 PATCH,第一次更新数据,第二次可能再次更新,非幂等。 DELTE,第一次删除数据,第二次不会再次删除,幂等。
61.什么是RPC? RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解 底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI 网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。 62.Http和Https的区别?
63.为什么要使用django rest framework框架? rest 协议的设计优势: 1.客户端-服务端分离 优点:提高用户界面的便携性,通过简化服务器提高可伸缩性.... 2.无状态(Stateless):从客户端的每个请求要包含服务器所需要的所有信息 优点:提高可见性(可以单独考虑每个请求),提高了可靠性(更容易从局部故障中修复),提高可扩展性 (降低了服务器资源使用) 3.缓存(Cachable):服务器返回信息必须被标记是否可以缓存,如果缓存,客户端可能会重用之前的信息发 送请求 优点:减少交互次数,减少交互的平均延迟 4.统一接口 优点:提高交互的可见性,鼓励单独改善组件 5.支持按需代码(Code-On-Demand 可选) 优点:提高可扩展性 rest framework是遵循 rest 协议的框架 64.django rest framework框架中都有那些组件? - 路由,自动帮助开发者快速为一个视图创建4个url www.oldboyedu.com/api/v1/student/$ www.oldboyedu.com/api/v1/student(?P
- 登录用户可以通过用户名作为唯一标示进行控制,如果有人注册很多账号,也无法防止。 - 视图 - 解析器 ,根据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需要填写对应关系 .as_view({'get':'list','post':'create'}) 在内部也帮助我们提供了一些方便的方法: - get_queryset - get_object - get_serializer 注意:要设置queryset字段,否则会跑出断言的异常。 # 只提供增加功能 class TestView(GenericViewSet): serializer_class = XXXXXXX def create(self,*args,**kwargs): pass # 获取数据并对数据进行操作 c. 继承 - ModelViewSet - mixins.CreateModelMixin,GenericViewSet - mixins.CreateModelMixin,DestroyModelMixin,GenericViewSet 对数据库和分页等操作不用我们在编写,只需要继承相关类即可。 示例:只提供增加功能 class TestView(mixins.CreateModelMixin,GenericViewSet): serializer_class = XXXXXXX http://www.cnblogs.com/iyouyue/p/8798572.html#_label3
66.简述 django rest framework框架的认证流程。 - 如何编写?写类并实现authticate - 方法中可以定义三种返回值:
- (user,auth),认证成功 - None , 匿名用户 - 异常 ,认证失败 - 流程: - dispatch - 再去request中进行认证处理 https://www.cnblogs.com/haiyan123/p/8419872.html
67.django rest framework如何实现的用户访问频率控制? a. 基于用户IP限制访问频率 b. 基于用户IP显示访问频率(利于Django缓存) c. view中限制请求频率 d. 匿名时用IP限制+登录时用Token限制 e. 全局使用 REST_FRAMEWORK = { 'DEFAULT_THROTTLE_CLASSES': [ 'api.utils.throttles.throttles.LuffyAnonRateThrottle', 'api.utils.throttles.throttles.LuffyUserRateThrottle', ], 'DEFAULT_THROTTLE_RATES': { 'anon': '10/day', 'user': '10/day', 'luffy_anon': '10/m', 'luffy_user': '20/m', }, }
68.Flask框架的优势?
69.Flask框架依赖组件? Flask依赖两个外部库: Jinja2模板引擎 Werkzeng WSGI工具集。
70.Flask蓝图的作用? 将不同的功能 模块化; 构建大型的应用; 优化项目结构; 增强可读性,易于维护;
71.列举使用过的Flask第三方组件? 内置: - 配置 - 路由 - 视图 - 模板 - session - 闪现 - 蓝图 - 中间件 - 特殊装饰器
第三方: - Flask组件: - flask-session - flask-SQLAlchemy - flask-migrate - flask-script - blinker - 公共组件: - wtforms - dbutile - sqlalchemy - 自定义Flask组件 - auth ,参考flask-login组件
72.简述Flask上下文管理流程?
73.Flask中的g的作用? g 相当于一次请求的全局变量,当请求进来时将g和current_app封装为一个APPContext类,在通过LocalStack将 Appcontext放入Local中,取值时通过偏函数,LocalStack、loca l中取值,响应时将local中的g数据删除 1. g对象是专门用来保存用户的数据的。 2. g对象在一次请求中的所有的代码的地方,都是可以使用的。 74.Flask中上下文管理主要涉及到了那些相关的类?并描述类主要作用?
75.为什么要Flask把Local对象中的的值stack 维护成一个列表? 在离线脚本的多 app 中会使用到一个 stack 对应存储多个app_context 对象 76.Flask中多app应用是怎么完成? from m_app import app01,app02 from flask import current_app """ { 1231: { stack: [app01,app02,] } } """ with app01.app_context(): print(current_app) with app02.app_context(): print(current_app) print(current_app)
77.在Flask中实现WebSocket需要什么组件? Flask-SocketIO 和 Flask-Sockets,区别: Flask-Sockets和Flask-SocketIO之间的主要区别在于前者仅仅将WebSocket协议(通过使用gevent-websocket项 目)进行包装,因此它只适用于原生支持WebSocket协议的浏览器,对于那些不支持WebSocket协议的较老的 浏览器,就无法使用它了。 Flask-SocketIO则不同,通过前面的介绍,读者应该已经知道了它不仅实现了 WebSocket协议,并且对于那些不支持WebSocket协议的旧版浏览器,使用它也能够实现相同的效果。 另一个区别是Flask-SocketIO实现了SocketIO Javascript库公开的消息传递协议。 Flask-Sockets只是实现通信通 道,发送的是完全取决于应用程序。
78.wtforms组件的作用? WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证。 https://www.cnblogs.com/big-handsome-guy/p/8552079.html https://www.cnblogs.com/liuwei0824/p/8330985.html 79.Flask框架默认session处理机制? 源码过程: https://blog.csdn.net/qq_33733970/article/details/79008831 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}, ... } import time import threading
DIC = {}
def task(i): ident = threading.get_ident() if ident in DIC : DIC[ident]['num'] = i else: DIC[ident] = {'num': i } time.sleep(2) print(DIC[ident]['num'], i) for i in range(10): t = threading.Thread(target = task, arg = (i,)) t.start() b. 自定义Local对象 作用:为每个线程(协程)开辟一块空间进行数据存储。 try: from greenlet import getcurrent as get_ident except Exception as e: from threading import get_ident from threading import Thread import time 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 中的信号: Flask框架中的信号基于blinker,其主要就是让开发者可是在flask请求过程中定制一些用户行为。简单来说就是flask 在列表里面,预留了几个空列表,在里面存东西。信号通过发送通知来帮助你解耦应用。简言之,信号允许某个发 送者通知接收者有事情发生了; 内置信号: request_started = _signals.signal('request-started') # 请求到来前执行 request_finished = _signals.signal('request-finished') # 请求结束后执行 before_render_template = _signals.signal('before-render-template') # 模板渲染前执行 template_rendered = _signals.signal('template-rendered') # 模板渲染后执行 got_request_exception = _signals.signal('got-request-exception') # 请求执行出现异常时执行 request_tearing_down = _signals.signal('request-tearing-down') # 请求执行完毕后自动执行(无论成功与否) appcontext_tearing_down = _signals.signal('appcontext-tearing-down')# 请求上下文执行完毕后自动执行(无论成功与 否) appcontext_pushed = _signals.signal('appcontext-pushed') # 请求上下文push时执行 appcontext_popped = _signals.signal('appcontext-popped') # 请求上下文pop时执行 message_flashed = _signals.signal('message-flashed') # 调用flask在其中添加数据时,自动触发 82.SQLAlchemy中的 session和scoped_session 的区别? SQLAlchemy中的 session是sessionmaker,通过sessionmaker,我们得到一个类,一个能产生session的工厂。我们可以 用这个类的对象来操作数据库。创建多个Session对象,这几个对象是不相同的。 使用scoped_session的目的主要是为了线程安全。 scoped_session类似单例模式,当我们调用使用的时候,会先在Registry里找找之前是否已经创建session了。 要是有,就把这个session返回。 要是没有,就创建新的session,注册到Registry中以便下次返回给调用者。 这样就实现了这样一个目的:在同一个线程中,call scoped_session 的时候,返回的是同一个对象。 scoped_session实现了代理模式。能够将操作转发到代理的对象中去执行。 scoped_session的实现使用了thread local storage技术,使session实现了线程隔离。这样我们就只能看见本线程的 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技术特点: 1.提高了开发效率。由于ORM可以自动对Entity对象与数据库中的Table进行字段与属性的映射,所以我们实际可能 已经不需要一个专用的、庞大的数据访问层。 2.ORM提供了对数据库的映射,不用sql直接编码,能够像操作对象一样从数据库获取数据。
85.DBUtils模块的作用? 使用DBUtils模块 两种使用模式: 1 为每个线程创建一个连接,连接不可控,需要控制线程数 2 创建指定数量的连接在连接池,当线程访问的时候去取,如果不够了线程排队,直到有人释放。平时建议使用 这种! 86.以下SQLAlchemy的字段是否正确?如果不正确请更正: from datetime import datetime from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, DateTime
Base = declarative_base() class UserInfo(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.SQLAchemy中如何设置联合唯一索引? UniqueConstraint 设置联合唯一索引 例如: __table_args = (UniqueConstraint('host_id', 'username', name = '_host_username_uc')) # host_id和username组成联合唯一约束 89.简述Tornado框架的特点。 Tornado的独特之处在于其所有开发工具能够使用在应用开发的任意阶段以及任何档次的硬件资源上。而且,完整 集的Tornado工具可以使开发人员完全不用考虑与目标连接的策略或目标存储区大小。Tornado 结构的专门设计为开 发人员和第三方工具厂商提供了一个开放环境。已有部分应用程序接口可以利用并附带参考书目,内容从开发环境 接口到连接实现。Tornado包括强大的开发和调试工具,尤其适用于面对大量问题的嵌入式开发人员。这些工具包 括C和C++源码级别的调试器,目标和工具管理,系统目标跟踪,内存使用分析和自动配置. 另外,所有工具能很方 便地同时运行,很容易增加和交互式开发。 90.简述Tornado框架中Future对象的作用? 异步非阻塞本质: 目标:通过一个线程处理N个并发请求。 使用支持tornado异步非阻塞的模块: MySQL Redis SQLALchemy Tornado异步非阻塞本质: 视图函数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程序?
92.Tornado中静态文件是如何处理的?如:
93.Tornado操作MySQL使用的模块?
94.Tornado操作redis使用的模块?
95.简述Tornado框架的适用场景?
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命令 的区别。
99.公司如何基于git做的协同开发?
100.如何基于git实现代码review?
101.git如何实现v1.0 、v2.0 等版本的管理?
102.什么是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上牛逼的开源项目贡献代码?
105.git中 .gitignore文件的作用?
106.什么是敏捷开发? 敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。在敏捷开发中,软件项目在构建初 期被切分成多个子项目,各个子项目的成果都经过测试,具备可视、可集成和可运行使用的特征。换言之,就是把 一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。 107.简述 jenkins 工具的作用? Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放 易用的软件平台,使软件的持续集成变成可能。 108.公司如何实现代码发布?
109.简述 RabbitMQ、Kafka、ZeroMQ的区别?
110.RabbitMQ如何在消费者获取任务后未处理完前就挂掉时,保证数据不丢失?
111.RabbitMQ如何对消息做持久化?
112.RabbitMQ如何控制消息被消费的顺序?
113.以下RabbitMQ的exchange type分别代表什么意思?如:fanout、direct、topic。
114.简述 celery 是什么以及应用场景?
115.简述celery运行机制。
116.celery如何实现定时任务?
117.简述 celery多任务结构目录?
118.celery中装饰器 @app.task 和 @shared_task的区别?
119.简述 requests模块的作用及基本使用? requests是一个Python实现的可以伪造浏览器发送Http请求的模块。
120.简述 beautifulsoup模块的作用及基本使用? Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库 121.简述 seleninu模块的作用及基本使用?
122.scrapy框架中各组件的工作流程?
123.在scrapy框架中如何设置代理(两种方法)?
124.scrapy框架中如何实现大文件的下载?
125.scrapy中如何实现限速?
126.scrapy中如何实现暂定爬虫?
127.scrapy中如何进行自定制命令?
128.scrapy中如何实现的记录爬虫的深度?
129.scrapy中的pipelines工作原理?
130.scrapy的pipelines如何丢弃一个item对象?
131.简述scrapy中爬虫中间件和下载中间件的作用?
132.scrapy-redis组件的作用?
133.scrapy-redis组件中如何实现的任务的去重?
134.scrapy-redis的调度器如何实现任务的深度优先和广度优先?
135.简述 vitualenv 及应用场景?
136.简述 pipreqs 及应用场景?
137.在Python中使用过什么代码检查工具?
138.简述 saltstack、ansible、fabric、puppet工具的作用?
139.B Tree和B+ Tree的区别?
140.请列举常见排序并通过代码实现任意三种。
141.请列举常见查找并通过代码实现任意三种。
142.请列举你熟悉的设计模式?
143.有没有刷过leetcode?
144.列举熟悉的的Linux命令。
145.公司线上服务器是什么系统?
146.解释 PV、UV 的含义?
147.解释 QPS的含义?
148.uwsgi和wsgi的区别?
149.supervisor的作用?
150.什么是反向代理?
151.简述SSH的整个过程。
152.有问题都去那些找解决方案?
153.是否有关注什么技术类的公众号?
154.最近在研究什么新技术?
155.是否了解过领域驱动模型?