关于python的一些面试题!

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):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障

请简述设计数据库提出的一些规范(范式)?

第一范式:列不可拆分
第二范式:唯一标识
第三范式:引用主键
每一个范式都是在前一个范式基础上建立的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值