""" # ajax在浏览器看不到,在检查里面能看到。由于ajax是在一种请求方式,直接通过流程作用于后端,前端界面不渲染看不到数据显示,但是仍然是前端的一种操作,所以只能在检查源码里面发现相关的错误。 # ajax需要集成到<script> 里面,允许相互嵌套,实现异步中套异步,即异步的依赖。 $.ajax({ 'url':请求地址, 'type':请求方式, 'dataType':预期返回数据的格式,一般是json, 'data': 返回给后端的数据是一个json/dict, 后端直接通过关键字获取这个json里面的keys。 'async':false }).success(function(data)){alert()# 显示小框} # 这里的data是从后太HttpResponse里面拿到的data,但是形式可能不太一样。 # sunccess是执行成功后调用的回调函数,后台数据处理返回数据return JsonResponse(字典,会自动转成json),ajax需要json。 为什么要使用? 1:局部刷新,不需要全部刷新界面 2:不需要全部加载数据,查错路径在 (右键->检查->Network) ajaax的异步性体现在哪里?体现在界面加载的时候,不等ajax执行回调函数,界面代码在回调函数后面继续执行,这就是异步的。只有当ajax后端执行完毕时,前端ajax的回调函数才执行,这就是异步性。async默认等于false,表示是异步的。如果设置为true, 此时就是同步的ajax,就是顺序执行界面,在服务器返回数据,ajax执行回调函数之前界面后面的代码不会继续往下走,这就是同步。 """ """ 如果我们直接使用ajax登陆的话,我们就可能不使用form表单,使用form表单的话action依据view路径会自动提交表单里面的数据,现在我们如果不使用,我们就需要在ajax里面获取界面元素进行绑定,如绑定name和password。方法就是submit这个button的id的前端监听函数 $(function(){ $('#button_id').click({ #获取用户名和密码 username = $('#username').val() password = $('#password').val() #发起ajax请求 $.ajax({ 'url': 'type':'post' 'dataType':'json', 'data':{'usernamre':username,'password':password} # 这个请求的数据格式非常重要。 }).success(function(data_){ # 利用返回的数据做判断,判断是否登陆发成功 if data.key_ == 。。。以此进行判断 # 执行相应的操作 }) }) }) # 所以一定要确定携带的参数是什么,自己提交data。不像表单本身向后端发送数据。 # 还要注意一点:form/ajax请求不要再后端view重定向或者返回渲染的界面,因为即使处理完毕将这个界面返回前端也不会显示出来,只会显示当前界面(非常重要),一般只能返回JSON数据再界面显示。如果返回了页面,那么前端是显示不了的,本身执行没错,但是为什么返回不了呢?就是因为ajax一切执行我们看不到,后端执行返回了,但是查看元素返回也看到了,就是前端页面没变化,这段给出了解释。所以如果想再ajax里面跳转界面,我们可以再前端ajax前端的代码添加:location.href='/index',(/后面就是要跳转的界面),这才实现了真正的前端的显示跳转方式。 # 那么一般的form表单里面数据获取也是通过action后面的位置通过url映射的。演示先加载界面,form表单获取数据时单独映射处理,所以不影响。本质上和ajax原理是一样的。 # ajax一个界面可以嵌套多个实现事件点击的异步操作。js的界面元素也是有点击事件的。需要再ajax里面绑定,直接在$里面绑定就可以了。详细可以操看这个的视频的最后两个就是整个前端中间后端的间的应用。是相对完整的。这就整个开发操作就全部看完了。 """
bs架构界面要想生成,必须要由后端经过render渲染界面(传参),render(request, '模块/页面’)。就是说在Django里面界面一定时通过视图进行映射的,核心就是views。所以凡是指向页面的链接本质上都指向了这个view的视图,需要配置每一个应用和每一个应用里面的视图的url。前端界面的获取是通过在视图里面重定向获取的(和java一致)。后端获取是需要在视图里面处理model操作数据库的。 redirect直接指向了另一个界面的视图,就是界面重定向。 render就是返回界面渲染,这是不一样的,redirect是锁定哪个视图,而render是锁定之后再视图最后渲染出这个视图。 上述这两个都没有传递数据给界面。传递数据给界面不管是form表单还是ajax都是嵌套再h5里面,但是都是单独向后台传参数,传递都有定位到后端的url,这个url对应后端的一个view单独处理数据后返回给前端界面。传递数据是HttpResponse/JsonResponse这两个传递数据,所有form、ajax里面的链接的处理和本身django网页链接的处理是一致的,都需要定义后端视图进行处理。- render本质上就是加载模板、返回一个HttpResnponse重定向到达界面。所以要知道render不是HttpResponse对象,但是他里面实现返回了这个对象,是一种包含关系。
- 前端返回request对象传递给视图时,request里面包含一些属性:
path:去掉域名,(如果时get方式请求)去掉问号之后的参数剩下的东西,本质上就是映射到view的ur的两个配置项(应用、应用里面的视图)。 method: POST/GET , GET方式请求的化如果在前端定义就会在浏览器显示,和直接在浏览器输入显示本质是一致的,都是get请求方式。而POST直接在请求头里面包起来了,不会显示在浏览器。当然前者由于在浏览器里面一般会有长度限制、后者没有。同时前者显示在浏览器里面、不安全。Dhango获取数据get请求的两种方式,一种是后台url正则匹配分组解析,一种是正常GET获取。 META:获取请求的前端请求的ip地址。 两个非常重要的参数:COOKIES、session。- 对COOKIES:
看图一:知道基本原理和流程。 首先明白一点:用户一输入浏览器地址回车,这个时候就请求了后端生成一个HttpRequest对象了,将那些request的属性信息就传过来了,传过来你就可以基于这些属性就行处理判断,至于返回前端界面是视图渲染返回的,就是本质上这个流程一定要知道。 1:http协议是无状态的,下一次去访问一个页面并不知道该用户之前是否访问过。如果我们能在后台把该用户的账号密码不仅保存起来,而且可以返回用户浏览器COOKIE端保存这个信息,用户下次登陆的时候后台就可以查看这个信息是否在请求属性cookie里面,如果在就将这个信息填到界面上一起返回给前端,这就解决了记住账号密码这个过程。所以本质上就是利用cookie信息就行处理。 2:设置cookie:需要后台返回一个HttpRespose类对象或者子类的对象,这个类里面有一个方法set_cookie(name:str, value, expires=设置过期时间),就可以将cookie设置完毕,之后返回前端会自动保存在浏览器端。在后台通过这个函数设置一个cookie信息,返回这个HttpResponse类对象,通过这个方法设置cookie信息。为什么通过这个可以设置当前的cookie?那是因为返回这个Respose对象里面有一个响应头被返回, 这个头里面就包含了一些我们想返回给界面的值。那么前端接收到这个值保存在哪里?保存在浏览器本地的一些地方:如这里面返回的cookie信息就会保存在request.COOKIES这个字典里面。 3:有人说那么如果每一个网站都有一个cookie在本地,用户下次请求的时候,发送给服务器端的cookie不会混淆吗?答案是不会,因为cookie是基于域名安全的。意思是你访问百度的cookie和访问土豆网的cookie互不影响,因为他们是不同域名。之间不会混淆,所以它们是基于域名安全的。 3:HttpRespose的子有:本身和HttpResponse/JsonRespone。 4:获取cookie信息就是从value = request.COOKIES[name:str],,浏览器发给服务器的cookie保存在这里。 5:后端通过函数set_cookie保存的cookie信息返回前端时存放在本地COOKIES这个字典里面,包含后端所有的我们定义的cookie键值对。 6:如果不设置过期时间,浏览器关闭之后cookie信息就没了,只有由设置了过期时间,request这个头里面才会有cookie信息。 7:所以cookie就是服务器生成交给本地浏览器保存的信息,具体的保存信息不是用户名密码,想保存啥保存啥,是看应用场景了。 9:后台判断如果需要记住用户名,那就设置cookie信息,返回这个HttpResponse对象进而返回,前端就会自动保存到哪个字典里面。 10:登陆界面的设定下次登陆不需要再次显示,一种引用场景,记住登陆名字以及密码。 if ‘username' in request.COOKIES: username = request.COOKIES('username'): # 这个request里面的COOKIES是这个人的浏览器里面的COOKIES信息,和其他人无关。 else : # 就是第一次登陆 username = '' 11:注意COOKIES是在浏览器端的,也就是在本地浏览器里面。 所以可以在本地浏览器将他清楚掉。- session:
看图二:知道执行原理和流程。 session是保存在服务器端的记忆方式,而cookies是保存在浏览器端。session依赖于cookie,是因为唯一标识码保存在cookie里面被返回。 session也有过期时间,默认两周。注意这个时间是设置cookie里面sessionid的过期时间,一定要注意这个点。 也是以键值对存储,即往字典request.session里面添加键值对。后台需要手动添加你要保存的值到request.session[key]=value,添加到哪里了?添加到默认服务器session表里面了。那么生成的sessionid是否需要我们set_cookie?答案是不用我们管。这个时候每一行就生成一个唯一的id,系统会自动保存在cookie里面通过HttpResponse进行返回。我们调用显示的时候,直接request.session[key]获取即可,会自动调用cookie里面的id进行选择对服务器session表进行选择。- 基于session的另外一种应用是:
记住用户的登陆状态:这里面一定要注意需要设定用户登陆状态这个标志位:request.session[key]=value,保存这个,判断用户是否登陆。可以放在中间件对于全部的界面进行执行。用户退出状态的化就设置这个标志位false即可。相当于利用前端信息cookie、利用session一值存在,利用装饰器或者中间件完成整体规划。 if request.session.has_key('') == value: # 会自动依据用户cookie里面的sessionid锁定这个表的行。锁定后在执行if后面的查找语句判定, # 跳转到首页 else : # 执行登陆代码
- 知道前端发送一个链接整个后端接受再到后端返回给前端的一个过程:包含Django给我们预留的一些中间件函数。
- 这就是整个的过程:
具体的执行过程就是这个图4:详细的过程是前端发送请求(那个链接),这个时候服务器接收到请求之后,会自动生成一个Httprequest对象request,马上服务器会先执行中间件process_request函数,执行完毕后进行url匹配。当url匹配到之后,马上就要调用视图,在即将调用之前执行process_view中间件,之后调用view。调用view时候默认将这段话开始位置request对象传入视图view执行。在视图return HttpResponse之后返回前端界面前执行中间件process_response,之后返回前端界面(浏览器)。这就是整个会话的执行过程。- 把里面的中间件去掉就是我们Django的使用流程,中间件我们知道它执行的时间点后,就可以对中间件处理。
- 那么什么是中间件?为什么要有中间件?
request.META[REMOTE_ADDR'] 获取浏览器端的ip地址。对于不想让一些ip访问的我们可以禁止。有了这个就可以禁止一些IP地址访问网站。return HttpResponse('<h1>禁止')但是这样只能禁止一个界面。 但是要想禁止全部的界面:就是写一个装饰器装饰全部的界面视图,这样就全部禁止了,非常方便的装饰器。但是这样还是比较麻烦,因为每一个视图函数都要加装饰器,还是比较麻烦。 这就是中间件的概念。就是在调用每一个视图函数执行前系统都会自动执行的一个函数,叫做中间件。表现形式是函数,叫中间件函数。但是使用时必须要用一个类进行封装,在settings里面对这个类进行注册。换句话说这个中间件函数名字是固定的几个,系统写好了,只要实现了这几个,系统就自己调用了。定义之后,包装为类,这个类需要注册,在setting里面,一定要注册,注册了之后才会调用。 中间件是jango预留给你的一些东西。即一个请求过来是一个流程,流程如上,那么中间件允许你在这个流程里面做一些处理,这个处理系统会自己加入流程中,这个就是不自己写一些东西的原因。 django有四种中间键,process_mingzi. 在Django里面涉及到很多注册,包括中间件的注册、url注册等等,具体忘记了如何注册再看视屏。 这几个中间件函数可以放在一个类里面,这个要注意。这个类需要定义__init__,只执行一回,第一回前端访问执行,后面再访问就不执行初始化函数了。因该是系统自己生成一个中间件类的对象。 那么注册了之后系统如何寻找呢?要知道系统检索注册的时候是在注册表里面一个个类按顺序进行检索,检索每一个注册类里面是否有中间件函数,检索到就执行。 中间件提出的最大目的:所以基于上述中间件的过程我们就可以在某一处中断这个执行操作。加入直接在process_request里面直接返回一个HttpResponse一个对象,这个时候直接调用process_response,中间的过程就不执行了。当然几个函数可以随意的干预以达到你想要的效果。这是中间件函数的根本作用。 最后还有一个中间件函数processd_exception在视图函数发生异常是调用。传入的参数有执行的时间和目的可想而知是:self, request, exception。
""" 模板: 1:本身是需要HttpResponse 返回这个类的一个对象。render(request, '渲染模板的文件', 待传入的数数据:dict): 这个函数就是返回这个类的对象。但是本身并不是这个类对象。上面这个函数目的就是带数据渲染一个界面。 2:jgango默认开启了csrf中间件,再setting里面。如果有提交post数据时 避免的方式就是提交时添加{ %csrf_token%}的标签。 3:csrf作用机理:叫:跨站请求的伪造。 登陆正常网站后浏览器保存了正常网站的sessionid,而且你没有退出。之后可以更改密码。不小心此时访问了另外一个网站,并且这个网站被你点击,这个界面背后action是后面上述网站更改密码的界面。本质上能成功攻击的原因就是正常的身份登陆后,本地保存了一些信息(session),非法网站利用这个信息对原网站请求成功。相当于绕过你这个登陆信息进行请求。 4:加了那个之后,服务器将前端界面渲染的时候会生成基于这个生成一个id的input,同时在cookie也保存这个值,这样的话前端界面在此访问的时候会将这两个信息同时提交后台,只有这两个值一致的时候,才能通过访问。这样的话再次攻击的时候,攻击界面就没有这个input的id,因为他是其他人构造的,不是后端渲染得到的id,这样的传输的时候攻击界面不具有id,而cookie里面由设个id,这就是的访问失败,避免了csrf的攻击。 5:引入一些静态文件也需要注册,模板信息本身也需要注册,这些注册一定要注意。 """ 超级管理员: 一定要注意本地化、时间化。才能获取本地的时间。Django实现了自定义后台管理页面等等一些操作。