一、谈谈你对http协议的认识。
HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议。它可使浏览器更加高效,使网络传输减小。它不只保证计算机正确快速地传输超文本文档,还肯定传输文档中的哪一部分,以及哪部份内容首先显示(如文本先于图形)等。
HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。端口号为80
二、谈谈你对websocket协议的认识。
WebSocket是HTML5开始提供的一种在单个 TCP 链接上进行全双工通信的协议。
在WebSocket API中,浏览器和服务器只须要作一个握手的动做,而后,浏览器和服务器之间就造成了一条快速通道。二者之间就直接能够数据互相传送。
浏览器经过 JavaScript 向服务器发出创建 WebSocket 链接的请求,链接创建之后,客户端和服务器端就能够经过 TCP 链接直接交换数据。
三、什么是magic string ?
有触发时机在知足条件时自动触发就是魔术方法
四、如何建立响应式布局?
使用媒体查询的方式,建立多个元素宽度是相对的的布局理想的响应式布局是指的对PC/移动各类终端进行响应的
五、你曾经使用过哪些前端框架?
Bootstrap / vue
六、什么是ajax请求?并使用jQuery和对象实现一个ajax请求。
AJAX是在不加载整个页面的状况异步下与服务器发送请求交换数据并更新部分网页的艺术
1 $.ajax({
2 url:'user/add',//当前请求的url地址
3 type:'get',//当前请求的方式 get post
4 data:{id:100},//请求时发送的参数
5 dataType:'json',//返回的数据类型
6 success:function(data){
7 //ajax请求成功后执行的代码
8 console.log(data);
9 },
10 error:function(){
11 //ajax执行失败后执行的代码
12 alert('ajax执行错误');
13 },
14 timeout:2000,//设置当前请求的超时时间 异步请求生效
15 async:true //是否异步 false同步 true异步
16 })
七、如何在前端实现轮训?
特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,而后由服务器返回最新的数据给客户端的浏览器。
八、如何在前端实现长轮训?
ajax实现:在发送ajax后,服务器端会阻塞请求直到有数据传递或超时才会返回,客户端js响应处理函数会在处理完服务器返回的信息后在次发出请求,从新创建链接
九、vuex的做用?
Vue 的目标是经过尽量简单的 API 实现响应的数据绑定和组合的视图组件。
十、vue中的路由的拦截器的做用?
判断每个页面的http请求的状态获取内容作响应的处理
十一、axios的做用?
在浏览器中发送 XMLHttpRequests 请求
在 node.js 中发送 http请求
支持 Promise API
拦截请求和响应
转换请求和响应数据
自动转换 JSON 数据
客户端支持保护安全免受 XSRF 攻击
十二、列举vue的常见指令。
条件判断使用 v-if指令
循环使用 v-for 指令。
事件监听可使用 v-on 指令:
1三、简述jsonp及实现原理?
JSONP是用来解决跨域请求问题的
跨域:协议 域名 端口号有一个不同就是跨域
实现原理:
script标签src属性中的连接却能够访问跨域的js脚本,利用这个特性,服务端再也不返回JSON格式的数据,而是返回一段调用某个函数的js代码,在src中进行了调用,这样实现了跨域。
1四、什么是cors ?
CORS 全称是跨域资源共享(Cross-Origin Resource Sharing),是一种 AJAX 跨域请求资源的方式,支持现代浏览器,IE支持10以上。
1五、列举Http请求中常见的请求方式?
GET / POST
1六、列举Http请求中的状态码?
404 请求的url地址不存在
503 访问限制有权限
200 访问成功
302 重定向
1七、列举Http请求中常见的请求头?
User-Agent:浏览器类型,若是Servlet返回的内容与浏览器类型有关则该值很是有用。
Cookie:这是最重要的请求头信息之一
Content-Type:请求类型
2四、django、flask、tornado框架的比较?
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 的灵活性多是某些团队更须要的。
2五、什么是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,最后将响应返回给客户端。
2六、django请求的生命周期?
前端请求—>nginx—>uwsgi.—>中间件—>url路由—->view试图—>orm—->拿到数据返回给view—->试图将数据渲染到模版中拿到字符串—->中间件—>uwsgi—->nginx—->前端渲染
2七、列举django的内置组件?
url 、view、model、template、中间件
2八、列举django中间件的5个方法?以及django中间件的应用场景?
process_request(self,request)
process_view(self, request, callback, callback_args, callback_kwargs)
process_exception(self, request, exception)
process_response(self, request, response)
2九、简述什么是FBV和CBV?
django中请求处理方式有2种:FBV 和 CBV
FBV(function base views) 就是在视图里使用函数处理请求。
CBV(class base views)就是在视图里使用类处理请求 类须要继承view
30、django的request对象是在何时建立的?
当请求一个页面时,Django会创建一个包含请求元数据的 HttpRequest 对象。 当Django 加载对应的视图时,HttpRequest 对象将做为视图函数的第一个参数。每一个视图会返回一个HttpResponse 对象。
3一、如何给CBV的程序添加装饰器?
1 from django.views import View
2 from django.utils.decorators import method_decorator
3
4 def auth(func):
5 def inner(*args,**kwargs):
6 return func(*args,**kwargs)
7 return inner
8
9 class UserView(View):
10 @method_decorator(auth)
11 def get(self,request,*args,**kwargs):
12 return HttpResponse('...')
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('...')123456789101112
3二、列举django orm 中全部的方法(QuerySet对象的全部方法)
返回Query Set对象的方法有:
* all()
* filter()
* exclude()
* order_by()
* reverse()
* dictinct()
特殊的QuerySet:
* values() 返回一个可迭代的字典序列
* values_list() 返回一个可迭代的元祖序列
返回具体对象的:
* get()
* first()
* last()
返回布尔值的方法有:
* existe()
返回数学的方法有:
* count( )
3三、only和defer的区别?
defer : 映射中排除某列数据
only : 仅取某个列中的数据
3四、select_related和prefetch_related的区别?
select_related经过多表join关联查询,一次性得到全部数据,经过下降数据库查询次数来提高性能,但关联表不能太多,由于join操做原本就比较消耗性能
prefetch_related()的解决方法是,分别查询每一个表,而后用Python处理他们之间的关系!
都是为了减小SQL查询的数量
3五、filter和exclude的区别?
filter是查询知足条件的数据
exclude是查询不知足添加的数据
3六、列举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)123456789101112131415161718192021
3七、django orm 中如何设置读写分离?
1 class Router1:
2 def allow_migrate(self, db, app_label, model_name=None, **hints):
3 """
4 All non-auth models end up in this pool.
5 """
6 if db=='db1' and app_label == 'app02':
7 return True
8 elif db == 'default' and app_label == 'app01':
9 return True
10 else:
11 return False
12
13 # 若是返回None,那么表示交给后续的router,若是后续没有router,则至关于返回True
14
15 def db_for_read(self, model, **hints):
16 """
17 Attempts to read auth models go to auth_db.
18 """
19 if model._meta.app_label == 'app01':
20 return 'default'
21 else:
22 return 'db1'
23
24 def db_for_write(self, model, **hints):
25 """
26 Attempts to write auth models go to auth_db.
27 """
28 if model._meta.app_label == 'app01':
29 return 'default'
30 else:
31 return 'db1'
3八、F和Q的做用?
F:操做数据表中的某列值,F( )容许Django在未实际连接数据的状况下具备对数据库字段的值的引用,不用获取对象放在内存中再对字段进行操做,直接执行原生产sql语句操做。
一般状况下咱们在更新数据时须要先从数据库里将原数据取出后方在内存里,而后编辑某些属性,最后提交
Q:对对象进行复杂查询,并支持&(and),|(or),~(not)操做符。
3九、values和values_list的区别?
values方法能够获取number字段的字典列表。
values_list能够获取number的元组列表。
values_list方法加个参数flat=True能够获取number的值列表。
40、如何使用django orm批量建立数据?
1 def bulk_create(self, objs, batch_size=None):
2 # 批量插入
3 # batch_size表示一次插入的个数
4 objs = [
5 models.DDD(name='r11'),
6 models.DDD(name='r22')
7 ]
8 models.DDD.objects.bulk_create(objs, 10)
4一、django的Form和ModeForm的做用?html
1 - 做用:
2 - 对用户请求数据格式进行校验
3 - 自动生成HTML标签
4 - 区别:
5 - Form,字段须要本身手写。
6 class Form(Form):
7 xx = fields.CharField(.)
8 xx = fields.CharField(.)
9 xx = fields.CharField(.)
10 xx = fields.CharField(.)
11 - ModelForm,能够经过Meta进行定义
12 class MForm(ModelForm):
13 class Meta:
14 fields = "__all__"
15 model = UserInfo
16 - 应用:只要是客户端向服务端发送表单数据时,均可以进行使用,如:用户登陆注册
4二、django的Form组件中,若是字段中包含choices参数,请使用两种方式实现数据源实时更新。
1 方式一:重写构造方法,在构造方法中从新去数据库获取值
2 class UserForm(Form):
3 name = fields.CharField(label='用户名',max_length=32)
4 email = fields.EmailField(label='邮箱')
5 ut_id = fields.ChoiceField(
6 # choices=[(1,'二B用户'),(2,'山炮用户')]
7 choices=[]
8 )
9 def __init__(self,*args,**kwargs):
10 super(UserForm,self).__init__(*args,**kwargs)
11 self.fields['ut_id'].choices = models.UserType.objects.all().values_list('id','title')
12 方式二: ModelChoiceField字段
13 from django.forms import Form
14 from django.forms import fields
15 from django.forms.models import ModelChoiceField
16 class UserForm(Form):
17 name = fields.CharField(label='用户名',max_length=32)
18 email = fields.EmailField(label='邮箱')
19 ut_id = ModelChoiceField(queryset=models.UserType.objects.all())
20 依赖:
21 class UserType(models.Model):
22 title = models.CharField(max_length=32)
23 def __str__(self):
24 return self.title
4三、django的Model中的ForeignKey字段中的on_delete参数有什么做用?
on_delete有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五个可选择的值
CASCADE:此值设置,是级联删除。
PROTECT:此值设置,是会报完整性错误。
SET_NULL:此值设置,会把外键设置为null,前提是容许为null。
SET_DEFAULT:此值设置,会把设置为外键的默认值。
SET():此值设置,会调用外面的值,能够是一个函数。
4四、django中csrf的实现机制?
Django预防CSRF攻击的方法是在用户提交的表单中加入一个csrftoken的隐含值,这个值和服务器中保存的csrftoken的值相同,这样作的原理以下:
一、在用户访问django的可信站点时,django反馈给用户的表单中有一个隐含字段csrftoken,这个值是在服务器端随机生成的,每一次提交表单都会生成不一样的值
二、当用户提交django的表单时,服务器校验这个表单的csrftoken是否和本身保存的一致,来判断用户的合法性
三、当用户被csrf攻击从其余站点发送精心编制的攻击请求时,因为其余站点不可能知道隐藏的csrftoken字段的信息这样在服务器端就会校验失败,攻击被成功防护
具体配置以下:
template中添加{%csrf_token%}标签
4五、django如何实现websocket?
4六、基于django使用ajax发送post请求时,均可以使用哪一种方法携带csrf token?
4七、django中如何实现orm表中添加数据时建立一条日志记录。
1 在settings.py中添加:
2 LOGGING = {
3 'disable_existing_loggers': False,
4 'version': 1,
5 'handlers': {
6 'console': {
7 # logging handler that outputs log messages to terminal
8 'class': 'logging.StreamHandler',
9 'level': 'DEBUG', # message level to be written to console
10 },
11 },
12 'loggers': {
13 '': {
14 # this sets root level logger to log debug and higher level
15 # logs to console. All other loggers inherit settings from
16 # root level logger.
17 'handlers': ['console'],
18 'level': 'DEBUG',
19 'propagate': False, # this tells logger to send logging message
20 # to its parent (will send if set to True)
21 },
22 'django.db': {
23 # # django also has database level logging
24 'handlers': ['console'],
25 'level': 'DEBUG',
26 'propagate': False,
27 },
28 },
29 }
4八、django缓存如何设置?
1 三种粒度缓存
2 1 中间件级别
3 'django.middleware.cache.UpdateCacheMiddleware',
4 'django.middleware.cache.FetchFromCacheMiddleware',
5 CACHE_MIDDLEWARE_SECONDS=10
6 2 视图级别
7 from django.views.decorators.cache import cache_page
8 @cache_page(15)
9 def index(request):
10 import time
11 t=time.time()
12 return render(request,"index.html",locals())
13
14 3 局部缓存
15 {% load cache %}
16 ...
17 ...
18 {% cache 15 "time_cache" %}
19 <h3>缓存时间:{{ t }}</h3>
20 {% endcache %}
4九、django的缓存能使用redis吗?若是能够的话,如何配置?
1 pip install django-redis
2 apt-get install redis-server
3 而后在settings.py 里面添加CACHES = {
4 'default': {
5 'BACKEND': 'redis_cache.cache.RedisCache',
6 'LOCATION': '127.0.0.1:6379',
7 "OPTIONS": {
8 "CLIENT_CLASS": "redis_cache.client.DefaultClient",
9 },
10 }
50、django路由系统中name的做用?前端
name 能够用于在 templates, models, views ……中获得对应的网址,至关于“给网址取了个小名”,只要这个名字不变,网址变了也能经过名字获取到。
5一、django的模板中filter和simple_tag的区别?
simple_tag
-参数任意,可是不能做为if条件判断的条件
filter
-参数最多只能有两个,可是能够做为if条件判断的条件。
5二、django-debug-toolbar的做用?
5三、django中如何实现单元测试?
5四、解释orm中 db first 和 code first的含义?
datebase first就是表明数据库优先,那么前提就是先建立数据库。
model first就是表明model优先,那么前提也就是先建立model,而后根据model自动创建数据库。
5五、django中如何根据数据库表生成model中的类?
5六、使用orm和原生sql的优缺点?
ORM框架:
对象关系映射,经过建立一个类,这个类与数据库的表相对应!类的对象代指数据库中的一行数据。
简述ORM原理:
让用户再也不写SQL语句,而是经过类以及对象的方式,和其内部提供的方法,进行数据库操做!把用户输入的类或对象转换成SQL语句,转换以后经过pymysql执行完成数据库的操做。
ORM的优缺点:
优势:
* 提升开发效率,下降开发成本
* 使开发更加对象化
* 可移植
* 能够很方便地引入数据缓存之类的附加功能
缺点:
* 在处理多表联查、where条件复杂之类的查询时,ORM的语法会变得复杂。就须要写入原生SQL。
5七、简述MVC和MTV
MTV和MVC?
MVC: 模型 视图 控制器
MTV: 模型 模板 视图
5八、django的contenttype组件的做用?
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,第一次删除数据,第二次不会再次删除,幂等。
6一、什么是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依靠证书来验证服务器的身份,并为浏览器和服务器之间的通讯加密。
6三、为何要使用django rest framework框架?
1.客户端-服务端分离
优势:提升用户界面的便携性,经过简化服务器提升可伸缩性….
2.无状态(Stateless):从客户端的每一个请求要包含服务器所须要的全部信息
优势:提升可见性(能够单独考虑每一个请求),提升了可靠性(更容易从局部故障中修复),提升可扩展性(下降了服务器资源使用)
3.缓存(Cachable):服务器返回信息必须被标记是否能够缓存,若是缓存,客户端可能会重用以前的信息发送请求
优势:减小交互次数,减小交互的平均延迟
4.统一接口
优势:提升交互的可见性,鼓励单独改善组件
5.支持按需代码(Code-On-Demand 可选)
优势:提升可扩展性
6四、django rest framework框架中都有那些组件?
1 - 路由,自动帮助开发者快速为一个视图建立4个url
2 www.oldboyedu.com/api/v1/student/$
3 www.oldboyedu.com/api/v1/student(?P<format>\w+)$
4 www.oldboyedu.com/api/v1/student/(?P<pk>\d+)/$
5 www.oldboyedu.com/api/v1/student/(?P<pk>\d+)(?P<format>\w+)$
6 - 版本处理
7 - 问题:版本均可以放在那里?
8 - url
9 - GET
10 - 请求头
11 - 认证
12 - 问题:认证流程?
13 - 权限
14 - 权限是否能够放在中间件中?以及为何?
15 - 访问频率的控制
16 - 匿名用户能够真正的防止?没法作到真正的访问频率控制,只能把小白拒之门外。
17 若是要封IP,使用防火墙来作。
18 - 登陆用户能够经过用户名做为惟一标示进行控制,若是有人注册不少帐号,也没法防止。
19 - 视图
20 - 解析器 ,根据Content-Type请求头对请求体中的数据格式进行处理。request.data
21 - 分页
22 - 序列化
23 - 序列化
24 - source
25 - 定义方法
26 - 请求数据格式校验
27 - 渲染器
28
6五、django rest framework框架中的视图均可以继承哪些类?vue
a. 继承 APIView
1 这个类属于rest framework中顶层类,内部帮助咱们实现了只是基本功能:认证、权限、频率控制,但凡是数据库、分页等操做都须要手动去完成,比较原始。
2
3 class GenericAPIView(APIView)
4 def post(...):
5 pass
b. 继承 GenericViewSet(ViewSetMixin, generics.GenericAPIView)
若是继承它以后,路由中的as_view须要填写对应关系 .as_view({‘get’:’list’,’post’:’create’})
在内部也帮助咱们提供了一些方便的方法:
- get_queryset
- get_object
- get_serializer
1 注意:要设置queryset字段,不然会跑出断言的异常。
2 # 只提供增长功能
3 class TestView(GenericViewSet):
4 serializer_class = XXXXXXX
5 def create(self,*args,**kwargs):
6 pass # 获取数据并对数据进行操做
c. 继承
- ModelViewSet
- mixins.CreateModelMixin,GenericViewSet
- mixins.CreateModelMixin,DestroyModelMixin,GenericViewSet
1 对数据库和分页等操做不用咱们在编写,只须要继承相关类便可。
2 示例:只提供增长功能
3 class TestView(mixins.CreateModelMixin,GenericViewSet):
4 serializer_class = XXXXXXX
6六、简述 django rest framework框架的认证流程。
如何编写?写类并实现authticate
方法中能够定义三种返回值:
(user,auth),认证成功
None , 匿名用户
异常 ,认证失败
流程:
dispatch
再去request中进行认证处理
6七、django rest framework如何实现的用户访问频率控制?
a. 基于用户IP限制访问频率
b. 基于用户IP显示访问频率(利于Django缓存)
c. view中限制请求频率
d. 匿名时用IP限制+登陆时用Token限制
6八、Flask框架的优点?
1、总体设计方面
首先,二者都是很是优秀的框架。总体来说,二者设计的哲学是区别最大的地方。Django提供一站式的解决方案,从模板、ORM、Session、Authentication等等都分配好了,连app划分都作好了,总之,为你作尽可能多的事情,并且还有一个killer级的特性,就是它的admin,配合django-suit,后台就出来了,其实最初Django就是由在新闻发布公司工做的人设计的。Flask只提供了一些核心功能,很是简洁优雅。它是一个微框架,其余的由扩展提供,但它的blueprint使它也可以很方便的进行水平扩展。
2、路由设计
Django的路由设计是采用集中处理的方法,利用正则匹配。Flask也能这么作,但更多的是使用装饰器的形式,这个有优势也有缺点,优势是读源码时看到函数就知道怎么用的,缺点是一旦源码比较长,你要查路由就不太方便了,但这也促使你去思考如何更合理的安排代码。
3、应用模块化设计
Django的模块化是集成在命令里的,也就是说一开始Django的目标就是为之后玩大了作准备的。每一个都是一个独立的模块,为之后的复用提供了便利。Flask经过Blueprint来提供模块化,本身对项目结构划分红不一样的模块进行组织。
6九、Flask框架依赖组件?
Route(路由)
templates(模板)
Models(orm模型)
blueprint(蓝图)
Jinja2模板引擎
70、Flask蓝图的做用?
将不一样的功能模块化
构建大型应用
优化项目结构
加强可读性,易于维护(跟Django的view功能类似)
7一、列举使用过的Flask第三方组件?
内置:
- 配置
- 路由
- 视图
- 模板
- session
- 闪现
- 蓝图
- 中间件
- 特殊装饰器
第三方:
- Flask组件:
- flask-session
- flask-SQLAlchemy
- flask-migrate
- flask-script
- blinker
- 公共组件:
- wtforms
- dbutile
- sqlalchemy
- 自定义Flask组件
- auth ,参考flask-login组件
7二、简述Flask上下文管理流程?
每次有请求过来的时候,flask 会先建立当前线程或者进程须要处理的两个重要上下文对象,把它们保存到隔离的栈里面,这样视图函数进行处理的时候就能直接从栈上获取这些信息。
7三、Flask中的g的做用?
g 至关于一次请求的全局变量,当请求进来时将g和current_app封装为一个APPContext类,在经过LocalStack将Appcontext放入Local中,取值时经过偏函数,LocalStack、loca l中取值,响应时将local中的g数据删除
7四、Flask中上下文管理主要涉及到了那些相关的类?并描述类主要做用?
flask
requestcontext
request
securecookiesessioninterface
securecookiesession
7五、为何要Flask把Local对象中的的值stack 维护成一个列表?
当是web应用时:无论是单线程仍是多线程,栈中只有一个数据
- 服务端单线程:
{
111:{stack: [ctx, ]}
}
- 服务端多线程:
{
111:{stack: [ctx, ]}
112:{stack: [ctx, ]}
}
7六、Flask中多app应用是怎么完成?
请求进来时,能够根据URL的不一样,交给不一样的APP处理
7七、在Flask中实现WebSocket须要什么组件?
Flask-SocketIO
Flask-Sockets是Flask框架的一个扩展,经过它,Flask应用程序可使用WebSocket。
7八、wtforms组件的做用?
WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证。
https://www.cnblogs.com/big-handsome-guy/p/8552079.html
7九、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
做用:为每一个线程开辟一块空间进行数据存储。
b. 自定义Local对象
做用:为每一个线程(协程)开辟一块空间进行数据存储。
https://www.jianshu.com/p/3f38b777a621
8一、Flask中 blinker 是什么?
Flask框架中的信号基于blinker,可让开发者在flask请求过程当中 定制一些用户行为执行。
在请求先后,模板渲染先后,上下文先后,异常 的时候
8二、SQLAlchemy中的 session和scoped_session 的区别?
使用scoped_session的目的主要是为了线程安全。
scoped_session相似单例模式,当咱们调用使用的时候,会先在Registry里找找以前是否已经建立session了。
要是有,就把这个session返回。
要是没有,就建立新的session,注册到Registry中以便下次返回给调用者。
这样就实现了这样一个目的:在同一个线程中,call scoped_session 的时候,返回的是同一个对象
8三、SQLAlchemy如何执行原生SQL?
1 from sqlalchemy import create_engine
2 from sqlalchemy.orm import sessionmaker
3 engine = create_engine('mysql://root:*****@127.0.0.1/database?charset=utf8')
4 DB_Session = sessionmaker(bind=engine)
5 session = DB_Session()
6 session.execute('alter table mytablename drop column mycolumn ;')
8四、ORM的实现原理?node
概念: 对象关系映射(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直接编码,可以像操做对象同样从数据库获取数据。
8五、DBUtils模块的做用?
使用DBUtils模块
两种使用模式:
1. 为每一个线程建立一个链接,链接不可控,须要控制线程数
1. 建立指定数量的链接在链接池,当线程访问的时候去取,若是不够了线程排队,直到有人释放。平时建议使用这种!
8六、如下SQLAlchemy的字段是否正确?若是不正确请更正:
1 fromdatetime importdatetime
2 fromsqlalchemy.ext.declarative
3 importdeclarative_base
4 fromsqlalchemy importColumn, Integer, String, DateTime
5 Base = declarative_base()
6 classUserInfo(Base):
7 __tablename__ = 'userinfo'
8 id = Column(Integer, primary_key= True, autoincrement= True)
9 name = Column(String( 64), unique= True)
10 ctime = Column(DateTime, default=datetime.now())
11 ctime字段中的参数应该为default=datetime.now, now后面不该该加括号.若是加了,字段不会随时更新
8七、SQLAchemy中如何为表设置引擎和字符编码?
sqlalchemy设置编码字符集必定要在数据库访问的URL上增长charset=utf8,不然数据库的链接就不是utf8的编码格式
eng = create_engine(‘mysql://root:root@localhost:3306/test2?charset=utf8’,echo=True)
88. SQLAlchemy中如何设置联合惟一索引?
UniqueConstraint 设置联合惟一索引
8九、简述Tornado框架的特色。
Tornado的独特之处在于其全部开发工具可以使用在应用开发的任意阶段以及任何档次的硬件资源上。并且,完整集的Tornado工具可使开发人员彻底不用考虑与目标链接的策略或目标存储区大小。
Tornado 结构的专门设计为开发人员和第三方工具厂商提供了一个开放环境。已有部分应用程序接口能够利用并附带参考书目,内容从开发环境接口到链接实现。Tornado包括强大的开发和调试工具,尤为适用于面对大量问题的嵌入式开发人员。这些工具包括C和C++源码级别的调试器,目标和工具管理,系统目标跟踪,内存使用分析和自动配置. 另外,全部工具能很方便地同时运行,很容易增长和交互式开发。
90、简述Tornado框架中Future对象的做用?
91. Tornado框架中如何编写WebSocket程序?
9二、Tornado中静态文件是如何处理的?如:
处理方法:
static_path = os.path.join(os.paht.dirname(file), “static”) #这里增长设置了静态路径
另一个修改就是在实例化 tornado.web.Application() 的时候,在参数中,出了有静态路径参数 static_path ,还有一个参数设置 debug=True
9三、Tornado操做MySQL使用的模块?
torndb是一个轻量级的基于MySQLdb封装的一个模块,从tornado3.0版本之后,其已经做为一个独立模块发行了。torndb依赖于MySQLdb模块,所以,在使用torndb模块时,要保证系统中已经有MySQLdb模块。
9四、Tornado操做redis使用的模块?
tornado-redis
9五、简述Tornado框架的适用场景?
Tornado是使用Python编写的一个强大的、可扩展的Web服务器。它在处理严峻的网络流量时表现得足够强健,但却在建立和编写时有着足够的轻量级,并可以被用在大量的应用和工具中。
咱们如今所知道的Tornado是基于Bret Taylor和其余人员为FriendFeed所开发的网络服务框架,当FriendFeed被Facebook收购后得以开源。不一样于那些最多只能达到10,000个并发链接的传统网络服务器,Tornado在设计之初就考虑到了性能因素,旨在解决C10K问题,这样的设计使得其成为一个拥有很是高性能的框架。此外,它还拥有处理安全性、用户验证、社交网络以及与外部服务(如数据库和网站API)进行异步交互的工具。 --------------------- 做者:爱python的王三金 来源:CSDN 原文:https://blog.csdn.net/qq_37275405/article/details/81226192 版权声明:本文为博主原创文章,转载请附上博文连接!