目录
ORM中的锁和事务
select查询语句上锁
在mysql中create,update,delete语句是默认要上锁的,select查询默认是不上锁的,如果要给select语句上个锁,需要在后面加for update
select * from app01_book for update;
在ORM中,如果想对一个查询上锁,需要使用select_for_update()
models.Book.objects.filter(price=100).select_for_update()
事务
1.装饰器形式添加事务
@transaction.atomic # 1.装饰器形式,所有的被装饰函数中的sql语句捆绑为事务 def xx(request): pass
装饰器形式添加事务:要注意的是!!只能为被装饰函数里面的sql语句捆绑事务,其他的语句是不可以的!!
2.给逻辑中的部分sql加事务
with语句里面的sql都捆绑为事务
# 方式2 给逻辑中的部分sql加事务 with transaction.atomic(): models.Book.objects.filter(price=100).select_for_update() # 等同于sql语句:select * from app01_book where price=100 for update
Ajax
1.Ajax简介
AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步的Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML,现在更多使用json数据)。
AJAX 不是新的编程语言,而是一种使用现有标准的新方法。
AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。(这一特点给用户的感受是在不知不觉中完成请求和响应过程)
AJAX 不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。
a.同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;
b.异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求。
AJAX除了异步的特点外,还有一个就是:浏览器页面局部刷新;(这一特点给用户的感受是在不知不觉中完成请求和响应过程)
2.Ajax的使用
设计一个登陆界面,用户输入用户名和密码
验证成功,跳转到首页界面
验证失败,不刷新网页,在右方提示红字用户名或密码输入错误
views.py
def login(request): if request.method == 'GET': return render(request, 'login.html') uname = request.POST.get('username') # 获取用户在页面输入的用户名 if uname == 'chao': # 验证用户名 return HttpResponse('ok') # 如果登录成功,返回一个响应字符串ok,用来在ajax做验证用 else: ret = HttpResponse('用户名或密码输入错误') return ret def index(request): return render(request, 'index.html')
login.html
{% load static %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {# <form action=""> #} 用户名: <input type="text" id="uname"> 密码: <input type="password" id="pwd"> <input type="button" value="确定" id="btn"> <span id="error_msg" style="color:red;font-size: 12px;"></span> {#</form>#} </body> <script src="{% static 'js/jquery.js' %}"></script> <script> $('#btn').click(function () { var uname = $('#uname').val(); // 获取用户输入的用户名 var pwd = $('#pwd').val(); // 获取用户输入的面膜 $.ajax({ url:'/login/', type:'post', data:{username:uname,password:pwd}, // 这里的username和password名称会作为request.POST.get的参数 success:function (res) { // ajax判断状态码是200的时候,走success分支 // res接收的是请求成功之后的响应结果,views中的HttpResponse // 可以对响应结果做一些事情 if (res === 'ok'){ location.href = '/index/'; // 跳转到index }else { $('#error_msg').text('用户名或者密码有误'); // 红字错误提示 } }, error:function (res) { // ajax判断状态码是4xx或者5xx的时候,走error分支 //res 请求失败之后获取到的响应结果 5xx,4xx console.log('>>>>>>',res); if (res.status === 403){ $('#error_msg').text(res.responseText); } } }) }) </script> </html>
当你输入的用户名不是chao的时候,网页不会刷新,并且会像如下这样显示
中间件:Middleware
什么是中间件?
1.中间件是介于request与response处理之间的一道处理过程。
2.如果你想修改请求,例如被传送到view中的HttpRequest对象。 或者你想修改view返回的HttpResponse对象,这些都可以通过中间件来实现。
3.可能你还想在view执行之前做一些操作,这种情况就可以用 middleware来实现。
4.说的直白一点中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,
5.中间件本质上就是一个自定义类,类中定义了几个方法,Django框架会在请求的特定的时间去执行这些方法。
django请求的生命周期
中间件可以定义的5个方法
中间件可以定义五个方法,分别是:(主要的是process_request和process_response)
-
process_request(self,request)
-
process_view(self, request, view_func, view_args, view_kwargs)
-
process_template_response(self,request,response)
-
process_exception(self, request, exception)
-
process_response(self, request, response)
以上方法的返回值可以是None或一个HttpResponse对象
1.如果是None,则继续按照django定义的规则向后继续执行。
2.如果是HttpResponse对象,则直接将该对象返回给用户。
当用户发起请求的时候会依次经过所有的的中间件
1.这个时候的请求是process_request
2.最后到达views的函数中,views函数处理后,
3.在依次穿过中间件,这个时候是process_response,最后返回给请求者。
自定义中间件的流程
1.在应用下先创建一个文件夹,名字随便起。比如叫mymiddleware
2.在mymiddleware文件夹下创建一个py文件。比如叫mid.py
3.在mid.py写上如下内容
from django.utils.deprecation import MiddlewareMixin class Auth(MiddlewareMixin): # 类名随意,继承MiddlewareMixin # 如果想对请求做一些统一处理,那么就定义process_request方法 def process_request(self,request): print('请求来啦!!!快看!!!!') def process_response(self,request,response): # response 视图响应回来的响应对象 print('请求走啦!!!慢走!!!!') return response # 注意!一定要些return response
4.在setting.py文件中做如下配置
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'app01.mymiddlewares.xx.Auth', #将中间件类的路径写到这里 ] ''' 注意:要把自定义中间件写在最后一行,因为中间件的执行顺序是由上到下执行的 如果第一个中间件执行不通,后面的中间件根本就没有办法执行 '''
关于中间件的方法的执行顺序
1.process_request和process_response
顺序:请求1→请求2→响应2→响应1
2.process_request和process_response + process_view
顺序:请求1→请求2→url路由→视图1→视图2→视图函数→响应2→响应1
如果在中间件1中的process_view写了return HttpResponse方法后,执行过程是这样的
3.process_request和process_response + process_view + process_exception
1.如果视图函数时正确的,执行流程如下所示
2.如果视图函数错误,执行流程如图所示
3.如果视图函数出错,并且在MD1中的process_exception方法直接返回了一个响应对象,执行流程如下所示
......