一 Ajax简介

AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML,现在更多使用json数据)。

  • 同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;
  • 异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求。

AJAX除了异步的特点外,还有一个就是:浏览器页面局部刷新;(这一特点给用户的感受是在不知不觉中完成请求和响应过程)

优点:

  1. AJAX使用Javascript技术向服务器发送异步请求
  2. AJAX无须刷新整个页面

二 AJAX的异步请求

设计路由

from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('add_book/',views.add_book),
path('query_book/',views.query_book),
#ajax相关
path('ajax_sleep/',views.ajax_sleep),
path('ajax_test/',views.ajax_test),
#前端页面
path('ajax_temp/',views.ajax_temp),
]

views视图文件

def ajax_sleep(request):
import time
time.sleep(3)
return HttpResponse("sleep 3 senond") def ajax_test(request):
return HttpResponse("test...") def ajax_temp(request):
return render(request,"ajax_temp.html")

html文件

root@darren-virtual-machine:~/PycharmProjects/orm_demo# vim templates/ajax_temp.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<button id="btn1">ajax_sleep</button>
<button id="btn2">ajax_test</button>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script> <script>
$("#btn1").click(function () {
$.ajax({
url:"/ajax_sleep/",
type:"GET",
success:function (data) {
console.log(data);
}
}
)
})
$("#btn2").click(function () {
$.ajax({
url:"/ajax_test/",
type:"GET",
success:function (data) {
console.log(data);
}
}
)
})
</script>>
</body>
</html>

访问http://127.0.0.1:8000/ajax_temp/,先点击ajax_sleep然后点击test,这时在sleep中间正在执sleep代码,但是在点击test,也会执行,先于sleep输出,说明是一个异步操作,同时点击test后,页面并不会刷新,是一个局部刷新的动作

三 实现ajax的一个计算案例

制作一个如下页面,当在前面输入两个数字,点击提交触发后,会把结果填在第三个框里

设计路由

from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('add_book/',views.add_book),
path('query_book/',views.query_book),
#ajax相关
path('ajax_sleep/',views.ajax_sleep),
path('ajax_test/',views.ajax_test),
#前端页面
path('ajax_temp/',views.ajax_temp),
#ajax求和
path('ajax_sum/',views.ajax_sum),
]

view视图

def ajax_sum(request):
if request.is_ajax():
num1 = request.POST.get("num1")
num2 = request.POST.get("num2")
total = int(num1) + int(num2)
return HttpResponse(total)

