django 回顾
一、HTTP协议
简述HTTP协议
-超文本传输协议,无状态的短连接,请求与响应只发一次就断开连接,请求响应后,再次发起请求时,不认识
- 格式:
- GET请求:输入地址回车:https://passport.jd.com/new/login.aspx?ReturnUrl=https%3A%2F%2Fwww.jd.com%2F
请求由两部分组成:请求头和请求体,请求头和请求体通过\r\n\r\n分割,请求头和请求头之间通过\r\n分割。
响应由两部分组成:响应头和响应体,
- POST请求:
请求由两部分组成:请求头和请求头
响应由两部分组成:响应头和响应体,
-GET与POST的区别 POST请求体有内容 GET无内容
-常见的请求头
-user-agent 设备信息
-host 访问设备的主机名
-referrer 防盗链
-你了解的请求方式有哪些?
-GET/POST/PUT/PATCH/DELETE/OPTIONS
-GET:向特定的资源发出请求。它本质就是发送一个请求来取得服务器上的某一资源。资源通过一组HTTP头和呈现数据
(如HTML文本,或者图片或者视频等)返回给客户端。GET请求中,永远不会包含呈现数据。
-POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会
导致新的资源的建立和/或已有资源的修改。 Loadrunner中对应POST请求函数:web_submit_data,web_submit_form
-OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性
-HEAD:向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。
-PUT:向指定资源位置上传其最新内容
-DELETE:请求服务器删除Request-URL所标识的资源
-TRACE:回显服务器收到的请求,主要用于测试或诊断
-CONNECT :HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
二、Django的生命周期
- 浏览器输入:http://www.oldboyedu.com 回车
- DNS解析,将域名解析成IP。
- 浏览器(socket客户端),根据IP和端口(80)创建连接,发送请求。
- 服务端接收请求
- 实现了wsgi协议的模块,如:wsgiref接收到用户请求。
- 然后将请求转交给django的中间件,执行中间件的process_request(process_view)。
- 路由系统进行路由匹配。
- 匹配成功执行视图函数,视图函数进行业务处理(ORM操作数据+模板渲染)
- 交给中间件的process_response方法
- wsigref的socket.send,将结果返回给浏览器。
- 断开socket连接。
- 浏览器断开连接。
三、什么是wsgi?
wsgi,web服务网关接口,他是一套协议。
实现wsgi协议有:
- wsgiref 单继承
- uwsgi
实现wsgi协议的所有的模块本质:socket服务端。
四、django中间件的作用?应用场景?
- 权限系统中的权限校验
- 解决跨域:编写一个中间件,在中间件中定义一个process_response,添加一个响应头(CORS,跨站资源共享)
- 用户登录
- csrf_token验证(django内置功能)
- 执行流程
正常流程:
- 所有process_request
- 所有process_view
- 所有process_response
非正常流程:
- django 1.10及以后:平级返回
- django 1.10以前:找到最后的process_response
- 执行流程是如何实现的?
将中间件的相关方法添加到对应的 5个列表中,以后循环执行(顺序、倒序)
五、路由系统
本质:保存url和函数的对应关系。
相关知识点:
示例1:
url(r'^index/', views.index),
def index(request):
return HttpResponse('...')
示例2:
url(r'^user/edit/(\d+)/$', views.user_edit),
def user_edit(request,nid):
return HttpResponse('...')
示例3:
url(r'^crm/', include('app01.urls'))
from django.conf.urls import url,include
from app01 import views
urlpatterns = [
url(r'^order/', views.order),
url(r'^center/', views.center),
]
def order(request):
return HttpResponse('...')
def center(request):
return HttpResponse('...')
示例4:根据name别名反向生成URL
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/', views.index,name='index'),
url(r'^user/edit/(\d+)/$', views.user_edit,name='user_edit'),
url(r'^crm/', include('app01.urls')),
]
urlpatterns = [
url(r'^order/', views.order,name='order'),
url(r'^center/', views.center,name='center'),
]
反向生成:
index_url = reverse('index')
user_edit_url = reverse('user_edit',args=('999',))
index_url = reverse('order')
index_url = reverse('center')
示例5:根据 namespace + name 别名反向生成URL
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/', views.index,name='index'),
url(r'^user/edit/(\d+)/$', views.user_edit,name='user_edit'),
url(r'^crm/', include('app01.urls',namespace='crm')),
]
urlpatterns = [
url(r'^order/', views.order,name='order'),
url(r'^center/', views.center,name='center'),
]
<h1>视图中反向生成:</h1>
index_url = reverse('index')
user_edit_url = reverse('user_edit',args=('999',))
index_url = reverse('crm:order')
index_url = reverse('crm:center')
在模板中反向生成:
{% url 'index' %}
{% url 'user_edit' 999 %}
{% url 'crm:order' %}
{% url 'crm:center' %}
六、什么是MVC、MTV?
MVC 全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写
MTV, Model Template View
七、
FBV和CBV
FBV,写函数进行处理业务逻辑。
CBV,写类进行处理业务逻辑。
本质上FBV和CBV都是一样的,因为url对应都是一个函数。
url(r'^order/', views.order,name='order'), #
1. 对应order函数;
2.一旦请求到来,立即执行order函数
url(r'^center/', views.CenterView.as_view(),name='center'), #
1. url对应 views.CenterView.as_view()会返回一个view函数;
2. 请求到来之后,立即执行view函数,view由会触发dispatch方法、dispatch会根据method不同根据反射执行get/post/delete...的方法。
推荐:
业务逻辑,FBV(简单)。
restful api,CBV。