Web相关
什么是WSGI?
全称是Web Server Gateway Interface,即web服务器网关接口,
是python定义的Web服务器和Web应用程序之间的一种通信规范
Django,Flask,Tornado的对比
Django: 大而全,内置ORM,Admin等组件,第三方插件较多
Flask: 微框架,比较灵活,但这也导致项目结构不统一
Tornado: 异步支持的微框架和异步网络库,第三方插件少,要自己造轮子
什么是MVC?
模型(Model): 负责业务对象和数据库的交互,在web框架中一般通过ORM实现
视图(View): 负责与用户的交互展示
控制器(Controller): 接收请求参数调用模型和视图,响应请求
什么是ORM?
Object Relational Mapping对象关系映射,用于实现类与数据表,类属性与数据表字段的映射关系
通过面向对象的方式操作数据表,代码量更少,提高了开发效率
在python中,常用的ORM框架有
- Django的ORM: 简单易用,但不好处理复杂的查询
- peewee: 类似于Django的ORM的轻量级实现,容易与任意web框架集成, 官方文档很清晰
- SQLAlchemy: 重量级API,可以写复杂查询,学习曲线长, 事务处理很玄学
SQL注入
概念: 通过构造特殊的输入参数传入后端,导致后端查询出数据库的全部记录,导致数据泄漏
实现原理:
sql = "select * from students where name='%s';" % "小明' or 1 or '"
print(sql) # select * from students where name='小明' or 1 or '';
如何防范:
- 不要直接拼接SQL,SQL语句用%s占位,通过cursor.execute()的第二个参数位传入参数
- 使用ORM可以大大降低sql注入的风险
- 数据库不要明文存储敏感信息
XSS攻击
概念: Cross Site Scipting跨站脚本攻击,攻击者通过某种手段在web页面插入一些恶意的js代码,当该页面加载时,这段js脚本就会执行,用 document.cookie 来读写 Cookie 数据,从而窃取到用户的cookie等信息,XSS攻击主要 分为 反射型 和 存储型 两种
实现原理:
-
反射型XSS攻击原理: 攻击者诱导用户点击包含了恶意js代码的url链接,网站服务端又将这个恶意脚本反射给浏览器执行
-
如恶意url链接:
192.168.3.67:9000/?name=<script>alert("hello")</script>
-
-
存储型XSS攻击原理: 攻击者将恶意代码上传到服务器,只要用户浏览包含此恶意代码的网站就会执行恶意代码
-
如submit表单时,提交的评论信息为下面这种,其它用户访问评论信息页就会弹框提示hi
<script>alert("hi")</script>
-
如何防范:
将不可信数据放入到html标签内(比如div、span等)的时候需要进行html编码,将 & < > " ’ / 转义为实体字符
CSRF攻击
概念: Cross Site Request Forgery跨站请求伪造,攻击者盗用用户身份发送恶意请求
实现原理: 用户在登录网站A后产生了cookie,又去访问了恶意网站B,网站B发出访问网站A的请求,于是浏览器带着网站A的cookie访问A,这样B就达到了模拟用户操作访问网站A的目的
如何防范:
服务端生成一个csrf_token,嵌入到网站A页面中,攻击者模拟向服务端发送post请求时,由于没有正确的csrf_token,服务器会拒绝该请求. 现在浏览器已经禁止发送跨域请求了
同源策略
一个URL由协议,域名,端口,路径组成,如果两个URL的协议,域名,端口都相同,就可以认为这两个URL是同源的
同源策略是浏览器的一个安全机制,不同源的js脚本在没有明确授权的情况下,不能读写其它网站的资源
CORS跨域请求
出于安全原因,浏览器限制跨域 HTTP 请求。为了安全的请求跨域资源,浏览器使用一种称为 CORS(跨域资源共享) 的机制。
前端发出跨域请求后,浏览器会自动向HTTP header添加一个额外的Origin字段,填入发起跨域请求的URL,
后端如果允许跨域请求,也要在响应头里添加Access-Control-Allow-Origin字段,填入允许发起跨域请求的URL
浏览器收到响应后,判断 发起跨域请求的URL 是否被允许,如果允许,前端才能接收到跨域资源
Django是如何防止CSRF攻击的?
添加CSRF中间件, 要求在发送post请求的时候必须要带上一个csrf_token, 而这个csrf_token是在第一次获取页面时嵌入到form中的
什么是前后端分离? 有哪些优点?
前端通过访问后端提供的接口对数据进行CRUD, 后端只返回前端所需的数据, 不再对html模板文件进行渲染
优点:
- 网页,app这些不同的前端可以共用接口,减少开发量
- 定义好接口规范后,前后端可以同步开发,各司其职
什么是RestfulAPI?
- 把HTTP请求方法与数据库的增删改查结合起来
- HTTP的GET查询资源,POST新增资源,PUT修改资源,DELETE删除资源,
- 请求路径中不能出现动词,使用名词的复数形式
- 使用JSON返回数据
序列化 和 反序列化
序列化:数据对象 转 json
反序列化:json 转 数据对象
read_only 和 write_only
read_only仅用于序列化输出, 不校验参数
write_only正好相反
View,APIView,GenericAPIView
- View:Django的视图类,所有视图的基类,传入的是HTTPRequest
- APIView:DRF中所有视图的基类,传入的是Request
- GenericAPIView:继承自APIView,增加了query_set,serializer_class等类属性和方法,通常搭配Mixin扩展类使用
- CreateAPIView:继承自 GenericAPIView、CreateModelMixin
- ListAPIView:继承自GenericAPIView、ListModelMixin
- RetrieveUpdateDestoryAPIView:继承自GenericAPIView、RetrieveModelMixin、UpdateModelMixin、DestoryModelMixin
Viewset,GenericViewset,ModelViewset
- Viewset:继承自APIView,可以把请求方法映射为自定义方法名
- GenericViewset:继承自GenericAPIView,增加了query_set…
- ModelViewset:继承自GenericAPIView和所有的Mixin扩展类
注册的流程
接收参数,用户名,密码,手机号,短信验证码, 正则表达式校验参数
调用User.objects.create_user()方法,调用login()实现状态保持
生成响应对象,设置cookie,返回响应
登录的流程
接收参数,用户名,密码,是否记住密码,正则表达式校验参数
调用authenticate()方法,调用login()实现状态保持
生成响应对象,设置cookie,返回响应
nginx, uWSGI, Django有什么关系
nginx和uWSGI都是web服务器, nginx处理静态资源, uWSGI处理动态资源
请求会先发到nginx, 发现是自己处理不了的动态资源就转发给uWSGI,
Django是web应用程序, 需要运行在uWSGI服务器上
Django的优缺点
- python实现, 代码简洁优雅
- 提供管理后台, 能够快速开发
- 复用度高, 设计上遵循DRY原则
- 内置的中间件和安全框架
- 单体应用, 不适合并行开发
- 不适合高并发的互联网项目
ERP odoo
ERP是企业资源计划, 企业内部的业务管理系统, 包含财务、物流、人力资源等核心模块
odoo是python开发的开源ERP系统
Celery的原理
基于生产者消费者模型, 生产者就是web应用程序, 负责把需要异步执行的任务放到消息队列中,
一般可以用Redis, RabbitMQ作为消息队列
消费者就是celery, 负责读取消息队列的内容来执行
ElasticSearch的原理
本质上是对海量数据进行分词, 并建立倒排索引, 这样就可以通过关键字搜出满足条件的所有记录
数据对象
read_only 和 write_only
read_only仅用于序列化输出, 不校验参数
write_only正好相反
View,APIView,GenericAPIView
- View:Django的视图类,所有视图的基类,传入的是HTTPRequest
- APIView:DRF中所有视图的基类,传入的是Request
- GenericAPIView:继承自APIView,增加了query_set,serializer_class等类属性和方法,通常搭配Mixin扩展类使用
- CreateAPIView:继承自 GenericAPIView、CreateModelMixin
- ListAPIView:继承自GenericAPIView、ListModelMixin
- RetrieveUpdateDestoryAPIView:继承自GenericAPIView、RetrieveModelMixin、UpdateModelMixin、DestoryModelMixin
Viewset,GenericViewset,ModelViewset
- Viewset:继承自APIView,可以把请求方法映射为自定义方法名
- GenericViewset:继承自GenericAPIView,增加了query_set…
- ModelViewset:继承自GenericAPIView和所有的Mixin扩展类