列举Http请求中常见的请求方式
HTTP请求的方法:
HTTP/1.1协议中共定义了八种方法(有时也叫“动作”),来表明Request-URL指定的资源不同的操作方式
注意:
1)方法名称是区分大小写的,当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Mothod Not Allowed);当服务器不认识或者不支持对应的请求方法时,应返回状态码501(Not Implemented)。
2)HTTP服务器至少应该实现GET和HEAD/POST方法,其他方法都是可选的,此外除上述方法,特定的HTTP服务器支持扩展自定义的方法。
方法 | 说明 |
---|---|
GET | 向特定的路径资源发出请求注意:GET方法不应当被用于产生“副作用”的操作中,例如在WebApplication中,其中一个原因是GET可能会被网络蜘蛛等随意访问。Loadrunner中对应get请求函数:web_link和web_url |
POST | 向指定路径资源提交数据进行处理请求(一般用于提交表单或者上传文件)数据被包含在请求体中,POST请求可能会导致新的资源的建立和/或已有资源的修改。Loadrunner中对应POST请求函数:web_submit_data,web_submit_form |
OPTIONS | 返回服务器针对特定资源所支持的HTTP请求方法允许客户端查看服务器的性能,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性 |
HEAD | 向服务器索与GET请求相一致的响应,只不过响应体将不会被返回这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。 |
PUT | 从客户端向服务器传送的数据取代指定的文档的内容 |
DELETE | 请求服务器删除指定的页面 |
TRACE | 回回显服务器收到的请求,主要用于测试或诊断 |
CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务 |
HTTP协议的特点
长连接
HTTP是一个属于应用层的面向对象的协议
HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。基于TCP/IP
双方建立通信的顺序,以及Web页面显示需要 处理的步骤,等等。像这样把与互联网相关联的协议集合起来总称为 TCP/IP。而http协议是基于TCP/IP协议之上的应用层协议。基于请求-响应模式
HTTP协议规定,请求从客户端发出,最后服务器端响应该请求并 返回无状态保存
HTTP是一种不保存状态,即无状态(stateless)协议。HTTP协议自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个级别,协议对于发送过的请求或响应都不做持久化处理。
使用HTTP协议,每当有新的请求发送时,就会有对应的新响应产生。协议本身并不保留之前一切的请求或响应报文的信息。这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把HTTP协议设计成 如此简单的。可是,随着Web的不断发展,因无状态而导致业务处理变得棘手 的情况增多了。比如,用户登录到一家购物网站,即使他跳转到该站的 其他页面后,也需要能继续保持登录状态。针对这个实例,网站为了能 够掌握是谁送出的请求,需要保存用户的状态。HTTP/1.1虽然是无状态协议,但为了实现期望的保持状态功能, 于是引入了Cookie技术。有了Cookie再用HTTP协议通信,就可以管 理状态了。
简述MVC模式和MVT模式
MTV
Django的MTV模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django的MTV分别是值:
- M 代表模型(Model): 负责业务对象和数据库的关系映射(ORM)。
- T 代表模板 (Template):负责如何把页面展示给用户(html)。
- V 代表视图(View): 负责业务逻辑,并在适当时候调用Model和Template。
除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的View处理,View再调用相应的Model和Template,MTV的响应模式如下所示:
一般是用户通过浏览器向我们的服务器发起一个请求(request),这个请求回去访问视图函数,(如果不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,然后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。
简述Django请求生命周期
用户通过浏览器向我们的服务器发起一个请求(request),这个请求回去访问视图函数,(如果不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,然后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。
1.wsgi,请求封装后交给web框架 (Flask、Django)
2.中间件,对请求进行校验或在请求对象中添加其他相关数据,例如:csrf、request.session -
3.路由匹配 根据浏览器发送的不同url去匹配不同的视图函数
4.视图函数,在视图函数中进行业务逻辑的处理,可能涉及到:orm、templates => 渲染 -
5.中间件,对响应的数据进行处理。
6.wsgi,将响应的内容发送给浏览器。
简述什么是FBV和CBV
FBV和CBV本质是一样的
基于函数的视图叫做FBV,基于类的视图叫做CBV
在python中使用CBV的优点:
1.提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)
2.可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性
什么是ORM
ORM是“对象-关系-映射”的简称。(Object/Relation Mapping)
MVC或者MVT框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动
rest_framework 认证组件的流程
认证组件 写一个类并注册到认证类(authentication_classes),在类的的authticate方法中编写认证逻辑
什么是中间件并简述其作用
中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件组件都负责做一些特定的功能。
中间件是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。
django 中间件生命周期
请求过来时,中间件拦截一部分请求;比如验证session, 没有登录的 请求一些页面,跳转至登录页;(图片为中间件的请求过程.)再到 urls ,分发请求到views 视图 ,通过 CBV(dispatch反射) 和 FBV 的 get 请求 讲 template 页面渲染返回给用户;渲染之前 可以从数据库拿出数据,放到render 的参数里面传递过去, locals() 表示 把所有参数传递还可以 实例化 其他 form 类,并渲染给前端
列举django orm中三种能写sql语句的方法
使用extra
例如:查询人民邮电出版社出版并且价格大于50元的书籍
Book.objects.filter(publisher__name='人民邮电出版社').extra(where=['price>50'])
使用raw
books=Book.objects.raw('select * from hello_book')
for book in books:
print book
自定义sql
from django.db import connection
cursor = connection.cursor()
cursor.execute("insert into hello_author(name) VALUES ('郭敬明')")
cursor.execute("update hello_author set name='韩寒' WHERE name='郭敬明'")
cursor.execute("delete from hello_author where name='韩寒'")
cursor.execute("select * from hello_author")
cursor.fetchone()
cursor.fetchall()
如何使用django orm批量创建数据
使用django.db.models.query.QuerySet.bulk_create()批量创建对象,减少SQL查询次数。
querysetlist=[]
for i in resultlist:
querysetlist.append(Account(name=i))
Account.objects.bulk_create(querysetlist)
命令migrate 和makemigrations的差别
生成迁移文件
执行迁移
视图函数中,接收的请求对象常用方法和属性有哪些
- path属性,获取请求页面的全路径,不包括域名
- method属性,获取请求中使用的HTTP方式的字符串表示。全大写表示
- GET属性,获取HTTP GET方式请求传参,的参数(字典类型)
- POST属性,获取HTTP POST方式请求传参,的参数(字典类型)
- FILES属性: 包含所有上传文件的类字典对象
FILES中的每一个Key都是<input type="file" name="" />标签中name属性的值,FILES中的每一个value同时也是一个标准的python字典对象,包含下面三个Keys: - SESSION属性:代表当前会话的字典对象
常用视图响应方式是什么?
返回HttpResponse
HttpResponse(content=响应体, content_type=响应体数据类型, status=状态码)
一般不用这种方式,我习惯使用:
response = HttpResponse(‘language python’)
response.status_code = 400
response[‘languaget’] = ‘Python’
return response
返回json数据
可以使用JsonResponse来构造响应对象,帮助我们将数据转换为json字符串
# 设置响应头Content-Type为 application/json
from django.http import JsonResponse
def demo_view(request):
return JsonResponse({‘city’: ‘beijing’, ‘subject’: ‘python’})
redirect重定向
可以将返回的结果重定向到另一个页面或接口,
from django.shortcuts import redirect
def demo_view(request):
return redirect(‘/index.html’)
HTTP响应常见状态码分类
路由匹配原则是什么?
如果第一条和第二条同时满足匹配规则,则优先匹配第一条。
如果第一条为正则模糊匹配,第二条为精确匹配,则优先匹配第一条
缓存系统类型有哪些
- 全站缓存
MIDDLEWARE_CLASSES = (
‘django.middleware.cache.UpdateCacheMiddleware’,
'django.middleware.common.CommonMiddleware',
‘django.middleware.cache.FetchFromCacheMiddleware’,
)
- 视图缓存
from django.views.decorators.cache import cache_page
import time
@cache_page(15) # 超时时间为15秒
def index(request):
t=time.time() #获取当前时间
return render(request,"index.html",locals())
- 模板缓存
{% load cache %}
<h3 style="color: green">不缓存:-----{{ t }}</h3>
{% cache 2 'name' %} # 存的key
<h3>缓存:-----:{{ t }}</h3>
什么是广义跨域
跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,包括:
1.) 资源跳转: A链接、重定向、表单提交
2.) 资源嵌入: link script img frame等dom标签,还有样式中background:url()、@font-face()等文件外链
3.) 脚本请求: js发起的ajax请求、dom和js对象的跨域操作等
- end -