标签:pipe last 服务器 dbutil i+1 max pre hang 而且
注意: WebSocket
实际上指的是一种协议,与我们熟知的 Http
协议是同等协议栈的一个网络协议。用网络模型结构来解释的话, WebSocket
和 Http
协议都属于 应用层协议,两者都基于传输层协议 TCP
协议。
vue
参考链接:https://www.cnblogs.com/sdgf/p/4765151.html
var xhr = new XMLHttpRequest();
setInterval(function(){
xhr.open(‘GET’,’/user’);
xhr.onreadystatechange = function(){
};
xhr.send();
},1000)
function ajax(){
var xhr = new XMLHttpRequest();
xhr.open(‘GET’,’/user’);
xhr.onreadystatechange = function(){
ajax();
};
xhr.send();
}
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态.
ue-resource的interceptors拦截器的作用正是解决此需求的妙方。在每次http的请求响应之后,如果设置了拦截器如下,会优先执行拦截器函数,获取响应体,然后才会决定是否把response返回给
then进行接收。那么我们可以在这个拦截器里边添加对响应状态码的判断,来决定是跳转到登录页面还是留在当前页面继续获取数
CORS是一个w3c标准,全称是"跨域资源共享"(Cross-origin resource sharing),但一个请求url的协议,域名,端口三者之间任意与当前页面地址不同即为跨域.它允许浏览器向跨源服务器发送XMLHttpRequest请求,从而克服AJAX只能同源使用的限制.
OPTIONS、HEAD、GET、POST、PUT、DELETE、TRACE、CONNECT
1xx:消息
100服务器仅接收到部分消息,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求
103用于PUT或者POST请求恢复失败时的恢复请求建议。
2xx:成功
200:请求成功
3xx:重定向
300:多重选择,链表列表,用户可以选择某链接达到目的地,最多选五个地址
301:所有页面已经转移至新的URL
302:所有的页面已经临时转移至新的URL
4xx:客户端有错误
400:因为语法错误服务器未能解析
401:合法请求,但对被请求页面的访问禁止,因为被请求的页面需要身份验证,客户端没有提供或者身份验证失败
404:服务器无法找到被请求的页面
5xx: 服务器错误
500:请求未完成,服务器遇到不可预知的情况
501:请求未完成,服务器不支持所请求的功能,或者服务器无法完成请求的功能
502:请求未完成,服务器充当网关或者代理的角色,从上游服务器收到一个无效的响应
503:服务器当前不可用
504:网关超时。服务器充当网关或者代理的角色时,未能从上游服务器获得一个及时的响应
505:不支持请求中指明的HTTP协议版本
511:用户需要提供身份证来获取网络访问入口
accept:浏览器通过这个头告诉服务器,它所支持的类型
Accept-Charset:浏览器通过这个头告诉服务器,它支持那种字符集
Accept-Encoding:浏览器通过这个头告诉服务器,支持的压缩格式
host:浏览器通过这个头告诉服务器,想访问那台主机
Referer:浏览器通过这个头告诉服务器客户机是从哪个页面来的,防盗链
Connection:浏览器通过这个头告诉服务器,请求完成后是断开连接还是何持连接
django:大而全
flask:轻量级,第三方库多
tornado:天生异步,功能少
wsgi全称是"Web Server Gateway Interfacfe",web服务器网关接口,wsgi在python2.5中加入,是web服务器和web应用的标准接口,任何实现了该接口的web服务器和web应用都能无缝协作。
访问一个URL首先经过uwsgi>中间件>路由>视图>model or 模板>然后返回一个respone
Admin是对model中对应的数据表进行增删改查提供的组件
model组件:负责操作数据库
form组件:1.生成HTML代码2.数据有效性校验3校验信息返回并展示
ModelForm组件即用于数据库操作,也可用于用户请求的验证
.process_request : 请求进来时,权限认证
.process_view : 路由匹配之后,能够得到视图函数
.process_exception : 异常时执行
.process_template_responseprocess : 模板渲染时执行
.process_response : 请求有响应时执行场景:ip限制,黑白名单,URL访问过滤,缓存
FBV和CBV本质是一样的,基于函数的视图叫做FBV,基于类的视图叫做CBV
在python中使用CBV的优点:
- .提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)
- .可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性
class WSGIHandler(base.BaseHandler):
-------request = self.request_class(environ)
请求走到WSGIHandler类的时候,执行call方法,将environ封装成了request
1、给方法加: @method_decorator(check_login) def post(self, request): ...
2、给dispatch加: @method_decorator(check_login) def dispatch(self, request, *args, **kwargs): ...
3、给类加: @method_decorator(check_login, name="get") @method_decorator(check_login, name="post") class HomeView(View): ...
<1> all(): 查询所有结果
<2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象。获取不到返回None
<3> get(**kwargs): 返回与所给筛选条件相匹
配的对象,返回结果有且只有一个。 如果符合筛选条件的对象超过一个或者没有都会抛出错误。 <4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象
<5> order_by(*field): 对查询结果排序
<6> reverse(): 对查询结果反向排序
<7> count(): 返回数据库中匹配查询(QuerySet)的对象数量。
<8> first(): 返回第一条记录
<9> last(): 返回最后一条记录
<10> exists(): 如果QuerySet包含数据,就返回True,否则返回False
<11> values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的 并不是一系 model的实例化对象,而是一个可迭代的字典序列
<12> values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
<13> distinct(): 从返回结果中剔除重复纪
#only:从数据库中只取指定字段的内容
#defer:指定字段的内容不被检索
前提:有外键存在时,可以很好的减少数据库请求的次数,提高性能
select_related通过多表join关联查询,一次性获得所有数据,只执行一次SQL查询
prefetch_related分别查询每个表,然后根据它们之间的关系进行处理,执行两次查询
两者取到的值都是QuerySet对象,filter选择满足条件的,exclude:排除满足条件的.
1.使用execute执行自定义的SQL
直接执行SQL语句(类似于pymysql的用法)
# 更高灵活度的方式执行原生SQL语句
from django.db import connection
cursor = connection.cursor()
cursor.execute("SELECT DATE_FORMAT(create_time, ‘%Y-%m‘) FROM blog_article;")
ret = cursor.fetchall()
print(ret)
2.使用extra方法 :queryset.extra(select={"key": "原生的SQL语句"})
3.使用raw方法
1.执行原始sql并返回模型
2.依赖model多用于查询
手动:在使用数据库时,通过.using(db_name)
来手动指定要使用的数据库
自动读写分离:通过配置数据库路由,来自动实现,这样就不需要每次读写都手动指定数据库了。数据库路由中提供了四个方法。这里这里主要用其中的两个:def db_for_read()
决定读操作的数据库,def db_for_write()
决定写操作的数据库
#F:对数据本身的不同字段进行操作,例如:比较和更新
#Q:用户构造复杂的查询条件如:&|操作
values返回的是一个字典
values_list 返回的是一个元组
#bulk_create()
#objs=[models.Book(title="图书{}".format(i+15)) for i in range(100)]
#models.Book.objects.bulk_create(objs)
Form:
在前端生成HTML代码
对数据有效校验
返回校验信息并展示
保留上次输入的内容
ModeForm:
根据模型类生成form组件,并且可以操作数据库
#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对象
#删除关联表中的数据时,当前表与其关联的field的操作
#Django2.0后,表与表之间关联的时候,必须要写on_delete参数,否则会报错
#第一步:django第一次响应来自某个客户端的请求时,后端随机产生一个token值,把这个token保存在SESSION状态中;同时,后端把这个token放到cookie中交给前端页面;
#第二步:下次前端需要发起请求(比如发帖)的时候把这个token值加入到请求数据或者头信息中,一起传给后端;Cookies:{csrftoken:xxxxx}
#第三步:后端校验前端请求带过来的token和SESSION里的token是否一致;
安装插件dwebsocket
#1、后端将csrftoken传到前端,发送post请求时携带这个值发送
data {
csrfmiddlewaretoken:”{{ csrf_token }}”
}
#2、获取form中隐藏标签的csrftoken的值,加入到请求数据中传给后端
data:{
csrfmiddlewaretoken:$(‘[name=”csrfmiddlewaretoken”]’).val()
},
#3、cookie中存在csrftoken,将csrftoken值放到请求头中
headers:{“X-CSRFtoken”:$.cookie(“csrftoken”)}
pass
# 全站缓存
MIDDLEWARE_CLASSES = (
‘django.middleware.cache.UpdateCacheMiddleware’, #第一
‘django.middleware.common.CommonMiddleware‘,
‘django.middleware.cache.FetchFromCacheMiddleware’, #最后
)
# 视图缓存
from django.views.decorators.cache import cache_page
import time
@cache_page(15) #超时时间为15秒
def index(request):
t=time.time() #获取当前时间
return render(request,"index.html",locals())
# 模板缓存
{% load cache %}
<h3 style="color: green">不缓存:-----{{ t }}</h3>
{% cache 2 ‘name‘ %} # 存的key
<h3>缓存:-----:{{ t }}</h3>
{% endcache %}
#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")
类似于给URL取一个别名,方便视图调用的时候,进行解耦合
filter:只可以传两个参数 语法{{参数|filter函数名:参数2}}
simple_tag:可以传入不限量的参数 语法{% simple_tag函数名 参数1 参数2 %}
它是Django的第三方包工具,给Django扩展了调试功能,它包括了查看执行sql语句,db查询次数,request,headers,调试概览等
使用Python的unittest模块,这个模块使用基于类的方法来定义测试。类名为
Django.test.TestCase,继承于Python的unittest.TestCase.
#数据持久化的方式
db first基于已存在的数据库,生成模型
code first基于已在的模型,生成数据库库
1)在setting在配置中设置要连接的数据库
2)生成model模型文件
Python manage.py inspectdb
3)模型文件导入models中
python manage.py inspectdb > app/models.py
#1.orm的开发速度快,操作简单。使开发更加对象化
#执行速度慢。处理多表联查等复杂操作时,ORM的语法会变得复杂
#2.sql开发速度慢,执行速度快。性能强
#MVC软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)
#Model:负责业务对象与数据库的映射(ORM)
#View:负责与用户的交互
#Control:接受用户的输入调用模型和视图完成用户的请求
#Django框架的MTV设计模式借鉴了MVC框架的思想,三部分为:Model、Template和View
#Model(模型):负责业务对象与数据库的对象(ORM)
#Template(模版):负责如何把页面展示给用户
#View(视图):负责业务逻辑,并在适当的时候调用Model和Template
#此外,Django还有一个urls分发器,
#它将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template
这个组件保存了项目所有app和model的对应关系,每当我们创建了新的model并执行数据库迁移后,ContentType表中就会自动增加一条记录
当一张表和多个表的fk关联,并且多个fk只能选择其中一个或者其中N个,可以利用contentTypes
#首先restful是一种软件架构风格或者说是一种设计风格,并不是标准,它只是提供了一组设计#原则和约束条件,主要用于客户端和服务器交互类的软件。
#就像设计模式一样,并不是一定要遵循这些原则,而是基于这个风格设计的软件可以更简洁,更#有层次,我们可以根据开发的实际情况,做相应的改变。
#它里面提到了一些规范,例如:
#1.restful 提倡面向资源编程,在url接口中尽量要使用名词,不要使用动词
#2、在url接口中推荐使用Https协议,让网络接口更加安全
#https://www.bootcss.com/v1/mycss?page=3
#(Https是Http的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,
#因此加密的详细内容就需要SSL(安全套接层协议))
#3、在url中可以体现版本号
#https://v1.bootcss.com/mycss
#不同的版本可以有不同的接口,使其更加简洁,清晰
#4、url中可以体现是否是API接口
#https://www.bootcss.com/api/mycss
#5、url中可以添加条件去筛选匹配
#https://www.bootcss.com/v1/mycss?page=3
#6、可以根据Http不同的method,进行不同的资源操作
#(5种方法:GET / POST / PUT / DELETE / PATCH)
#7、响应式应该设置状态码
#8、有返回值,而且格式为统一的json格式
#9、返回错误信息
#返回值携带错误信息
#10、返回结果中要提供帮助链接,即API最好做到Hypermedia
#如果遇到需要跳转的情况 携带调转接口的URL
ret = {
code: 1000,
data:{
id:1,
name:‘小强‘,
depart_id:http://www.luffycity.com/api/v1/depart/8/
}
}
#1.是系统的接口对外一种承诺(而不是实现)
#2.承诺只要调用接口成功,外部多次调用对系统的影响都是一致的,不会对资源重复操作
#1.RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。
#2.首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。
#2.在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,
#3.最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
http是没有加密的协议
https是:http+ssl实现证书的加密
#能自动生成符合 RESTful 规范的 API
#1.在开发REST API的视图中,虽然每个视图具体操作的数据不同,
#但增、删、改、查的实现流程基本一样,这部分的代码可以简写
#2.在序列化与反序列化时,虽然操作的数据不同,但是执行的过程却相似,这部分的代码也可以简写
#REST framework可以帮助简化上述两部分的代码编写,大大提高REST API的开发速度
#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中获取版本,根据版本不同 做不同处理
#class View(object):
#class APIView(View): 封装了view,并且重新封装了request,初始化了各种组件
#class GenericAPIView(views.APIView):
#1.增加了一些属性和方法,如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):pass
#继承了mixins下的一些类,封装了list,create,update等方法
#和GenericViewSet
#1.用户请求走进来后,走APIView,初始化了默认的认证方法
#2.走到APIView的dispatch方法,initial方法调用了request.user
#3.如果我们配置了认证类,走我们自己认证类中的authentication方法
#使用IP/用户账号作为键,每次的访问时间戳作为值,构造一个字典形式的数据,存起来,每次访问时对时间戳列表的元素进行判断,
#把超时的删掉,再计算列表剩余的元素数就能做到频率限制了
#匿名用户:使用IP控制,但是无法完全控制,因为用户可以换代理IP登录用户:使用账号控制,但是如果有很多账号,也无法限制
28. 以下SQLAlchemy的字段是否正确?如果不正确请更正:
1 2 3 4 5 6 7 8 9 10 11 |
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()) |
标签:pipe last 服务器 dbutil i+1 max pre hang 而且
原文地址:https://www.cnblogs.com/liuxiangpy/p/9904692.html