html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<button id="btn1">ajax_sleep</button>
<button id="btn2">ajax_test</button> <hr>
<div>
<input type="text" id="i1"> + <input type="text" id="i2"> =
<input type="text" id="i3"><button id="btn3">计算</button>
</div>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script> <script>
$("#btn1").click(function () {
$.ajax({
url:"/ajax_sleep/",
type:"GET",
success:function (data) {
console.log(data);
}
}
)
}) $("#btn2").click(function () {
$.ajax({
url:"/ajax_test/",
type:"GET",
success:function (data) {
console.log(data);
}
}
)
})
{# 计算案例 #}
$('#btn3').click(function () {
var num1 = $("#i1").val();
var num2 = $("#i2").val();
$.ajax({
url: "/ajax_sum/",
type: "POST",
data:{
num1:num1,
num2:num2,
},
success:function (data) {
$("#i3").val(data);
}
})
})
</script>
</body>
</html>

访问http://127.0.0.1:8000/ajax_temp/

403报错

是由于crfs影响,添加crfs

修改html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<button id="btn1">ajax_sleep</button>
<button id="btn2">ajax_test</button>
{% csrf_token %}
<hr>
<div>
<input type="text" id="i1"> + <input type="text" id="i2"> =
<input type="text" id="i3"><button id="btn3">计算</button> </div>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
<script>
{# 计算案例 #}
$('#btn3').click(function () {
var num1 = $("#i1").val();
var num2 = $("#i2").val();
$.ajax({
url: "/ajax_sum/",
type: "POST",
data:{
num1:num1,
num2:num2,
csrfmiddlewaretoken: $("[name=csrfmiddlewaretoken]").val(),
},
success:function (data) {
$("#i3").val(data);
}
})
})
</script>
</body>
</html>

再次访问,并输入计算值,点击计算

ajax请求流程

当输入非数字计算

调试信息

  File "/root/PycharmProjects/orm_demo/app01/views.py", line 131, in ajax_sum
total = int(num1) + int(num2)
ValueError: invalid literal for int() with base 10: 'qq'
[08/Apr/2020 03:48:19] "POST /ajax_sum/ HTTP/1.1" 500 14677

view视图文件

from django.shortcuts import render,HttpResponse
from app01 import models
from django.http import JsonResponse def ajax_sum(request):
if request.is_ajax():
num1 = request.POST.get("num1")
num2 = request.POST.get("num2")
ret = {"status":1,"msg":None}
try:
total = int(num1) + int(num2)
ret["msg"] = total
except Exception as e:
ret['status'] = 0
ret["msg"] = "请输入数字"
#需要使用到数据结构,使用json方式传过去,先要导入jsonhttponse
return JsonResponse(ret)

html调整

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<button id="btn1">ajax_sleep</button>
<button id="btn2">ajax_test</button>
{% csrf_token %}
<hr>
<div>
<input type="text" id="i1"> + <input type="text" id="i2"> =
<input type="text" id="i3"><button id="btn3">计算</button><span id="s1"></span> {#多加一个span标签#} </div>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
<script>
{# 计算案例 #}
$('#btn3').click(function () {
var num1 = $("#i1").val();
var num2 = $("#i2").val();
$.ajax({
url: "/ajax_sum/",
type: "POST",
data:{
num1:num1,
num2:num2,
csrfmiddlewaretoken: $("[name=csrfmiddlewaretoken]").val(),
},
        {#默认传输的值是1,就会把传过来的msg值输入,挡status值为0时,就会把自定义的提示显示,和view视图文件对应#}
success:function (data) {
if (data.status){
$("#i3").val(data.msg);
}else{
$("#s1").text(data.msg);
}
}
})
})
</script>
</body>
</html>

输入非数字时,会有提示

问题,当再次输入正确格式,提示不会小时,

使用定时器解决,显示2秒后消失

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<button id="btn1">ajax_sleep</button>
<button id="btn2">ajax_test</button>
{% csrf_token %}
<hr>
<div>
<input type="text" id="i1"> + <input type="text" id="i2"> =
<input type="text" id="i3"><button id="btn3">计算</button><span id="s1"></span> </div>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
<script>
{# 计算案例 #}
$('#btn3').click(function () {
var num1 = $("#i1").val();
var num2 = $("#i2").val();
$.ajax({
url: "/ajax_sum/",
type: "POST",
data:{
num1:num1,
num2:num2,
csrfmiddlewaretoken: $("[name=csrfmiddlewaretoken]").val(),
},
success:function (data) {
if (data.status){
$("#i3").val(data.msg);
}else{
$("#s1").text(data.msg);
setTimeout(function () {
$("#s1").text("");
},2000)
}
}
})
})
</script>
</body>
</html>

访问后,输入错误值,两秒后消失

四 基于Ajax上传json数据

url设计

from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('add_book/',views.add_book),
path('query_book/',views.query_book),
#ajax相关
path('ajax_sleep/',views.ajax_sleep),
path('ajax_test/',views.ajax_test),
#前端页面
path('ajax_temp/',views.ajax_temp),
#ajax求和
path('ajax_sum/',views.ajax_sum),
#ajax上传json数据
path('ajax_json/',views.ajax_json),
]

views视图文件

视图响应时,必须是HttpResponse 或者 HttpResponse,不能是render或者redict

def ajax_json(request):
import json
print(request.POST)
print(request.body)
data = json.loads(request.body.decode())
print(data)
return HttpResponse("Ok")

html文件

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<button id="btn1">ajax_sleep</button>
<button id="btn2">ajax_test</button>
<button id="btn4">上传json数据</button>
{% csrf_token %}
<hr>
<div>
<input type="text" id="i1"> + <input type="text" id="i2"> =
<input type="text" id="i3"><button id="btn3">计算</button><span id="s1"></span> </div>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
<script>
{# 异步案例 #}
$("#btn1").click(function () {
$.ajax({
url:"/ajax_sleep/",
type:"GET",
success:function (data) {
console.log(data);
}
}
)
}) $("#btn2").click(function () {
$.ajax({
url:"/ajax_test/",
type:"GET",
success:function (data) {
console.log(data);
}
}
)
})
{# 计算案例 #}
$('#btn3').click(function () {
var num1 = $("#i1").val();
var num2 = $("#i2").val();
$.ajax({
url: "/ajax_sum/",
type: "POST",
data:{
num1:num1,
num2:num2,
csrfmiddlewaretoken: $("[name=csrfmiddlewaretoken]").val(),
},
success:function (data) {
if (data.status){
$("#i3").val(data.msg);
}else{
$("#s1").text(data.msg);
setTimeout(function () {
$("#s1").text("");
},2000)
}
}
})
});
$("#btn4").click(function () {
$.ajax({
url:"/ajax_json/",
type: "POST",
contentType:"json",
headers: {"X-CSRFToken": $("[name='csrfmiddlewaretoken']").val()}, // 在请求头中添加csrf
data: JSON.stringify({
a:100,
b:200,
user:"darren",
}),
success:function (data) {
console.log(data)
}
})
})
</script>
</body>
</html>

访问点击提交json数据

得到结果

调试输出

<QueryDict: {}>
b'{"a":100,"b":200,"user":"darren"}'
{'a': 100, 'b': 200, 'user': 'darren'}

在使用视图文件时,当使用HttpResponse返回时,前端代码需要使用json的数据,必须需要使用JSON.parse(data){}反序列化才能使用

当使用JsonResponse(ret)返回时,可以直接使用,例如sum案例

五 基于form表单上传文件

下载一张图片到桌面备用,test111.png

url文件

from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('add_book/',views.add_book),
path('query_book/',views.query_book),
#ajax相关
path('ajax_sleep/',views.ajax_sleep),
path('ajax_test/',views.ajax_test),
#前端页面
path('ajax_temp/',views.ajax_temp),
#ajax求和
path('ajax_sum/',views.ajax_sum),
#ajax上传json数据
path('ajax_json/',views.ajax_json),
#form表单上传
path('upload/',views.upload),
]

views

import  os
def upload(request):
if request.method == "POST":
print(request.POST)
print(request.FILES)
#print(request.body) 报错
file_obj = request.FILES.get('file_name')
name = file_obj.name
with open(os.path.join("media", name), "wb") as f:
for i in file_obj:
f.write(i)
return HttpResponse('上传成功')

html写一个form表单

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<button id="btn1">ajax_sleep</button>
<button id="btn2">ajax_test</button>
<button id="btn4">上传json数据</button>
{% csrf_token %}
<hr>
<div>
<input type="text" id="i1"> + <input type="text" id="i2"> =
<input type="text" id="i3"><button id="btn3">计算</button><span id="s1"></span> </div>
<hr>
<h3>form表单上传文件</h3>
<form action="/upload/" method="POST" enctype="multipart/form-data">
{% csrf_token %}
<input type="text" name="user">
<input type="file" name="file_name">
<input type="submit">
</form>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
<script>
{# 异步案例 #}
$("#btn1").click(function () {
$.ajax({
url:"/ajax_sleep/",
type:"GET",
success:function (data) {
console.log(data);
}
}
)
}) $("#btn2").click(function () {
$.ajax({
url:"/ajax_test/",
type:"GET",
success:function (data) {
console.log(data);
}
}
)
})
{# 计算案例 #}
$('#btn3').click(function () {
var num1 = $("#i1").val();
var num2 = $("#i2").val();
$.ajax({
url: "/ajax_sum/",
type: "POST",
data:{
num1:num1,
num2:num2,
csrfmiddlewaretoken: $("[name=csrfmiddlewaretoken]").val(),
},
success:function (data) {
if (data.status){
$("#i3").val(data.msg);
}else{
$("#s1").text(data.msg);
setTimeout(function () {
$("#s1").text("");
},2000)
}
}
})
});
$("#btn4").click(function () {
$.ajax({
url:"/ajax_json/",
type: "POST",
contentType:"json",
headers: {"X-CSRFToken": $("[name='csrfmiddlewaretoken']").val()}, // 在请求头中添加csrf
data: JSON.stringify({
a:100,
b:200,
user:"darren",
}),
success:function (data) {
console.log(data)
}
})
})
</script>
</body>
</html>

root@darren-virtual-machine:~/PycharmProjects/orm_demo# mkdir media

访问,选择文件

点击submit,上传成功

调试输出

<QueryDict: {'csrfmiddlewaretoken': ['JA1GUiIv2LZCvSTxFjP8IOMaW7MNb3q3tjI5nOtFyXv6RETZxqq729rBOTFlFkE5'], 'user': ['']}>
<MultiValueDict: {'file_name': [<InMemoryUploadedFile: test111.jpeg (image/jpeg)>]}>

服务器查看

root@darren-virtual-machine:~/PycharmProjects/orm_demo# ll media/

六 基于Ajax请求上传文件

修改html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<button id="btn1">ajax_sleep</button>
<button id="btn2">ajax_test</button>
<button id="btn4">上传json数据</button>
{% csrf_token %}
<hr>
<div>
<input type="text" id="i1"> + <input type="text" id="i2"> =
<input type="text" id="i3"><button id="btn3">计算</button><span id="s1"></span> </div>
<hr>
<h3>form表单上传文件</h3>
{# <form action="/upload/" method="POST" enctype="multipart/form-data"> #}
{% csrf_token %}
<input type="text" id="user" name="user">
<input type="file" id="file1" name="file_name">
<button id="btn5">ajax上传文件</button>
{# <input type="submit"> #}
{# </form> #}
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
<script>
{# 异步案例 #}
$("#btn1").click(function () {
$.ajax({
url:"/ajax_sleep/",
type:"GET",
success:function (data) {
console.log(data);
}
}
)
}) $("#btn2").click(function () {
$.ajax({
url:"/ajax_test/",
type:"GET",
success:function (data) {
console.log(data);
}
}
)
})
{# 计算案例 #}
$('#btn3').click(function () {
var num1 = $("#i1").val();
var num2 = $("#i2").val();
$.ajax({
url: "/ajax_sum/",
type: "POST",
data:{
num1:num1,
num2:num2,
csrfmiddlewaretoken: $("[name=csrfmiddlewaretoken]").val(),
},
success:function (data) {
if (data.status){
$("#i3").val(data.msg);
}else{
$("#s1").text(data.msg);
setTimeout(function () {
$("#s1").text("");
},2000)
}
}
})
});
$("#btn4").click(function () {
$.ajax({
url:"/ajax_json/",
type: "POST",
contentType:"json",
headers: {"X-CSRFToken": $("[name='csrfmiddlewaretoken']").val()}, // 在请求头中添加csrf
data: JSON.stringify({
a:100,
b:200,
user:"darren",
}),
success:function (data) {
console.log(data)
}
})
})
</script>
</body>
</html>

调试

添加ajax

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<button id="btn1">ajax_sleep</button>
<button id="btn2">ajax_test</button>
<button id="btn4">上传json数据</button>
{% csrf_token %}
<hr>
<div>
<input type="text" id="i1"> + <input type="text" id="i2"> =
<input type="text" id="i3"><button id="btn3">计算</button><span id="s1"></span> </div>
<hr>
<h3>form表单上传文件</h3>
{# <form action="/upload/" method="POST" enctype="multipart/form-data"> #}
{% csrf_token %}
<input type="text" id="user" name="user">
<input type="file" id="file1" name="file_name">
<button id="btn5">ajax上传文件</button>
{# <input type="submit"> #}
{# </form> #}
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
<script>
{# 异步案例 #}
$("#btn1").click(function () {
$.ajax({
url:"/ajax_sleep/",
type:"GET",
success:function (data) {
console.log(data);
}
}
)
}) $("#btn2").click(function () {
$.ajax({
url:"/ajax_test/",
type:"GET",
success:function (data) {
console.log(data);
}
}
)
})
{# 计算案例 #}
$('#btn3').click(function () {
var num1 = $("#i1").val();
var num2 = $("#i2").val();
$.ajax({
url: "/ajax_sum/",
type: "POST",
data:{
num1:num1,
num2:num2,
csrfmiddlewaretoken: $("[name=csrfmiddlewaretoken]").val(),
},
success:function (data) {
if (data.status){
$("#i3").val(data.msg);
}else{
$("#s1").text(data.msg);
setTimeout(function () {
$("#s1").text("");
},2000)
}
}
})
});
$("#btn4").click(function () {
$.ajax({
url:"/ajax_json/",
type: "POST",
contentType:"json",
headers: {"X-CSRFToken": $("[name='csrfmiddlewaretoken']").val()}, // 在请求头中添加csrf
data: JSON.stringify({
a:100,
b:200,
user:"darren",
}),
success:function (data) {
console.log(data)
}
})
})
{# ajax上传文件 #}
$("#btn5").click(function () {
var formdata = new FormData();
formdata.append("csrfmiddlewaretoken", $("[name='csrfmiddlewaretoken']").val());
formdata.append("file_name",$("#file1")[0].files[0]);
$.ajax({
url: "/upload/",
type: "POST",
processData: false, // 告诉jQuery不要去处理发送的数据
contentType: false, // 告诉jQuery不要去设置Content-Type请求头
data: formdata,
success:function (data) {
console.log(data)
}
})
})
</script>
</body>
</html>

修改图片名为test222

点击ajax上传文件

检查服务器文件

root@darren-virtual-machine:~/PycharmProjects/orm_demo# ll media/

七 请求头ContentType

ContentType指的是请求体的编码类型,常见的类型共有3种:

  1. application/x-www-form-urlencoded应该是最常见的 POST 提交数据的方式了。浏览器的原生 <form> 表单,如果不设置 enctype 属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。
  2. multipart/form-data是另一个常见的 POST 数据提交的方式。我们使用表单上传文件时,必须让 <form> 表单的 enctype 等于 multipart/form-data。
  3. application/json:这个 Content-Type 作为响应头大家肯定不陌生。实际上,现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串。由于 JSON 规范的流行,除了低版本 IE 之外的各大浏览器都原生支持 JSON.stringify,服务端语言也都有处理 JSON 的函数,使用 JSON 不会遇上什么麻烦。

058.Python前端Django与Ajax的更多相关文章

  1. 052.Python前端Django框架路由层和视图层

    一.路由层(URLconf) 1.1 路由层简单配置 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Dj ...

  2. 055.Python前端Django模型ORM

    由于前面在centos实验的过程中,pymql一直有属性错误,很难排查出问题,重新做了一个ubuntu的桌面系统同时使用pycharm开发工具作为学习开发工具,具体原因是因为在项目命名出现问题,和自己 ...

  3. 063.Python前端Django分页器

    Django的分页器 1 前期准备 创建一个数据库,用于存放数据 mysql> create database pager default charset=utf8; mysql> use ...

  4. 061.Python前端Django组件用户认证组件

    一 auth认证组件 在使用pymysql,数据库迁移的时候.,默认生成有十张表如下 查看author_user表结构 mysql> desc auth_user; +------------- ...

  5. 059.Python前端Django组件cooki和session

    一 会话跟踪技术 1.1 什么是会话 会话是指一个终端用户(服务器)与交互系统(客户端)进行通讯的过程. 1.2 什么是会话跟踪 对同一个用户对服务器的连续的请求和接受响应的监视.(将用户与同一用户发 ...

  6. 057.Python前端Django模型ORM多表查询

    一 基于对象的查询 1.1 一对多查询 设计路由 from django.contrib import admin from django.urls import path from app01 im ...

  7. 056.Python前端Django模型ORM多表基本操作

    一 准备工作 1.1 新建一个项目 root@darren-virtual-machine:~# cd /root/PycharmProjects/ root@darren-virtual-machi ...

  8. 053.Python前端Django框架模板层

    模板层 一 模板语法之变量 在 Django 模板中遍历复杂数据结构的关键是句点字符, 语法: {{ var_name }} [root@node10 mysite]# cat app01/urls. ...

  9. python Django之Ajax

    python Django之Ajax AJAX,Asynchronous JavaScript and XML (异步的JavaScript和XML),一种创建交互式网页应用的网页开发技术方案. 异步 ...

随机推荐

  1. OO第二单元作业——魔鬼电梯

    简介 本单元作业分为三次 第一次作业:第一次作业要实现单部简单电梯,停靠所有楼层,无载客容量,性能分考量电梯运行时间. 第二次作业: 第二次作业实现多部电梯,电梯数量由初始化设定,每部电梯都停靠所有楼 ...

  2. 美团点评技术专家 帮你快速上手跨平台开发框架Flutter

    Flutter并没有开创新的概念,它背后的框架原理和底层设计思想,与原生Android/iOS开发并没有本质区别,甚至从React.Native中吸收了不少优秀的设计理念. Flutter是Googl ...

  3. 让你的Windows/Linux玩上Switch!

    1 前言 某天在Github上面看到了两个Switch的模拟器: yuzu Ryujinx 于是就想动手想尝试一下在Linux上面玩上Switch. 本文首先简单介绍一下两个模拟器,接着是两个模拟器的 ...

  4. (十七)VMware Harbor 垃圾清理

    1. 在线垃圾清理 注意:从Harbor中删除镜像时不释放空间,垃圾收集是通过从清单中不再引用文件系统中删除blob来释放空间的任务. 注意:在执行垃圾收集时,Harbor将进入只读模式,并且禁止对d ...

  5. 超详细网站博客域名和二级域名、子域名升级HTTPS免费申请SSL证书配置nginx指南

    随着互联网的飞速发展,我们的工作生活已经离不开互联网,HTTP虽然使用极为广泛, 但是存在不小的安全缺陷, 主要是其数据的明文传送和消息完整性检测的缺乏, 而这两点恰好是网络支付,网络交易等网站应用中 ...

  6. k8s kubernetes 集群 证书更新操作

    转载自https://www.cnblogs.com/kuku0223/p/12978716.html 1. 各个证书过期时间 /etc/kubernetes/pki/apiserver.crt #1 ...

  7. boltdb的实现和改进

    整个代码不是很复杂,可以从代码中理解如何实现. 特点:btree,很小巧,但实现了完整事务机制,稳定,即使丢电也不会导致数据库错误. 整个结构如下: meta page (前两页) --- > ...

  8. Python小游戏 -- 猜单词

    Python初学者小游戏:猜单词 游戏逻辑:就像我们曾经英语学习机上的小游戏一样,电脑会从事先预置的词库中抽取单词,然后给出单词的字母数量,给定猜解次数,然后让玩家进行猜测,并给出每次猜测的正确字母与 ...

  9. hdu 5020 求三点共线的组合数(容器记录斜率出现次数)

    题意:       给你n个点,问你3点共线的组合数有多少,就是有多少种组合是满足3点共线的. 思路:      一开始抱着试1试的态度,暴力了一个O(n^3),结果一如既往的超时了,然后又在刚刚超时 ...

  10. (Py练习)输出乘法口诀表

    #输出9*9乘法口诀表 for i in range(1,10): for j in range(1,i+1): print("%d*%d=%2d"%(i,j,i*j),end = ...