目录

1.ORM中的锁和事务

2.Ajax

3.中间件:Middleware

  3.1 什么是中间件?

  3.2 django请求的生命周期

  3.3 中间件可以定义的5个方法

  3.4 自定义中间件的流程

  3.5 关于中间件的方法的执行顺序

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方法直接返回了一个响应对象,执行流程如下所示

......

day54:django:锁和事务&Ajax&中间件Middleware的更多相关文章

  1. Django 补充models操作,中间件, 缓存,信号,分页

    1.Model 一对多 补充 models如下: class UserType(models.Model): caption = models.CharField(max_length=16) cla ...

  2. {Django基础六之ORM中的锁和事务}一 锁 二 事务

    Django基础六之ORM中的锁和事务 本节目录 一 锁 二 事务 一 锁 行级锁 select_for_update(nowait=False, skip_locked=False) #注意必须用在 ...

  3. day 71 Django基础六之ORM中的锁和事务

    Django基础六之ORM中的锁和事务   本节目录 一 锁 二 事务 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 锁 行级锁 select_for_update(no ...

  4. day 58 Django基础六之ORM中的锁和事务

      Django基础六之ORM中的锁和事务   本节目录 一 锁 二 事务 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 锁 行级锁 select_for_update( ...

  5. Django中的事务与ajax

    一 事务与锁 1.行级锁 行级锁是由存储引擎实现的.如mysql里默认指定的InnoDB存储引擎,由它实现行级锁.InnoDB的行级锁定同样分为两种类型,共享锁(X)和排他锁(S). 对于UPDATE ...

  6. Django 源码小剖: 初探中间件(middleware)

    因为考虑到文章的长度, 所以 BaseHandler 的展开被推迟了. 在 BaseHandler 中隐藏着中间件的信息, 较常见的 SessionMiddleware 就已经默认安装.  BaseH ...

  7. django中间件Middleware

    熟悉web开发的同学对hook钩子肯定不陌生,通过钩子可以方便的实现一些触发和回调,并且做一些过滤和拦截. django中的中间件(middleware)就是类似钩子的一种存在.下面我们来介绍一下,并 ...

  8. 利用Django中间件middleware解决用户未登录问题(转)

    add by zhj: Django的中间件一般用于处理通用性的问题,分为五种,按处理顺序为request_middleware,view_middleware,exception_middlewar ...

  9. Django的锁和事务

    Django的锁和事务 锁 select_for_update(nowait=False, skip_locked=False) 返回一个锁住行直到事务结束的查询集,如果数据库支持,它将生成一个 SE ...

随机推荐

  1. Arrays中toString 和 binarySearch 的原代码

    只是记住方法是干什么的,但是对具体方法的理解还是不够 查找方法 当所查找的不存在的时候 返回值应该是 return -(low + 1);   一直知道toString 是转换成为字符串  但是具体的 ...

  2. MySQL标识列(自增长列)

    #标识列/*又称为自增长列含义:可以不用手动的插入值,系统提供默认的序列值 特点:1.标识列必须和主键搭配吗?不一定,但要求是一个key2.一个表可以有几个标识列?至多一个!3.标识列的类型只能是数值 ...

  3. goalng包和命令工具

    1. 包简介 任何包系统设计的目的都是为了简化大型程序的设计和维护工作,通过将一组相关的特性放进一个独立的单元以便于理解和更新,在每个单元更新的同时保持和程序中其它单元的相对独立性.这种模块化的特性允 ...

  4. oracle进行一对多关联查询的时候,获取副表(也就是多条记录的那张表)的最新一条记录进行关联,如何获取多条记录最新一条呢?

    例如以下场景: 一条新闻对应多条审核记录,用户想知道这条新闻走到哪一步审核了. 使用:select * from (select b.*,(ROW_NUMBER() OVER (PARTITION B ...

  5. 4GL之Non-SCROLLING CURSOR

    在4gl中CURSOR可以说是每一个程序中都会有的,而CURSOR又分为三种SCROLLING CURSOR.Non-SCROLLING CURSOR.LOCKING CURSOR. Non-SCRO ...

  6. Gradle Wrapper

    Gradle Wrapper 当把本地一个项目放入到远程版本库的时候,如果这个项目是以gradle构建的,那么其他人从远程仓库拉取代码之后如果本地没有安装过gradle会无法编译运行,如果对gradl ...

  7. WPF实现飞控姿态仪表盘控件Attitude dashboard

    一.概要 近期项目当中需要用到飞机控制仪表盘的姿态仪,一开始去各大网站搜索解决方案要么就是winfrom要么就是很老的代码根本不能运行更甚者是居然有的还要下载积分. 只能自己手动从0开始写一个控件.这 ...

  8. 数据库系统第一章【绪论】(B站视频)

    目录 数据库系统第一章[绪论](B站视频) 一.绪论 数据库的四大基本概念 数据 数据库 数据库管理系统 主要功能 数据库系统 数据管理 我的理解 数据系统的特点 数据结构化 数据系统的共享性 数据独 ...

  9. ASP.NET Uploadify 上传文件过大 报错(http error)借鉴,以防忘记

    Uploadify上传文件原来很早之前用过,没发现什么问题.今天再使用过程中,当文件大于30M的时候就会报错404.查看错误消息提示配置最大上传太小了.需要修改. 记得原来配置上传文件大小在这里:&l ...

  10. Poi Excel 设置列宽计算公式

    int width = 40;sheet.setColumnWidth(0,252*width+323); 作者:彼岸舞 时间:2020\07\27 内容关于:工作中用到的小技术 本文来源于网络,只做 ...