1.简述django对http请求的执行流程
在接收一个http请求之前,启动uWsgi服务器的WSGI协议监听端口等待来自外界的http请求。
比如Django自带的开发者服务器或者uWSGI服务器
Django服务器根据WSGI协议指定相应的handler来处理http请求。
这个时候服务器已处于监听状态可以接受外界的http请求。
Django服务器根据WSGI协议从http请求中获取参数组成字典并且传输到handler中处理,
在handler中对已经符合wsgi规范标准的httpRequest请求进行分析,
比如直接加载django提供的中间件,路由分配,视图函数分析,
最后返回一个可以被浏览器解析的符合HTTP协议的HTTPResponse
2.Django中session会话的运行机制是什么
自django中可以将session在settings.py中进行注册或者生成中间件用于启动。
设置存储模式*数据库缓存混合存储*和配置数据库缓存用于存储,生成django表单用于读写。
3.什么是csrf,描述攻击原理在django中如何解决?
cross-site request forgery是跨站请求伪造。
1.cookie中储存信息未过期 2.B网站向A网站请求数据 修改密码泄露信息
访问A信任网站 —————————————— 访问B恶意网站 —————————————— C恶意网站 ————————————
3.A网站会发送信息给B网站 4.导致来自C网站的恶意代码攻击 导致信息财产安全遭受威胁
在post请求时是安全的 form表单或者文件传输和ajax里面添加csrf_token,
csrf服务器端开启CSRF中间件进行验证
解决原理就是在页面添加csrf之后经过url的请求响应之后自动生成cookie信息,
返回给浏览器,同时在前端代码里面会有csrf_token值,然后你post提交数据时,
django会自动验证cookie里和前端传过来的csrf是否一致。
如果一致就说明当前浏览器的请求并且处理逻辑业务返回响应。
打开浏览器通过url路由进行访问是get请求,生成cookie*token*值,
返回给浏览器,如果说是提交表单的post请求,进行ajax传输时,会将浏览器的cookie信息token值发送给服务器进行token比对。
这个过程就是进行了两次请求 get / post请求,这样快速理解csrf_token的不同网站的比对情况
4.Django的CSRF跨站请求伪造的实现机制
1.django在第一次响应来自客户端的请求时,服务器会随机产生一个token保存在session中,
服务器将token传递给cookie并且送交给前端服务器
2.客户端再次从服务器进行请求的时候,把token值加入到请求数据或者头信息中,一起传送给服务器
3.服务器检验前端请求传过来的数据token和session中的token是否一致
5.什么是跨域请求?有哪些方式?
csrf cross-site request forgery指的是一个域下的脚本文档请求另外一个域下的脚本文件资源
方式如下*
资源跳转*link a 表单提交 重定向
资源嵌入*link script img frame dom 等的标签,
样式中background ----- * url() @font-face()文件外链
脚本请求 js发起的ajax请求,dom和js对象的跨域请求操作
6.跨域请求django是如何处理的?
使用第三方工具 django-cross-headers
注册app
添加中间件
配置运行跨域请求方法
7.什么是信号量
Django包含一个信号调度程序,它有助于在框架中的其他位置发生操作时通知分离的应用程序。
简而言之信号允许一些发送者通知一组接收器已经接收到信号
8.web框架的本质是什么?
web框架是socket服务端,用户的浏览器是socket客户端
9.RESTful规范的理解
restful是一种软件架构设计风格,提供了设计原则和约束条件,主要适用于客户端服务器的交互
restful的设计规范和原则
1.restful是提倡面向资源的编程,在url资源分发器中尽量使用名词,
使用https协议,网络接口比较安全
2.根据url的不同方法进行post/get请求来进行不同资源操作 post表单操作文件传输和ajax
3.在url中添加版本号,在url中可以体现是否是api接口,添加条件去筛选匹配
4.响应式添加设置状态码 status code
5.restful是有返回值是json格式,可以返回错误信息
6.返回结果中提供帮助链接,api接口最好做到Hypermedia
10.Django中如何加载初始化数据
django在创建对象创建数据后,save保存数据之后,ORM对象关系映射将数据写入到数据库中,
实现对数据的初始化,保存数据实现对数据库的调用操作对象,查询数据库数据,
将查询集返回给视图函数,通过模板语言将数据展示在前端页面
11.Django的缓存机制类型有哪些
1.全站缓存
2.视图缓存 用户视图函数或者视图类中
3.模板缓存 缓存不会经常变换的模板页面
12.Django的内建缓存机制
django根据设置的缓存方式,浏览器第一次请求时cache会缓存单个变量或者整个网页等的内容到硬盘或者内存中,
顺便携带者header请求头,当浏览器再次发送请求时,附带f-Modified-Since请求时间到Django,
django取参数之后,将缓存数据时间进行比较如果说缓存时间较新的话,则会重新请求数据缓存起来交给响应客户端,
如果缓存cache没有过期则直接从缓存中提取数据,返回给response客户端
二 *** 1.什么是WSGI web site gateway interface 网关接口 么是ASGI异步网关协议接口
ASGI异步网关协议接口 * 介于网络协议服务和python之间的标准接口,能够处理多种通用的协议类型包括HTTP/HTTPS/WebSocket
WSGI 网关协议接口 是基于HTTPS服务的协议模式,不支持WebSocket 而ASGI的诞生是为了解决python常用的WSGI不支持当前WEB开发中一些新的协议标准
同时,ASGI对于WSGI原有的模式的支持和WebSocket的扩展,
ASGI是WSGi的扩展。
2.Django如何实现websocket?
django实现websocket使用channels。 http请求是基于tcp请求的三次握手四次挥手 进行客户端服务器之间的连接和断开连接
channels使用https升级到了websocket 是一次链接就可以使用客户端浏览器的保证实时通信,我们完全可以使用channels来实现即时通信。
它使用的是异步跨域请求接口asgi ,通过改造django框架,是django既支持http协议也会支持websocket协议
3.列举django的核心组件
MTV模式
Models 数据库ORM对象关系映射 创建模型的对象关系映射
Templates 模板页面 对设计者友好的模板语言
Views 视图函数
缓存cache 将客户端请求过来的变量或者页面保存到硬盘或者内存中
如果说没有过缓存期,就直接使用缓存的数据。
如果说已经过期,则会重新请求数据,缓存起来然后返回给response客户端
url路由分发器
管理者界面
4.django本身就已经提供了runserver,为什么不能用来部署
1.runserver是直接运行django项目的并且进行调试,它使用django自带的wsgi server运行的,
在测试和开发中使用,并且runserver的启动方式也是单进程。
2.uWsgi是Web框架的服务器,并且带有wsgi / uwsgi / http协议
uwsgi是通信协议,uWsgi是实现wsgi / http / uwsgi的服务器,
uWsgi有超快的性能,低内存占用,多app管理等的优点,
搭配Nginx服务器就是一个生产环境,将用户请求和app完全隔离开,实现真正意义上的部署。
相比来讲支持的并发量更高,方便管理多进程,发挥多核的优势,提升性能
5.ajax请求的csrf的解决方案
1.在前端表单里面添加{%csrf_token%}
2.在发起ajax post请求时,组值json参数,将浏览器cookie中的值赋予加入json中,
键名为csrfmiddlewaretoken
6.路由优先匹配规则
1.如果说在路由中有第一条和第二条同时满足需求,那么优先匹配第一条
2.如第一条为模糊匹配,第二条为精确匹配,则优先选择第一条
7.urlpattern中的name和namespace的区别是
urlpattern是路由分发通过路由实现页面的展示和模板函数的实现
name是路由的别名
namespace是为了防止多个应用apps之间的路由urls重复使用
8.Django中总项目的urls.py中的include含义是
一个django项目中有多个apps应用,每个应用中又有不同的url请求urls.py
所以从根路由发出,将app所属的url请求,全部转发到相应的urls.py模块中
9.django2.x里面的path和django1.x里面的url的区别是
path和url是不同的两个模块,但是同样的效果都是返回响应数据页面
path是导入python的第三方模块,正则表达式需要使用另外一个函数re_path
url是支持路由的正则表达式
10.Django重定向的几种方法,状态码
页面跳转 redirect
url转换 HttpResponse
Reverse
状态码*302 303 status code
三 *** 1. 模型层 makemigrations migrate的区别
make migrations 生成迁移文件
migrate 执行迁移文件
2.Django models模型类继承的方式
1.用父类model来保存在子类模板中的重复数据信息,父类models是不单独生成
也不会单独使用的数据表格,这种情况下使用抽象基类继承 Abstract base classes 父类继承
2.从现有的model继承并让每个model都有自己的数据表,使用多重表格继承 也就是说自定义继承
3.只是在models中python级别的行为,而不涉及字段的改变。
代理model proxy适合这种场合
3.class Meta 元信息字段有哪些
1.Model类可以通过元信息类设置索引和排序信息
2.元信息是定义在model模板中的一个Meta子类
自定义表格名称 db_table
联合索引 index_together
联合唯一索引 unique_together
admin管理员平台显示的表名称 verbose_name/verbose_name_plural
排序字段ordering
抽象基类 abstract
4.Django中模型类的数据关系结构 数据表数据库
一对一 OneToOneField
一对多 OneToManyField ForeignKey
多对多 ManyToManyField
外键的用法 , 什么时候适合使用外键,外键一定需要索引吗
1.程序很难保证数据的完整性,如果说服务器宕机或者程序出现异常,这个时候的外键引用就可以保证数据的完整性和一致性
2.性能要求不高,安全要求高则使用外键,保证安全的前提下
性能要求高,安全性能不高则不适用外键,因为会延迟查询速度
3.外键索引能够加快关联表查询的速度
Primary Key 和 Unique Key的区别
主键和唯一键都是唯一性约束
主键是自增的 一张表格中只能有一个主键字段
唯一键是可以设置多个字段的唯一字段
主键必须不能为空 唯一键可以为空
5.DateTime的auto_now 和 auto_now_add的区别
auto_now 记录更新时间 如果说是true,那就会强制自动更新为现在的更新时间,
也就是每次更新修改数据库的时候,会直接强制更新数据库时间
auto_now_add 记录创建时间 设置为true的时候,会设置为第一次创建表格的时间以后修改的时候不会进行更改