058.Python前端Django与Ajax
一 Ajax简介
AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML,现在更多使用json数据)。
- 同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;
- 异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求。
AJAX除了异步的特点外,还有一个就是:浏览器页面局部刷新;(这一特点给用户的感受是在不知不觉中完成请求和响应过程)
优点:
- AJAX使用Javascript技术向服务器发送异步请求
- 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种:
- application/x-www-form-urlencoded应该是最常见的 POST 提交数据的方式了。浏览器的原生 <form> 表单,如果不设置
enctype
属性,那么最终就会以 application/x-www-form-urlencoded 方式提交数据。 - multipart/form-data是另一个常见的 POST 数据提交的方式。我们使用表单上传文件时,必须让 <form> 表单的
enctype
等于 multipart/form-data。 - application/json:这个 Content-Type 作为响应头大家肯定不陌生。实际上,现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串。由于 JSON 规范的流行,除了低版本 IE 之外的各大浏览器都原生支持 JSON.stringify,服务端语言也都有处理 JSON 的函数,使用 JSON 不会遇上什么麻烦。
058.Python前端Django与Ajax的更多相关文章
- 052.Python前端Django框架路由层和视图层
一.路由层(URLconf) 1.1 路由层简单配置 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Dj ...
- 055.Python前端Django模型ORM
由于前面在centos实验的过程中,pymql一直有属性错误,很难排查出问题,重新做了一个ubuntu的桌面系统同时使用pycharm开发工具作为学习开发工具,具体原因是因为在项目命名出现问题,和自己 ...
- 063.Python前端Django分页器
Django的分页器 1 前期准备 创建一个数据库,用于存放数据 mysql> create database pager default charset=utf8; mysql> use ...
- 061.Python前端Django组件用户认证组件
一 auth认证组件 在使用pymysql,数据库迁移的时候.,默认生成有十张表如下 查看author_user表结构 mysql> desc auth_user; +------------- ...
- 059.Python前端Django组件cooki和session
一 会话跟踪技术 1.1 什么是会话 会话是指一个终端用户(服务器)与交互系统(客户端)进行通讯的过程. 1.2 什么是会话跟踪 对同一个用户对服务器的连续的请求和接受响应的监视.(将用户与同一用户发 ...
- 057.Python前端Django模型ORM多表查询
一 基于对象的查询 1.1 一对多查询 设计路由 from django.contrib import admin from django.urls import path from app01 im ...
- 056.Python前端Django模型ORM多表基本操作
一 准备工作 1.1 新建一个项目 root@darren-virtual-machine:~# cd /root/PycharmProjects/ root@darren-virtual-machi ...
- 053.Python前端Django框架模板层
模板层 一 模板语法之变量 在 Django 模板中遍历复杂数据结构的关键是句点字符, 语法: {{ var_name }} [root@node10 mysite]# cat app01/urls. ...
- python Django之Ajax
python Django之Ajax AJAX,Asynchronous JavaScript and XML (异步的JavaScript和XML),一种创建交互式网页应用的网页开发技术方案. 异步 ...
随机推荐
- 重磅:谷歌强势回归! google大会报名
google退出中国已经很久了,有关google回归的消息也流传了很久,今天,我们迎来了回归的开幕式. 1.中国区开发者网站 不需要梯子,赶紧取感受下吧: https://developers.goo ...
- Java中的绑定
1 前言 做了一次笔试题,发现了一题问答题,是关于Java绑定的: 当时做的时候是完全不会的... 于是这里补上一篇Java绑定的文章. 2 绑定 首先来了解一下绑定的概念.绑定是指一个方法的调用与方 ...
- 2.7w字!Java基础面试题/知识点总结!(2021 最新版)
这篇<Java 基础知识总结>是 JavaGuide 上阅读量最高的一篇文章,由于我对其进行了重构完善并且修复了很多小问题,所以,在博客园再同步一下! 文章内容比较多,目录如下: 基础概念 ...
- 小程序picker地区级联选择的问题及解决方案
各种系统中行政区域选择的场景不少,我们也有不少这样的场景.本想使用第三方的组件,但是大多有些小问题,不能满足需要.后面使用picker的mulitSelector模式写了一个,发现这种列模式的体验并好 ...
- 动态扩展磁盘(LVM)
使用gtp格式磁盘为lvm类型 [root@elk-log-srv01 ~]# parted /dev/vdd GNU Parted 3.1 Using /dev/vdd Welcome to GNU ...
- 三个dom xss常用tips
分享dom xss的三个案例 (1)javascript里面过滤单引号和双引号? 搭建环境: 只是过滤了单引号和双引号是可以xss的: 使用<>闭合script即可 </script ...
- 1079 Total Sales of Supply Chain
A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyone invo ...
- 17- web测试面试题
- 【转】【linux系统】nacos + confd配置nginx
为什么要支持confd,老的应用配置管理模式是启动时读取配置文件,然后重新读取配置文件需要应用重启.一般的配置管理系统都是代码侵入性的,应用接入配置管理系统都需要使用对应的SDK来查询和监听数据的变更 ...
- [转]gitlab ci/cd 发布
转自 https://meigit.readthedocs.io/en/latest/configure_gitlab_i18n_and_create_gitlab_ci_with_gitlab_ru ...