``` Ajax 前端朝后端发送请求都有哪些方式 a标签href GET请求 浏览器输入url GET请求 form表单 GET/POST请求 Ajax GET/POST请求 前端朝后端发送数据的编码格式 contentType参数,用来表示前端朝后端发送数据的编码格式 urlencoded:name=jason&pwd=123 request.POST # urlencoded是form表单和ajax提交数据默认的编码方式 formdata:request.FILES appliction/json:request.body bytes格式 ajax特点: 1.异步提交 2.局部刷新 ajax与form表单的不同点: 1.form表单提交的数据格式只能是urlencoded和formdata,它不支持json格式数据 2.form表单提交数据,页面会刷新 3.ajax局部刷新,异步提交,并且支持发送json格式数据 ``` ``` 小需求:页面上渲染三个input前两个输入数字,点击计算按钮,第三个得出两者之和 前端代码: <input type='text' id='i1'/> + <input type='text' id='i2'/> = <input type='text' id='i3'/> <button id='b1'></button> # ajax初识 $('#b1').click(function () { $.ajax({ url:'', type:'POST', data:{i1:$('#i1').val(),i2:$('#i2').val()}, success:function (data) { $('#i3').val(data) } }) }) ajax提交数据必备的几个参数 1.往哪提交 ulr控制 2.提交方式 type控制 3.提交的数据 data 4.提交后端处理之后的结果 success:function(){} $.ajax({ // 前面的变量值都是固定写法,url,type,data url:'', // 提交的路径 type:'post', // 提交的方式 data:{'name':'jason'}, // 提交的数据 # 默认数据传输默认也是urlencoded编码格式 success:function (data) { // 回调函数,会将后端处理好的数据传给data形参 alert(data) } }) ajax提交json格式数据 1.需要告诉后端此次发送的数据为json格式 2.告诉后端数据时什么格式,你在传的时候,数据就应该对应是什么格式 $('#d1').click(function () { $.ajax({ // 前面的变量值都是固定写法,url,type,data url:'', // 提交的路径 type:'post', // 提交的方式 data:JSON.stringify({'name':'jason','age':'18'}), // 提交的数据 contentType:'application/json', // 告诉后端当前数据的格式为json格式 # 编码格式与数据类型必须一致,不能骗人! success:function (data) { // 回调函数,会将后端处理好的数据传给data形参 $('#i3').val(data) } }) }) ``` ``` request.POST只能解析 编码格式为urlencoded以及text/plain ``` ``` ajax传文件(固定写法!) 几个必须注意点: 1.必须用内置对象:new FormData 2.获取input框文件对象:$('#i1')[0].files[0] 3.指定两个参数为false: processData:false, // 不要处理我的数据 name=jason&password=123 contentType:false, // 不需要指定任何编码,就按照我的formdata内部的数据格式即可 4.后端按正常的文件上传从request.FILES里面获取文件对象 5.formdata也支持传普通的键值对,后端仍然可以在request.POST里面获取到 $("#btn").click(function () { //上传文件,必须用FormData,生产一个formdata对象 var formdata=new FormData(); formdata.append('name',$("#name").val()); # 也支持传键值对的数据 //取出文件$("#myfile")[0].files拿到的是文件列表,取第0个把具体的文件取出来 formdata.append('myfile',$("#myfile")[0].files[0]); $.ajax({ url:'/index/', type:'post', //不预处理数据,(name=lqz&age=18) processData:false, //指定往后台传数据的编码格式(urlencoded,formdata,json) //现在用formdata对象处理了,就不需要指定编码格式了,不要给我编码了 contentType:false, data:formdata, success:function (data) { alert(data) } }) 后端 def plus(request): if request.method == 'POST': print(request.FILES) file_obj = request.FILES.get('myfile') with open(file_obj.name,'wb') as f: for line in file_obj: f.write(line) return HttpResponse('ok') return render(request,'index.html') ``` ``` 批量插入数据 # 批量插入数据 l = [] for i in range(1000): l.append(models.Book(name='第%s本书'%i)) models.Book.objects.bulk_create(l) 分页器 页数通常都取奇数页,为的是符合中国人的审美标准(对称美) 自定义分页器使用 后端: # 固定用法 获取用户想访问的当前页 page = request.GET.get('page',1) # 实例化分页器对象 page_obj = Pagination(current_page=page,all_count=book_queryset.count()) # 对总数据对象进行切片 page_queryset = book_queryset[page_obj.start:page_obj.end] 前端: {{ page_obj.page_html|safe }} 不需要自己写,拷贝过去直接即可, 只需要你知道使用方法即可.内部逻辑感兴趣的可以去研究一下 ``` ``` django settings配置文件 由来:为什么我在用django配置的时候导入的不是我项目名下的那个settings 但是我配置了之后依然能够起作用,这是为什么? from django.conf import settings # 入口 settings = LazySettings() # 单例 from django.conf import global_settings class LazySettings(LazyObject): def _setup(self, name=None): settings_module = os.environ.get(ENVIRONMENT_VARIABLE) # 获取全局的键值对,在manage.py中启动时就已经设置了一个 self._wrapped = Settings(settings_module) class Settings(object): def __init__(self, settings_module): for setting in dir(global_settings): # 先获取系统默认配置里面的所有的变量名 if setting.isupper(): setattr(self, setting, getattr(global_settings, setting)) # 给settings对象设置键值对 self.SETTINGS_MODULE = settings_module mod = importlib.import_module(self.SETTINGS_MODULE) for setting in dir(mod): if setting.isupper(): setting_value = getattr(mod, setting) setattr(self, setting, setting_value) # 给settings对象设置键值对 ```