1、事务和锁html
select_for_update 注意必须用在事务里面mysql
select_for_update(nowait=False, skip_locked=False)jquery
entries = Entry.objects.select_for_update().filter(author=request.user) #加互斥锁,因为mysql在查询时自动加的是共享锁,因此咱们能够手动加上互斥锁。create、update、delete操做时,mysql自动加行级互斥锁 select * from t1 where id=1 for update; models.T1.objects.select_for_update().fitler(id=1)
全部匹配的行将被锁定,直到事务结束。这意味着能够经过锁防止数据被其它事务修改。ajax
第一种方式:全局的sql
这种方式是统一个http请求对应的全部sql都放在一个事务中执行(要么全部都成功,要么全部都失败),是全局性的配置数据库
在settings文件中: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mxshop', 'HOST': '127.0.0.1', 'PORT': '3306', 'USER': 'root', 'PASSWORD': '123', 'OPTIONS': { "init_command": "SET default_storage_engine='INNODB'", #'init_command': "SET sql_mode='STRICT_TRANS_TABLES'", #配置开启严格sql模式 } "ATOMIC_REQUESTS": True, #全局开启事务,绑定的是http请求响应整个过程 "AUTOCOMMIT":False, #全局取消自动提交,慎用 }, 'other':{ 'ENGINE': 'django.db.backends.mysql', ...... } #还能够配置其余数据库 }
第二种方式:局部的django
经过transaction中的atomic代码块实现浏览器
from django.db import transaction # 导入transaction 在视图函数中加: @transaction.non_atomic_requests def index(request): pass (orm...sql..语句) return xxx 上下文逻辑里面加: def index(request): .. with transaction.atomic(): # 设置事务的保存点 pass orm...sql.. ... return xxx
2、Ajax服务器
简介app
AJAX (Asynchronous Javascript And XML) ,翻译成中文是“异步的Javascript和XML” ,即便用Javascript语言与服务器进行异步交互,传输的数据为XML 。
AJAX 最大的优势是在不从新加载整个页面的状况下,能够与服务器交换数据并更新部分网页内容。(这一特色给用户的感觉是在不知不觉中完成请求和响应过程)
AJAX 不须要任何浏览器插件,但须要用户容许JavaScript在浏览器上执行
AJAX除了异步的特色外,还有一个就是:浏览器页面局部刷新;
首先不用ajax,完成一个登陆认证的界面
配置路由 urls
from app01 import views
urlpatterns = [
url(r'^login/', views.LoginView.as_view(),name='login'),
# 这是CBV开始时配置的路径
]
CBV的方式完成视图函数
from django.shortcuts import render,HttpResponse,redirect
from django.views import View
class LoginView(View): def get(self,request): return render(request,'login.html') def post(self,request): name = request.POST.get('username') pwd = request.POST.get('password') if name=='yangzm' and pwd=='123': return render(request,'index.html') else: return redirect('login')
完成两个html文件,login.html用来完成登陆功能;index.html文件完成登陆成功后显示的页面,若是用户名密码错误,重定向会login.html的页面
# login.html
结果和分析缺点
用户输入127.0.0.1:8000/login/时,显示登陆页面
登陆成功跳转index页面,登陆失败从新返回这个页面
分析缺点:当用户输入信息不正确的时候,由于作了重定向,点击提交后,页面刷新,跳转回了login页面,此时是又从新请求的页面,因此之前输入的数据将会被清空,这样对用户来讲,体验是极差的
改进的目标:用户输入错误时,要保留以前的信息,并提示用户输入错了,而后让用户在输入的内容上改,提升用户的体验,这时,就须要用到ajax来完成这个功能
基于ajax完成的登陆认证示例
ajax须要用到jquery的文件,因此先配置静态文件引入
# 配置settings:
STATICFILES_DIRS=[
os.path.join(BASE_DIR,'statics')
]
# 新建文件夹statics,放静态文件 jquery.js
此时login.html文件须要引入jquery文件,而后写js代码,实现ajax
{% load static %}
<body> <h1>欢迎来到登陆页面</h1> <form action="/login/" method="post"> {% csrf_token %} 用户名:<input type="text" id="username" name="username"> 密 码:<input type="password" id="password" name="password"> <input type="button" id="btn" value="提交"> <span style="color: red;font-size: 12px" id="error"></span> </form> <script src="{% static 'jquery.js' %}"></script> <script> $('#btn').click(function () { $.ajax({ url:'/login/', type:'post', data:{ uname:$('#username').val(), pwd:$('#password').val(), csrfmiddlewaretoken:$('[name=csrfmiddlewaretoken]').val() # 这是为了经过post提交的认证机制 }, success:function (res) { var resStr = JSON.parse(res); if(resStr['code'] === 3){ $('#error').text(resStr['redirect_url']) } else if(resStr['code'] === 0){ location.href=resStr['redirect_url']; } } }) }) </script> </body>
url须要从新配置一个登陆成功的index路径
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', views.LoginView.as_view(),name='login'),
url(r'^index/', views.index),
]
视图函数views
from django.shortcuts import render,HttpResponse,redirect
# Create your views here. from django.views import View class LoginView(View): def get(self,request): return render(request,'login.html') def post(self,request): name = request.POST.get('uname') pwd = request.POST.get('pwd') if name=='yangzm' and pwd=='123': ret = '{"code":0,"redirect_url":"/index/"}' return HttpResponse(ret) else: ret = '{"code":3,"redirect_url":"用户名密码错误!!!"}' return HttpResponse(ret) def index(request): return render(request,'index.html')
结果
外部文件导入的方式来写js代码,那么js代码中不能写django的模板语法,由于html文件的加载顺序:url--视图--html模板渲染 --- return给浏览器 -- 浏览器渲染 --- srcipt的src --才去请求js文件 --那么这个js文件的代码此时才加载到你的html文件中 -- 就没有模板渲染的步骤了 -- 就没有办法替换对应的模板语法.