resultful风格:前后端分离,后端需要一种设计模式来规范约束。
每一个URL代表一种资源;客户端和服务器之间,传递这种资源的某种表现层;客户端用户四个HTTP动词,对服务器资源进行操作,实现“表现层状态转化”。
Web开发中的存在安全漏洞:csrf利用cookie进行跨域伪造攻击,SQL注入。
csrf是跨站请求伪造,攻击者伪造用户信息,像访问一个用户自己曾经认证的网站发送出去。譬如用户访问网站A留下了cookie,又访问网站B B网站携带攻击性代码访问。
防御CSRF攻击:主要有三个策略:验证Http Refer字段、有请求地址中添加token并验证、在HTTP头中自定义属性并验证;
验证HTTP Referer字段:譬如Refer字段,用户每次登陆都要先登陆一个域名,再通过才触发下一步事件。
在请求地址中添加token并验证:携带随机token,无法伪造。服务端加一个拦截器来验证这个token。
在HTTP头中自定义属性并验证:和http请求携带token的方法类似,但这种是放在请求头中。
Http如何保持安全传输:
重要数据加密:比如用户名和密码,我们需要加密。
非重要数据要签名:签名的目的是防止篡改。
登陆态怎么做:http是无状态,请求带上token,判断token是否过期;
装饰器:给函数一个装饰,用于扩充函数功能。譬如日志打印之类的功能,依赖于functools。
from functools import wraps
def decorator_name(f):
@wraps(f)
def decorated(*args, **kwargs):
if not can_run:
return "Function will not run"
return f(*args, **kwargs)
return decorated
@decorator_name
def func():
return ("Function is running")
can_run = True
print(func())
# Output: Function is running
can_run = False
print(func())
__new__、__call__特殊方法:
__new__:对象的初始化,是一个实例方法,第一个参数是self。
__call__:对象可call,注意不是类,是对象。模拟函数的行为,如果一个对象x提供了该方法,就可以像函数一样使用它。
*args, **kwargs是什么:
*args保存多余变量,保存方式为元组。
**kwargs保存带有变量名的多余变量,保存方式为字典。
Python内存管理:
Python使用了内存池来内存管理,其内存管理以金字塔的形式对内存功能进行划分,-1,-2层主要用于对操作系统进行操作,0层中是C的malloc,free等等内存分配和释放函数。1、2层是一个内存池,当对象小于265K时将直接由这片内存池进行分配内存,否则将调用第0层中的C函数来分配内存,当小于265K的对象被销毁时,其内存也不会被销毁,只是返回给了内存池以便二次利用。2层是对Python对象进行操作。
Python多进程:
Python中多线程由于有GIL的影响,导致在任意时间内只有一个线程在运行,所以Python的多线程在处理计算密集型任务上反而不如单线程,只有在处理IO密集型任务上多线程才能发挥实力,在等待IO过程中Python C源码会释放GIL,最终导致线程在等待IO过程中会暂停去执行其他的线程。python中GIL主要是由于历史原因导致Cpython虚拟机中的GIL难以移除,同时GIL的存在保证了多线程之间数据的完整性以及状态同步。
类方法、静态方法、实例方法:
实例方法:第一个参数是“self”,通过它可以使用实例的属性和方法,也可以使用类的属性和方法。调用:只能由实例对象调用。
类方法:使用装饰器@classmethod。第一个参数是“cls”,通过它可以使用类的属性和方法,但不能传实例的属性和方法。调用:类对象或实例对象都可以调用。
静态方法:使用装饰器@staticmethod。参数随意,没有“self”和“cls”参数,方法体中不能使用类或者实例的任何属性和方法。调用:类对象或实例对象都可以调用。
python上下文管理器是什么:
Python中上下文管理器使用with来调用主要用于数据库连接,文件操作,网络操作。
其作用是:如果在进行一些打开资源操作时出现异常,上下文管理器将自动的执行一些资源清理操作。在进入上下文管理器时,Python会优先调用对象的__enter__方法,该方法返回一个对象用于进行一些操作,如果在进行一些操作时发生了异常Python则__exit__该对象接受三个参数第一个参数异常类,第二个参数异常提示字符串,第三个参数traceback对象。
functools的wraps是做什么的:
wraps是一个装饰器功能是:由于被装饰的函数传入到装饰器中时已经不是原函数了,而是一个新的函数,并且丢失一些原函数的属性,为了不影响函数的使用,可以使用wraps来抵消这种副作用。
请说一说ORM实现原理:
ORM使用了Python的属性描述符协议实现,通过另外一个类来描述变量的属性类型,再给这个属性进行赋值时会调用__set__方法,访问属性则会调用__get__方法删除则调用__delete__方法。
迭代器和生成器的区别:
迭代器是这样的对象:实现了无参数的next方法,返回下一个元素,如果没有元素了,那么抛出StopIteration异常;并且实现iter方法,返回迭代器本身。
可迭代对象包含迭代器。
如果一个对象拥有__iter__方法,其是可迭代对象;如果一个对象拥有next方法,其是迭代器。
定义可迭代对象,必须实现__iter__方法;定义迭代器,必须实现__iter__和next方法。
生成器是一种使用普通函数语法定义的迭代器,包含yield语句的函数都称为生成器,每次yield生成一个值后,函数都将冻结,及再次停止执行;被重新唤醒后,函数将从停止的地方执行。
Python中列表和元组的异同:
相同:列表和元组都是容器并且是可迭代对象,二者可以包含任意类型的对象。
不同:列表是可变的,元组是不可变。
Python列表:
使用了分离技术实现的动态顺序表;索引查询的时间复杂度是O(1)。
Python字典的实现:
Python的字典使用了哈希表来储存key、value,当添加一个数据时会把key通过哈希函数转换成一个数字,然后将数字对存放value的数组长度取余并将取余结果当做数组下标,将value存放在该取余结果为下标,将value存放在该取余结果为下标的数组中。数据查询时将key转换为对应的数组下标,并定位到数组的位置获取value。
pickling和unpickling:
Pickle模块读入任何Python对象,将它们转换成字符串,然后使用dump函数将其存储到一个文件中——这个过程叫做pickling,反之从存储的字符串文件中提取Python对象的过程,叫做unpickling。
工具帮助debug或做静态分析:
PyChecker是一个静态分析工具,不仅能报告源代码错误,并且会报告错误类型和复杂度。
Pylint是检验模块是否达到代码标准的另一个工具。
dis用来查看Python对象的字节码。
Python的作用域:
在Python中,一个对象的作用域总是由代码被赋值的地方所决定的。当遇到一个变量时Python会按照:本地作用域->当前作用域被嵌入的本地作用域->全局/模块作用域->内置作用域顺序搜索。
Python的参数传递还是引用传递:
可变对象使用引用传递,不可变对象使用值传递。
写一个函数,输入一个字符串,返回倒叙排列的结果:
def reverse(text):
return text[::-1]
python中is和==区别:
is比较的是对象在内存的地址,==比较的是对象中的值。
Python的闭包:
内层函数引用了其外部作用域的变量,然后返回内层函数的情况,称为闭包,创建一个闭包必须满足以下几点:
1、必须有一个内嵌函数
2、内嵌函数必须引用外部函数中的变量,外层空间中被引用的变量叫做内层函数的环境变量
3、外部函数的返回值必须是内嵌函数
4、环境变量和内层非全局函数一起构成了闭包
Python的自省:
自我检查行为。dir(), type(), hasattr(), isinstance();通过这些函数,我们能够在程序运行时得知对象的类型,判断对象是否存在某个属性,访问对象的属性。