django请求的生命周期?
用户请求 --> wsgi --> jango的中间件(方法process_request) --> url路由匹配 --> 视图 --> orm数据库操作 --> 模板渲染
–> 中间件(方法process_response) --> wsgi -->用户
Restful 设计规范:
1. 协议 API与用户通信协议总是使用Https协议,但是我们有些网站也用到了Http协议
2. 域名 应该尽量将Api部署在专用域名下
https://api.example.com
如果Api简单不进一步发展 可以考虑放在主域名下
https://example.org/"api/"
3. 应将Api版本号放入url中
https://api.example.com/"v1/"
4. 路径 每个网址代表一种资源,所以网址不能有动词,只能有名词,而所用名词应当与数据库的表格名相对应
5. HTTP 动词
GET 从服务器取出资源
POST 从服务器新建资源
PUT 在服务器更新资源
PATCH 在服务器更新资源
DELETE 在服务器删除资源还有两个不常用的HTTP动词。
HEAD:获取资源的元数据。
OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的
6.过滤信息
?limit=10:指定返回记录的数量
?offset=10:指定返回记录的开始位置。
?page=2&per_page=100:指定第几页,以及每页的记录数。
?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。
?animal_type_id=1:指定筛选条件
7. 状态码
服务器向用户返回的状态码和提示信息除了按规定的状态码,在我们开发过程中也可以自定义状态吗
8. 错误处理(Error handling)
如果状态码是4xx,就应该向用户返回出错信息。一般来说,返回的信息中将error作为键名,出错信息作为键值即可。
{
error: “Invalid API key”
}
9. 返回结果
针对不同操作,服务器向用户返回的结果应该符合以下规范。
GET /collection:返回资源对象的列表(数组)
GET /collection/resource:返回单个资源对象
POST /collection:返回新生成的资源对象
PUT /collection/resource:返回完整的资源对象
PATCH /collection/resource:返回完整的资源对象
DELETE /collection/resource:返回一个空文档
10. Hypermedia API
RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API方法,使得用户不查文档,也知道下一步应该做什么。
比如,当用户向api.example.com的根目录发出请求,会得到这样一个文档。
{“link”: {
“rel”: “collection https://www.example.com/zoos”,
“href”: “https://api.example.com/zoos”,
“title”: “List of zoos”,
“type”: “application/vnd.yourformat+json”
HTTP端口号? HTTPS端口号?
HTTP 服务器,默认端口号为80/tcp(木马Executor开放此端口)
HTTPS(securely transferring web pages)服务器,默认端口号为443/tcp 443/udp
Python 的设计模式有哪些?
单例模式:
1.当每个实例都会占用资源,而且实例初始化会影响性能,这个时候就可以考虑使用单例模式,它给我们带来的好处是只有一个实例占用资源,并且只需初始化一次;
2.当有同步需要的时候,可以通过一个实例来进行同步控制,比如对某个共享文件(如日志文件)的控制,对计数器的同步控制等,这种情况下由于只有一个实例,所以不用担心同步问题。
所有模式详见链接:https://yq.aliyun.com/articles/70448
session采用发呆时间,默认是用户不操作超过20分钟即失效。
cookie一般分两种。1.不设置过期时间,会存在内存里,浏览器关闭即失效。2.设置过期时间,会存在硬盘里,一直到过期时间才失效。
django请求的生命周期?
用户请求 --> wsgi --> jango的中间件(方法process_request) --> url路由匹配 --> 视图 --> orm数据库操作 --> 模板渲染 --> 中间件(方法process_response) --> wsgi -->用户
django解决跨域请求的问题?
解决方案
1.安装django-cors-headers
pip install django-cors-headers
2.配置settings.py文件
INSTALLED_APPS = [
…
‘corsheaders’,
…
]
MIDDLEWARE_CLASSES = (
…
‘corsheaders.middleware.CorsMiddleware’,
‘django.middleware.common.CommonMiddleware’, # 注意顺序
…
)
#跨域增加忽略
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True
CORS_ORIGIN_WHITELIST = (
‘*’
)
Django - 中间件(Middleware)
链接:https://www.jianshu.com/p/24eadb67c176
Python开发【Django】:中间件、CSRF
链接:http://www.cnblogs.com/lianzhilei/p/6364061.html
列表生成式
class A(object):
pass
class B(object):
pass
a = [item() for item in [A,B]]
print(a)
b = []
for item in [A,B]:
b.append(item())
print(b)
b = []
for item in [A,B]:
obj = item()
b.append(obj)
print(b)
反射
django 源码里面用了大量的反射’
getattr setattr deleteattr hasattr
class A(object):
bar = 1
# 第一种调用
a = A()
print(a.bar)
print(A.bar)
# 第二种调用
a = A()
print(getattr(a,'bar'))
#如果没有取bar2 赋值
print(getattr(a,'bar2',888))
#hasattr() 判断某个对象 里面 是不是有我们要的属性
if hasattr(a,'bar'):
print('有')
else:
print('没有')
# setattr 可以添加一个属性
if hasattr(a,'bar2'):
pass
else:
setattr(a, 'bar2', 999)
print(a.bar2)
#deleteattr 删除
if hasattr(a,'bar2'):
delattr(A,'bar2')
print(a.bar2)
# 测试案例:
class User(object):
def __init__(self,name):
self.name = name
def eat(self):
print('{}在吃'.format(self.name))
def run(self):
print('{}在吃'.format(self.name))
p = User('小明')
c = input('请输入调入')
if hasattr(p,c):
a = getattr(p,c)
a()
else:
print('么有')
# 反射例子2
def sing(self):
print('{}在唱歌'.format(self.name))
class User(object):
def __init__(self,name):
self.name = name
def eat(self):
print('{}在吃'.format(self.name))
def run(self):
print('{}在吃'.format(self.name))
p = User('小明')
c = input('请输入调入')
if hasattr(p,c):
a = getattr(p,c)
a()
else:
setattr(p,c,sing)
a = getattr(p,c)
a(p)
# 删除
def sing(self):
print('{}在唱歌'.format(self.name))
class User(object):
def __init__(self,name):
self.name = name
def eat(self):
print('{}在吃'.format(self.name))
def run(self):
print('{}在吃'.format(self.name))
p = User('小明')
delattr(p,'name')
# print(p.name)
try:
print(p.name)
except AttributeError as b:
print('没有')
request 反射
import requests
class Http(object):
def get(self,url):
res = requests.get(url).text
return res
def post(self,url):
res = requests.get(url).text
return res
# def delete(self,url):
# res = requests.get(url).text
# return res
url = input('请输入网址')
method = input('请输入请求方式')
h = Http()
result = ''
# 如果不是反射
# if method.upper() == 'GET':
# result = h.get(url)
# else:
# result = h.post(url)
# print(result)
# 反射
if hasattr(h,method):
a = getattr(h,method)
result = a(url)
print(result)
else:
print('请求错误')
HTTP简介
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等),HTTP是一个属于应用层的面向对象的协议,HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。
1、客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www.oakcms.cn。
2、发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。
3、服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。
4、释放连接TCP连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;
5、客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
linux下,socket端口不能释放
我的工作流中有一个即时消息服务器,布署在tomcat下。在linux系统环境下启动tomcat后,服务器跟着启动,指定socket端口处于监听状态,但在tomcat停止时,socket不能释放。同样的应用,在windows环境下就是正常的。
在linux下启动消息服务器时,用“/tomcat/bin/catalina.sh run”命令。如果当前在bin目录下,执行“./catalina.sh run ”。结束消息服务时,直接按Ctrl+C。不能用其它命令。
如果用远程登陆软件时,可能会把操作窗口关闭,不支持Ctrl+C快捷键。此时可以执行如下命令:
lsof –i:9888中的9888为被占用的socket端口号。
kill -9 4495中的4495为lsof命令显示的pid列的值,即进程号。
执行后可正常启动服务。
转自:http://www.linuxdiyf.com/viewarticle.php?id=110740
如何理解Python装饰器?
装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
Python-闭包详解?
在函数编程中经常用到闭包。闭包是什么,它是怎么产生的及用来解决什么问题呢。给出字面的定义先:闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境)(想想Erlang的外层函数传入一个参数a, 内层函数依旧传入一个参数b, 内层函数使用a和b, 最后返回内层函数)。这个从字面上很难理解,特别对于一直使用命令式语言进行编程的程序员们。本文将结合实例代码进行解释。
----------------------------------
Django框架
DRF 接口
Http协议 七层协议
超文本传输协议 应用层的协议
在传输层的用的TCP 三次握手/四次挥手
无状态的协议,cookie和session
状态码
200
403
404
405 Method Not Allowed
301 永久重定向
302 临时
500 服务器
请求方式:
get post delete put options
http 1.0 – 短连接
http 1.1 – 长连接
当你在浏览器上写了一个地址,按下回车以后做了什么事?
www.baidu.com ---- DNS解析—三次握手–请求服务器内容
nginx:
动静分离:
反向代理:
负载均衡:
跨域问题: 同源策略
重量级框架:
ORM
Model
迁移
管理后台
轻量级框架
路由和视图
Flask 路由 都是Werkzeug
公司业务不变 快速 django框架
公司业务变化快 flask框架 搭建一套符合自己公司后端架构
一个视图函数 支持多个路由绑定
重定向用的是视图函数的名字
url(r"^/index/(\d+)",view.index)
http://0.0.0.0:5000/mycenter/3123172983712897
http://0.0.0.0:5000/mycenter/3123172/983712897
path 认为/也是参数的一部分
转换器: 匹配url后面的参数,用正则匹配
phone int转化器
自定义转化器
class Father():
def init():
self.money = 10000000
class Son():
def __init__():
super().__init__
self.name = "xiaowang"
s = Son()
print(s.money)
to_python 影响传到视图函数里面的值
http://0.0.0.0:5000/mycenter/13812345678
http://0.0.0.0:5000/mycenter/123
1、HTTP协议
2、Django中间件
3、Flask 转化器
4、大家根据flask出题 出一道选择题
5、每个人提问
谈到任何联网的协议,我们就必须要谈到OSI(网络七层协议模型),必须遵循这个协议模型,我们的手机和电脑才可以联网通信,首先来看一下OSI
OSI
OSI是一个开放性的通信系统互连参考模型,他是一个定义得非常好的协议规范。OSI模型有7层结构,每层都可以有几个子层。
应用层
示例:TELNET,HTTP,FTP,NFS,SMTP等。
表示层
示例:加密,ASCII等。
会话层
示例:RPC,SQL等。
传输层
示例:TCP,UDP,SPX。
网络层
示例:IP,IPX等。
数据链路层
示例:ATM,FDDI等。
物理层
示例:Rj45,802.3等。
简单了解OSI之后我们来看一下我们手机与电脑通信,所能够使用的两种数据通信,一种是HTTP请求,一种是Socket通信,HTTP是属于短连接,适合新闻,订票信息等客户端发起请求,每一次请求结束,自动断开连接。而Socket是属于长连接,适合游戏,聊天等实时数据。
手机能够联网都是需要基于OSI协议模型,同时手机底层实现了TCP/IP协议。下面简单介绍一下TCP/IP协议
TCP/IP
建立起一个TCP连接需要经过“三次握手”:
第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握 手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连 接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”(过程就不细写 了,就是服务器和客户端交互,最终确定断开)
同时Socket可以支持不同的传输层协议(UDP),那我们平时为什么不使用UDP呢,我们现在来看一下UDP与TCP的区别
TCP UDP
是否连接 面向连接 面向非连接
传输可靠性 可靠 不可靠
应用场合 传输大量数据 少量数据
速度 慢 快
顺便在片尾纠正一下我对于这些协议的理解。
1.我一直以为Http和Tcp是两种不同的,但是地位对等的协议,虽然知道TCP是传输层,而http是应用层今天学习了下,知道了 http是要基于TCP连接基础上的,简单的说,TCP就是单纯建立连接,不涉及任何我们需要请求的实际数据,简单的传输。http是用来收发数据,即实际应用上来的。
2.TCP是底层通讯协议,定义的是数据传输和连接方式的规范
HTTP是应用层协议,定义的是传输数据的内容的规范
HTTP协议中的数据是利用TCP协议传输的,所以支持HTTP也就一定支持TCP
3.HTTP支持的是www服务
而TCP/IP是协议
它是Internet国际互联网络的基础。TCP/IP是网络中使用的基本的通信协议。
TCP/IP实际上是一组协议,它包括上百个各种功能的协议,如:远程登录、文件传输和电子邮件等,而TCP协议和IP协议是保证数据完整传输的两个基本的重要协议。通常说TCP/IP是Internet协议族,而不单单是TCP和IP。
python GIL 之所以会影响多线程等性能,是因为在多线程的情况下,只有当线程获得了一个全局锁的时候,那么该线程的代码才能运行,而全局锁只有一个,所以使用python多线程,在同一时刻也只有一个线程在运行,因此在即使在多核的情况下也只能发挥出单核的性能。既然python在同一时刻下只能运行一个线程的代码,那线程之间是如何调度的呢? 对于有io操作的线程,当一个线程在做io操作的时候,因为io操作不需要cpu,所以,这个时候,python会释放python全局锁,这样其他需要运行的线程就会使用该锁。 对于cpu密集型的线程,比如一个线程可能一直需要使用cpu做计算,那么python中会有一个执行指令的计数器,当一个线程执行了一定数量的指令时,该线程就会停止执行并让出当前的锁,这样其他的线程就可以执行代码了。 由上面可知,至少有两种情况python会做线程切换,一是一但有IO操作时,会有线程切换,二是当一个线程连续执行了一定数量的指令时,会出现线程切换。当然此处的线程切换不一定就一定会切换到其他线程执行,因为如果当前线程 优先级比较高的话,可能在让出锁以后,又继续获得锁,并优先执行。在做科学计算的时候是用的单线程,因为这种计算是需要CPU一直做计算的,如果用多线程反而会降低计算速度。
HTTP请求报文(请求行、请求头、请求体)
https://blog.csdn.net/heyue_99/article/details/74689057
关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型网站单日就可能会产生几十万甚至几百万的数据,没有索引查询会变的非常缓慢。还是以WordPress来说,其多个数据表都会对经常被查询的字段添加索引,比如wp_comments表中针对5个字段设计了BTREE索引。
并发和并行
知乎上 龚昱阳 Dozer的说明的很形象,在此借用:
https://www.zhihu.com/question/33515481
你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。
你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。
你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。
并发的关键是你有处理多个任务的能力,不一定要同时。
并行的关键是你有同时处理多个任务的能力。
所以我认为它们最关键的点就是:是否是『同时』。
Python 中没有真正的并行,只有并发
无论你的机器有多少个CPU, 同一时间只有一个Python解析器执行。这也和大部分解释型语言一致, 都不支持并行。这应该是python设计的先天缺陷。
javascript也是相同的道理, javascript早起的版本只支持单任务,后来通过worker来支持并发。
Python中的多线程
所谓进程,简单的说就是一段程序的动态执行过程,是系统进行资源分配和调度的一个基本单位。一个进程中又可以包含若干个独立的执行流,我们将这些执行流称为线程,线程是CPU调度和分配的基本单位。同一个进程的线程都有自己的专有寄存器,但内存等资源是共享的。
Redis 数据类型
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
请简述mysql数据库中事务四大特性?
原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行
一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序串行执行的结果相一致
隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的
持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障
请简述设计数据库提出的一些规范(范式)?
第一范式:列不可拆分
第二范式:唯一标识
第三范式:引用主键
每一个范式都是在前一个范式基础上建立的