1.django请求周期
每个人都必须给我画出来
web服务网关接口
WSGI协议
wsgiref(django自带的 可承受的并发量不是很高 通常指用于本地测试)
uwsgi (django项目上线之后会使用)
werkzeug (flask使用的)
实现WSGI协议的功能模块
ps:
请求来的时候处理http格式的数据
请求走的时候讲后端发送的数据打包成符合http格式的数据再发送
django中间件
django默认有七个中间件(Csrf...,Authticate...,Session...)
django支持用户自定义中间件
暴露给用户五个可以自定义的方法
1.process_request 请求来的时候
2.process_response 响应走的时候
3.process_view 路由匹配成功即将执行视图函数之前
4.process_template_response 视图函数中返回了render对象
5.process_exception 视图函数报错之后 报错信息会交给当前方法
如何自定义中间件
1.在某个应用下创建一个任意名称的py文件
2.写一个类继承MiddlewareMixin
3.在该类中书写上述五个可以自定义的方法
4.在settings配置文件将你写的中间件添加到Middleware配置项中
ps:格式应用名.py文件名.类名 (不会自动提示 书写的时候要格外注意)
CBV源码
1.类继承了View
2.路由自定义类名.as_view() 绑定给类的方法 书写完毕立刻执行
3.as_view()里面的定义了一个view闭包函数 并将view函数的内存地址返回出来 也就意味着CBV的路由本质还是FBV
4.一旦路由匹配上 执行闭包函数view 生成一个自定义类的对象 返回了对象.dispatch方法
5.注意在设计面向对象关系查找的时候 一定要牢记 当前的self到底是谁 在我们这里调用的就是View里面的disptch方法
6.首先判断当前请求方法在不在django提供默认的八个请求(get,post,put,delete,oprions...)内 如果不在直接报错
7.如果请求方式存在 利用反射拿到当前对象里面对应的属性或者方法
8.执行该方法(该方法返回上面 浏览器就能收到上面)
ps:django必会三板斧返回的都是HttpReponse对象
ContentType 前后端传输数据编码格式
1.urlencode
1.它是form表单和ajax默认提交数据的编码格式
数据格式:username=jason&password=123
2.不能传输文件
3.django只会将符合urlencoded格式的数据处理并放入request.POST中
2.formdata
1.它可以支持传文件(既可以传文件也支持普通的键值对上传)
1.在form表单中 通过修改form标签的enctype将默认的编码格式修改为formdata
3.application/json
1.传输的是json格式的数据
ps:
1.编码格式应该与数据类型一致 不能骗人家
2.浏览器查看编码格式 右键检查 点击network 查看requestheaders里面的contentType参数 原生的数据view source
Ajax两大特点
1.异步提交
2.局部刷新
同步异步:描述的是任务的提交方式
阻塞非阻塞:描述的是程序的运行状态
程序的运行状态
1.就绪态
2.运行态
3.阻塞态
Ajax传json格式数据
$.ajax({
url:'',
type:'post',
data:JSON.stringify({'username':'jason'}),
contentType:'application/json',
success:function(data){
...
}
})
Ajax传文件 需要利用内置对象FormData(既可以传文件也支持普通的键值对上传)
var formData = new FormData();
formData.append('username','jason');
# 获取文件标签内的文件数据
var fileObj = $('#myfile')[0].files[0];
formData.append('myfile',fileObj);
$.ajax({
url:'',
type:'post',
data:formData,
# 如果利用内置对象传数据
contentType:false,
processData:false,
success:function(data){
alert(data)
}
})
forms组件
1.渲染标签
2.校验数据
3.展示错误信息
使用
1.自定义一个继承forms.Form的类
from django import forms
class MyForm(forms.Form):
username = forms.Charfield(max_length=6)
2.传入字典即可校验数据
1.判断数据是否合法 is_valid()
2.查看校验通过的数据 cleaned_data
3.查看校验未通过并且未通过的原因 errors
3.渲染标签 forms组件只能帮你渲染获取用户输入的标签
1.{{ form_obj.as_p }}
2.{{ form_obj.username.label }}{{ form_obj.username }}
3.{% for foo in form_obj %}
<p>
{{ foo.label }}
{{ foo }}
<span>{{ foo.errors.0 }}</span>
</p>
{% endfor %}
钩子函数(二次校验)
局部钩子
def clean_字段名(self):
# 比如 用户名是否存在/合法
...
全局钩子
def clean(self):
# 比如密码与确认密码之间的校验
...
forms组件补充
1.可以写正则
2.widgets参数
TextInput
PassInput(attrs={'class':'form-control c1'})
3.其他字段(参考博客)