一、框架对比
(1)django、flask、tornado框架的比较?
Django:简单的说Django是一个大而全的Web框架,内置了很多组件,ORM、admin、Form、 ModelForm、中间件、信号和缓存等。给开发者提高了超高的开发效率。 Flask:微型的小而精的Web框架,可扩展性强,内置的组件很少,需要引入第三方组件实现功能业务,如果开发简单的项目,使用Flask比较快速和方便。 如果开发大型项目,需要引入大量的第三方组件,这时Flask会越 来越像Django框架。 基于wsgi协议部署,使用werkzeug模块实现此协议,模板系统由 Jinja2提供。 Tornado:是一个轻量级的Web框架,少而精,性能优越,最出名的就是强大的异步非阻塞和内置WebSocket功能。 两大核心模块: 1.iostraem:对非阻塞式的socket进行简单的封装 2.ioloop:对I/O多路复用的封装,它实现了一个单例
(2)什么是wsgi?
Web服务器网关接口(Web Server Gateway Interface,缩写为WSGI)是Python应用程序或框架和Web服务器之间的一种接口,是一种协议。
实现该协议的模块:
wsgiref
werkzurg
uwsgi
除了tornado外其他框架都要利用wsgi,都没有自己写socket,都需要利用别人已经写好的。
二、django框架
2、视图相关
(1)简述什么是FBV和CBV?
FBV(function base views) 就是在视图里使用函数处理请求。
CBV(classbase views) 就是在视图里使用类处理请求。
Python是一个面向对象的编程语言,如果只用函数来开发,有很多面向对象的优点就错失了(继承、封装、多态)。
所以Django在后来加入了Class-Based-View。可以让我们用类写View。这样做的优点主要下面两种:
(1)提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)
(2)可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性
(2)如何给CBV的程序添加装饰器?
类中的方法与独立函数不完全相同,因此不能直接将函数装饰器应用于类中的方法 ,我们需要先将其转换为方法装饰器。
Django中提供了method_decorator装饰器用于将函数装饰器转换为方法装饰器。
#引入method_decorator模块
# 1.直接在类上加装饰器
@method_decorator(test,name='dispatch')
class Loginview(View):
pass
# 2.直接在处理的函数前加装饰器
@method_decorator(test)
def post(self,request,*args,**kwargs):pass
3、model相关
(2)django中如何根据数据库表生成model中的类?
# 1、settings配置
# 若想将模型转为mysql数据库中的表,需要在settings中配置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'orm', # 要连接的数据库,连接前需要创建好
'USER':'root', # 连接数据库的用户名
'PASSWORD':'1234', # 连接数据库的密码
'HOST':'127.0.0.1', # 连接主机,默认本级
'PORT': 3306, # 端口 默认3306
}
}
# 2、django默认你导入的驱动是MySQLdb需要换为PyMySQL
# 在/ORM/ORM/__init__.py里面写入:
import pymysql
pymysql.install_as_MySQLdb()
# 3、通过两条数据库迁移命令即可在指定的数据库中创建表
python3 manage.py makemigrations python3 manage.py migrate
(3)django的Model中的ForeignKey字段中的on_delete参数有什么作用?
#删除关联表中的数据时,当前表与其关联的field的操作 #django2.0之后,表与表之间关联的时候,必须要写on_delete参数,否则会报异常
(4)only和defer的区别?***不了解的
datalist = models.Userinfo.objects.all().only("name","email") #拿到的还是一个QuerySet集合,仅仅取name和email
for item in datalist:
print(item.id)
print(item.name)
print(item.pwd) #只要表里有这个字段,一样会取到值,额外的会再发一次请求
datalist = models.Userinfo.objects.all().defer("name","email") #阻止,不取name和email
for item in datalist:
print(item.id)
print(item.pwd)
# 注意:用only的话就去取only里面的字段,取其他的字段效率太低了,尽可能的少的连接数据库.
(5)select_related和prefetch_related的区别?
在数据库有外键的时候,使用 select_related() 和 prefetch_related() 可以很好的减少数据库请求的次数,从而提高性能。
对于一对一字段(OneToOneField)和外键字段(ForeignKey),可以使用select_related 来对QuerySet进行优化
通过多表join关联查询,一次性获得所有数据,只执行一次SQL查询
对于多对多字段(ManyToManyField)和一对多字段,可以使用prefetch_related()来进行优化。或许你会说,没有一个叫OneToManyField的东西啊。
分别查询每个表,然后根据它们之间的关系进行处理,执行两次查询
(6)filter和exclude的区别?
取到的值都是QuerySet对象,f
ilter选择满足条件的,
exclude:排除满足条件的.
(7)F和Q的作用?
Django 提供 F() 来对两个字段的值做比较比较。F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值。
用来更新获取原来值的功能,例如:Uinfo.objects.all().update(age=F("age")+1)
Django 提供 Q() 用于构造复杂的查询条件的,使用方法有对象方法和直接创建创建对象方法。
filter() 等方法中的关键字参数查询都是一起进行“AND” 的。要执行更复杂的查询(例如OR 语句)可以使用Q对象。
Q 对象可以使用& 和| 操作符组合起来产生一个新的Q 对象。可以组合& 和| 操作符以及使用括号进行分组来编写任意复杂的Q 对象。
Q 对象可以使用~ 操作符取反
(8)values和values_list的区别?
#values : 取字典的queryset #values_list : 取元组的queryset
4、form相关
(1)django的Form和ModeForm的作用?
#Form作用:
# 1.在前端生成HTML代码
# 2.对数据作有效性校验
# 3.返回校验信息并展示
#ModeForm:根据模型类生成From组件,并且可以操作数据库
(2)django的Form组件中,如果字段中包含choices参数,请使用两种方式实现数据源实时更新。
#1.重写构造函数
def def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields["city"].widget.choices = models.City.objects.all().values_list("id", "name")
#2.利用ModelChoiceField字段,参数为queryset对象
4、中间件相关
(1)django中间件是什么?用中间件做过什么?
中间件本质是类,帮助我们在视图函数执行之前,订制一些操作。内置的一些中间件可以做csrf、session等。
我们利用中间件常用来做登录认证、权限、cors(跨域)等。
(2)django请求的生命周期?
请求来了先到wsgi,把请求做一部分分装给django框架,然后经过所有的中间件,路由,视图,视图处理再返回给中间件,中间件在返回给wsgi,在返回给用户。 1.执行遵循wsgi协议的模块(socket服务端),用于接收用户请求并将请求进行初次封装,然后将请求交给web框架 (Flask、Django) 2.请求交给中间件处理(中间会做路由匹配),帮助我们对请求进行校验或在请求对象中添加其他相关数据,例如:csrf、request.session 路由匹配,根据浏览器发送的不同url去匹配不同的视图函数 3.视图函数(业务处理),在视图函数中进行业务逻辑的处理,可能涉及到:orm、templates => 渲染 4.再经过中间件,对响应的数据进行处理。 5.再经过wsgi,将响应的内容发送给浏览器(用户)。
(3)列举django中间件的5个方法?以及django中间件的应用场景?
中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。
process_request(self,request) 请求进来时,权限认证
process_view(self, request, view_func, view_args, view_kwargs) 路由匹配之后,能够得到视图函数
process_template_response(self,request,response) 模板渲染时执行
process_exception(self, request, exception) 异常时执行
process_response(self, request, response) 请求有响应时执行
简单的来说中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,例如:
1.Django项目中默认启用了csrf保护,每次请求时通过CSRF中间件检查请求中是否有正确#token值
2.当用户在页面上发送请求时,通过自定义的认证中间件,判断用户是否已经登陆,未登陆就去登陆。
3.当有用户请求过来时,判断用户是否在白名单或者在黑名单里
三、django-rest-framework框架
(1)谈谈你对restfull规范的认识?
首先restful是一种软件架构风格或者说是一种设计风格,并不是标准, 它只是提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。 就像设计模式一样,并不是一定要遵循这些原则,而是基于这个风格设计的软件可以更简洁, 更有层次,我们可以根据开发的实际情况,做相应的改变。 它里面提到了一些规范,例如: #1、可以根据Http不同的method,进行不同的资源操作 (5种方法:GET/POST/PUT/DELETE/PATCH) #2、restful 提倡面向资源编程,在url接口中尽量要使用名词,不要使用动词 http://www.luffycity.com/salary #3、在url中体现版本号 https://v1.bootcss.com/mycss https://v3.bootcss.com/ http://www.luffycity.com/v1/salary 不同的版本可以有不同的接口,使其更加简洁,清晰 #4、url中体现是否是API接口 https://www.bootcss.com/api/mycss http://www.luffycity.com/api/v2/salary http://api.luffycity.com/v1/salary api可以写在前面也可以写在后面,更推荐写在后面,写在前面可能导致跨域问题。 #5、在url接口中推荐使用Https协议,让网络接口更加安全 https://www.bootcss.com/v1/mycss?page=3 https://www.luffycity.com/api/v2/salary (Https是Http的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL(安全套接层协议)) #6、响应式应该设置状态码 200系列:成功 300系列:重定向 301临时重定向 302永久重定向 400系列:错误 500系列:代码错误 返回方式:return HttpResponse('asdadw',status=300) #7、url中可以添加条件去筛选匹配 https://www.bootcss.com/v1/mycss?page=3 https://www.luffycity.com/api/v2/salary?page=1&size=10 #8、根据返回值不同做不同的操作 https://www.luffycity.com/api/v2/salary GET:返回所有的列表 { code:10000, data:[ {'id':1, 'title':'高亮'}, {'id':2, 'title':'小东北'} ] } POST:返回新增的数据 {'id':3, 'title':'龙泰'} https://www.luffycity.com/api/v2/salary/1/ GET:获取单条数据 {'id':1, 'title':'高亮'} PUT:更新 {'id':1, 'title':'高亮'} PATCH:局部更新 {'id':1, 'title':'高亮'} DELETE:删除 #9、返回错误信息(错误信息可以是一个字典) { code:100001, error:'xxx错误' } #10、RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么 如果遇到需要跳转的情况 携带调转接口的URL ret = { code: 1000, data:{ id:1, name:'小强', depart_id:https://www.luffycity.com/api/v1/depart/8/ } }
(2)为什么要使用django rest framework框架?
能自动生成符合 RESTful 规范的 API 1.在开发REST API的视图中,虽然每个视图具体操作的数据不同, 但增、删、改、查的实现流程基本一样,这部分的代码可以简写 2.在序列化与反序列化时,虽然操作的数据不同,但是执行的过程却相似,这部分的代码也可以简写 REST framework可以帮助简化上述两部分的代码编写,大大提高REST API的开发速度
(3)django rest framework框架中都有那些组件?
1.序列化组件:serializers 对queryset序列化以及对请求数据格式校验 2.路由组件routers 进行路由分发 3.视图组件ModelViewSet 帮助开发者提供了一些类,并在类中提供了多个方法 4.认证组件 写一个类并注册到认证类(authentication_classes),在类的的authticate方法中编写认证逻 5.权限组件 写一个类并注册到权限类(permission_classes),在类的的has_permission方法中编写认证逻辑。 6.频率限制 写一个类并注册到频率类(throttle_classes),在类的的allow_request/wait 方法中编写认证逻辑 7.解析器 选择对数据解析的类,在解析器类中注册(parser_classes) 8.渲染器 定义数据如何渲染到到页面上,在渲染器类中注册(renderer_classes) 9.分页 对获取到的数据进行分页处理, pagination_class 10.版本 版本控制用来在不同的客户端使用不同的行为 在url中设置version参数,用户请求时候传入参数。在request.version中获取版本,根据版本不同 做不同处理
(4)django rest framework框架中的视图都可以继承哪些类?
class View(object): class APIView(View): # 封装了view,并且重新封装了request,初始化了各种组件 class GenericAPIView(views.APIView): # 增加了一些属性和方法,如get_queryset,get_serializer class GenericViewSet(ViewSetMixin, generics.GenericAPIView) # 父类ViewSetMixin 重写了as_view,返回return csrf_exempt(view) # 并重新设置请求方式与执行函数的关系 class ModelViewSet(mixins.CreateModelMixin, mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, mixins.ListModelMixin, GenericViewSet): # 继承了mixins下的一些类,封装了list,create,update等方法,还继承了GenericViewSet
(5)简述 django rest framework框架的认证流程。
1、在用户访问时执行APIView的dispatch方法,在dispatch进行分发操作前,需要先执行self.initial(request, *args, **kwargs),执行认证、权限、频率操作。
2、initial方法中,执行认证组件
def initial(self, request, *args, **kwargs):
"""代码省略"""
# Ensure that the incoming request is permitted
# 认证组件
self.perform_authentication(request)
3、perform_authentication方法中是request.user,即需要去Request类中寻找user静态方法
def perform_authentication(self, request): request.user
(6)django rest framework如何实现的用户访问频率控制?
使用IP/用户账号作为键,每次的访问时间戳作为值,构造一个字典形式的数据,存起来,每次访问时对时间戳列表的元素进行判断,
把超时的删掉,再计算列表剩余的元素数就能做到频率限制了。
匿名用户:使用IP控制,但是无法完全控制,因为用户可以换代理IP
登录用户:使用账号控制,但是如果有很多账号,也无法限制
(7)什么是接口?
在Python中接口就是URL。 但在c++/java中,接口是做约束用。 # 约束继承了它的类中必须含有IFoo中的方法 # java中继承类才是继承,继承接口叫做实现 interface IFoo: def func(self):pass class Foo(IFoo): def func(self):pass
三、Django ORM框架
(1)列举django orm中三种能写sql语句的方法。
Django提供两种方式执行(performing)原始的SQL查询:
(1) Manager.raw() :执行原始查询并返回模型实例
(2) Executing custom SQL directly :直接执行自定义SQL,这种方式可以完全避免数据模型,而是直接执行原始的SQL语句。
(2)django orm 中如何设置读写分离?
#1.手动读写分离:通过.using(db_name)来指定要使用的数据库
#2.自动读写分离:
# 1.定义类:如Router
# 2.配置Router
# settings.py中指定DATABASE_ROUTERS
# DATABASE_ROUTERS = ['myrouter.Router',]
#提高读的性能:多配置几个数据库,并在读取时,随机选取。写的时候写到主库
#实现app之间的数据库分离:分库分表
(3)列举django orm 中所有的方法(QuerySet对象的所有方法)
ORM是“对象-关系-映射”的简称。实现了数据模型与数据库的解耦。 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个, 如果符合筛选条件的对象超过一个或者没有都会抛出错误。 <4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象 <5> order_by(*field): 对查询结果排序 <6> reverse(): 对查询结果反向排序 <8> count(): 返回数据库中匹配查询(QuerySet)的对象数量。 <9> first(): 返回第一条记录 <10> last(): 返回最后一条记录 <11> exists(): 如果QuerySet包含数据,就返回True,否则返回False <12> values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列 model的实例化对象,而是一个可迭代的字典序列 <13> values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列 <14> distinct(): 从返回结果中剔除重复纪录 <15>delete(): 立即删除对象而不返回任何值,delete() 方法是 QuerySet 上的方法,但并不适用于 Manager 本身。 <16>update(): 对于任何结果集(QuerySet)均有效,这意味着可以同时更新多条记录。 update()方法会返回一个整型数值,表示受影响的记录条数。
(4)如何使用django orm批量创建数据?
(5)django中如何实现orm表中添加数据时创建一条日志记录。
(6)使用orm和原生sql的优缺点?
ORM优缺点: 优点: 1)提高开发效率,降低开发成本 2)使开发更加对象化 3)可移植 4)可以很方便地引入数据缓存之类的附加功能 缺点: 1)自动化进行关系数据库的映射需要消耗系统性能。其实这里的性能消耗还好啦,一般来说都可以忽略之。 2)在处理多表联查、where条件复杂之类的查询时,ORM的语法会变得复杂。 SQL优缺点: 优点: 执行速度快、性能强。 缺点: 开发速度慢
(7)解释orm中 db first 和 code first的含义?
十、未分配
4、列举django的内置组件?
1.admin组件:提供了基于 web 的管理工具,在网页上对注册的数据表进行增删改查操作。
2.auth组件:用户认证组件,用session记录登陆验证状态
3.forms组件:1)生成HTML标签;2)验证用户数据(显示错误信息)3)HTML Form提交保留上次提交数据 4)初始化页面显示内容
4.ModelForm组件:把model和form组合起来,即用于数据库操作,也可用于表单构建
5.paginator组件:分页器,用于实现分页效果
7、django的request对象是在什么时候创建的?
# 查看wsgi.py源码:
application = get_wsgi_application()
# 查看源码中get_wsgi_application()源码定义
def get_wsgi_application():
django.setup(set_prefix=False)
return WSGIHandler()
# 查看WSGIHandler源码
class WSGIHandler(base.BaseHandler):
# __call__()的作用是使实例能够像函数一样被调用,同时不影响实例本身的生命周期
def __call__(self, environ, start_response):
request = self.request_class(environ)
response = self.get_response(request)
# 请求走到WSGIHandler类的时候,执行__cell__方法,将environ封装成了request
21、django中csrf的实现机制?
Django 原生支持一个简单易用的跨站请求伪造的防护。当提交一个启用CSRF 防护的POST 表单时,你必须使用上面例子中的csrf_token 模板标签。 #第一步:django第一次响应来自某个客户端的请求时,后端随机产生一个token值,把这个token保存在SESSION状态中;同时,后端把这个token放到cookie中交给前端页面; #第二步:下次前端需要发起请求(比如发帖)的时候把这个token值加入到请求数据或者头信息中,一起传给后端;Cookies:{csrftoken:xxxxx} #第三步:后端校验前端请求带过来的token和SESSION里的token是否一致;
22、django如何实现websocket?
项目有个需要实时显示状态的需求,搜索了各种实现方法,看来只有websocket最靠谱,但django原生是不支持websocket的,
最终发现了django-channels这个项目
23、基于django使用ajax发送post请求时,都可以使用哪种方法携带csrf token?
方式1:后端将csrftoken传到前端,发送post请求时携带这个值发送 $.ajaxSetup({ data: {csrfmiddlewaretoken: '{{ csrf_token }}' }, }); 方式2:获取form中隐藏标签的csrftoken值,加入到请求数据中传给后端: data: { csrfmiddlewaretoken:$('[name="csrfmiddlewaretoken"]').val() }, 方式3:cookie中存在csrftoken,将csrftoken值放到请求头中 $.ajax({ headers:{"X-CSRFToken":$.cookie('csrftoken')}, })
25、django缓存如何设置?
Django 的缓存配置是通过 setting 文件的 CACHES 配置来实现的。本文仅以数据库缓存为例,其他配置方式请参考官方文档。 使用数据库缓存前,要在 settings.py 添加如下设置: CACHES = { 'default': { # 使用数据库缓存 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', # 用于保存缓存数据的表的名字 'LOCATION': 'my_cache_table', } } 然后运行这个命令来创建缓存表: python manage.py createcachetable
26、django的缓存能使用redis吗?如果可以的话,如何配置?
#1.安装 pip install django-redis #2.在stting中配置CACHES,可以设置多个缓存,根据名字使用 CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", "CONNECTION_POOL_KWARGS": {"max_connections": 100} # "PASSWORD": "密码", } } }, #另添加缓存 "JERD": { } #3.根据名字去连接池中获取连接 from django_redis import get_redis_connection conn = get_redis_connection("default")
27、django路由系统中name的作用?
urlpatterns = [
url(正则表达式, views视图函数,参数,别名),
]
name:
对你的URL进行命名,可以让你能够在Django的任意处,尤其是模板内显式地引用它。相当于给URL取了个全局变量名,你只需要修改这个全局变量的值,
在整个Django中引用它的地方也将同样获得改变。
28、django的模板中filter和simple_tag的区别?
simple_tag:可以有多个参数,一般是做数据处理,但不能做if判断语句 filter:一般只能有1个参数(可以字符串切割,变通为多个参数),过滤器,一般是return true或者false,可以和if判断语句使用.
在过滤器 {{ var|foo:"bar" }} 中 ,过滤器 foo 会被传入变量 var 和默认参数 bar。过滤器函数应该总有返回值
29、django-debug-toolbar的作用?
#是django的第三方工具包,给django扩展了调试功能 #包括查看sql语句,db查询次数,request,headers等
30、django中如何实现单元测试?
34、简述MVC和MTV
MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的、松耦合的方式连接在一起。
模型负责业务对象与数据库的映射(ORM)
视图负责与用户的交互(页面)
控制器接受用户的输入调用模型和视图完成用户的请求
Django的MTV分别代表:
Model(模型):负责业务对象与数据库的对象(ORM)
Template(模版):负责如何把页面展示给用户
View(视图):负责业务逻辑,并在适当的时候调用Model和Template
此外,Django还有一个urls分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,
view再调用相应的Model和Template。
35、django的contenttype组件的作用?
在django中,有一个记录了项目中所有model元数据的表,就是ContentType,
表中一条记录对应着一个存在的model,所以可以通过一个ContentType表的id和一个具体表中的id找到任何记录,
及先通过ContenType表的id可以得到某个model,再通过model的id得到具体的对象。
37、接口的幂等性是什么意思?
38、什么是RPC?
远程过程调用 (RPC) 是一种协议,程序可使用这种协议向网络中的另一台计算机上的程序请求服务。 RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。 过程: 首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。 在服务器端,进程保持睡眠状态直到调用信息到达为止。 当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息, 最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
39、Http和Https的区别?
1、首先Https是Http的安全版,即HTTP下加入SSL层就是Https;
2、默认端口号不同,Http是80端口,Https是443端口;
3、Http是超文本传输协议,信息是明文传输,可以自定义证书,在服务端创建一对证书,在客户 端必须携带证书;
4、采用https 的server 必须从CA 申请一个用于证明服务器用途类型的证书. 该证书只有用于对应的server 的时候,客户才信任此主机.
四、Flask框架
45、Flask框架的优势?
46、Flask框架依赖组件?
47、Flask蓝图的作用?
48、列举使用过的Flask第三方组件?
49、简述Flask上下文管理流程?
50、Flask中的g的作用?
51、Flask中上下文管理主要涉及到了那些相关的类?并描述类主要作用?
52、为什么要Flask把Local对象中的的值stack 维护成一个列表?
53、Flask中多app应用是怎么完成?
54、在Flask中实现WebSocket需要什么组件?
55、wtforms组件的作用?
56、Flask框架默认session处理机制?
57、解释Flask框架中的Local对象和threading.local对象的区别?
58、Flask中 blinker 是什么?
59、SQLAlchemy中的 session和scoped_session 的区别?
60、SQLAlchemy如何执行原生SQL?
61、ORM的实现原理?
62、DBUtils模块的作用?
63、以下SQLAlchemy的字段是否正确?如果不正确请更正:
fromdatetime importdatetime
fromsqlalchemy.ext.declarative
importdeclarative_base
fromsqlalchemy importColumn, Integer, String, DateTime
Base = 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())
64、SQLAchemy中如何为表设置引擎和字符编码?
65、SQLAchemy中如何设置联合唯一索引?
五、Tornado框架
66、简述Tornado框架的特点。
67、简述Tornado框架中Future对象的作用?
68、Tornado框架中如何编写WebSocket程序?
69、Tornado中静态文件是如何处理的? 如:
70、Tornado操作MySQL使用的模块?
71、Tornado操作redis使用的模块?
72、简述Tornado框架的适用场景?
六、git
73、git常见命令作用:
74、简述以下git中stash命令作用以及相关其他命令。
75、git 中 merge 和 rebase命令 的区别。
76、公司如何基于git做的协同开发?
77、如何基于git实现代码review?
78、git如何实现v1.0 、v2.0 等版本的管理?
79、什么是gitlab?
80、github和gitlab的区别?
81、如何为github上牛逼的开源项目贡献代码?
82、git中 .gitignore文件的作用?
83、什么是敏捷开发?
84、简述 jenkins 工具的作用?
85、公司如何实现代码发布?
86、简述 RabbitMQ、Kafka、ZeroMQ的区别?
87、RabbitMQ如何在消费者获取任务后未处理完前就挂掉时,保证数据不丢失?
88、RabbitMQ如何对消息做持久化?
89、RabbitMQ如何控制消息被消费的顺序?
90、以下RabbitMQ的exchange type分别代表什么意思?如:fanout、direct、topic。
91、简述 celery 是什么以及应用场景?
92、简述celery运行机制。
93、celery如何实现定时任务?
94、简述 celery多任务结构目录?
95、celery中装饰器 @app.task 和 @shared_task的区别?
八、算法和设计模式
116、B Tree和B+ Tree的区别?
117、请列举常见排序并通过代码实现任意三种。
118、请列举常见查找并通过代码实现任意三种。
119、请列举你熟悉的设计模式?
设计模式是经过总结、优化的,对我们经常会碰到的一些编程问题的可重用解决方案。
一个设计模式并不像一个类或一个库那样能够直接作用于我们的代码。
反之,设计模式更为高级,它是一种必须在特定情形下实现的一种方法模板。
这里列举了三种最基本的设计模式:
创建模式,提供实例化的方法,为适合的状况提供相应的对象创建方法。
结构化模式,通常用来处理实体之间的关系,使得这些实体能够更好地协同工作。
行为模式,用于在不同的实体建进行通信,为实体之间的通信提供更容易,更灵活的通信方法。
120、有没有刷过leetcode?
121、列举熟悉的的Linux命令。
122、公司线上服务器是什么系统?
123、解释 PV、UV 的含义?
#1.pv:页面访问量,没打开一次页面PV计算+1,页面刷新也是 #2.UV:独立访问数,一台电脑终端为一个访客
124、解释 QPS的含义?
125、uwsgi和wsgi的区别?
126、supervisor的作用?
127、什么是反向代理?
128、简述SSH的整个过程。
129、有问题都去那些找解决方案?
130、是否有关注什么技术类的公众号?
131、最近在研究什么新技术?
132、是否了解过领域驱动模型?