Python [6] IT资产管理(下)

简介:

上一篇博客聊到以下内容

1、安装django

2、部署工程和应用

3、修改、添加工程和应用配置文件并能成功url访问

4、Python脚本采集主机信息

5、通过post方式传送搜集的信息到服务器端

6、主机分组

如需更详细的了解,请参考http://467754239.blog.51cto.com/4878013/1616551


在这篇博客中,我们针对上篇博客中的重点部分做阐述,如何多钟方式实现第5步:

5、通过post方式传送搜集的信息到服务器端


一、Python序列化

1、序列化是什么

序列化:内存里面有一个数据结构,你希望将它保存下来,重用,或者发送给其他人。你会怎么做?嗯, 这取决于你想要怎么保存,怎么重用,发送给谁。很多游戏允许你在退出的时候保存进度,然后你再次启动的时候回到上次退出的地方。(实际上, 很多非游戏程序也会这么干。) 在这个情况下, 一个捕获了当前进度的数据结构需要在你退出的时候保存到磁盘上,接着在你重新启动的时候从磁盘上加载进来。这个数据只会被创建它的程序使用,不会发送到网 络上,也不会被其它程序读取。因此,互操作的问题被限制在保证新版本的程序能够读取以前版本的程序创建的数据。


2、实现序列化的方法

pickle(python语言编写)、cPickle(c语言编写)

JSON

Shelve

YAML


3、pickle和JSON的基本使用

pickle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
(1)pickle将字典序列化存储到文本文件中
[root@localhost  test ] # pwd
/tmp/test
[root@localhost  test ] # ls
1_pickle_dump.py  2_pickle_load.py
[root@localhost  test ] # python 1_pickle_dump.py 
[root@localhost  test ] # ls
1_pickle_dump.py  2_pickle_load.py  dump.txt     #存储到磁盘的文件中
[root@localhost  test ] # cat dump.txt 
(dp0
S 'age'
p1
S '25'
p2
sS 'tel'
p3
S '132600*****'
p4
sS 'name'
p5
S 'ZhengYanSheng'
p6
s.
[root@localhost  test ] # cat 1_pickle_dump.py 
#!/usr/bin/env python
 
import  pickle
 
d = { 'name' : 'ZhengYanSheng' , 'age' : '25' , 'tel' : '132600*****' }
with  open ( '/tmp/test/dump.txt' , 'w' ) as fd:
     pickle.dump(d,fd)
     
(2)pickle加载文本文件中的内容并生成一个新的字典
[root@localhost  test ] # pwd
/tmp/test
[root@localhost  test ] # ls
1_pickle_dump.py  2_pickle_load.py  dump.txt
[root@localhost  test ] # python 2_pickle_load.py 
{ 'age' '25' 'tel' '132600*****' 'name' 'ZhengYanSheng' }     #生成一个新的字典
[root@localhost  test ] # cat 2_pickle_load.py 
#!/usr/bin/env python
 
import  pickle
 
with  open ( '/tmp/test/dump.txt' , 'r' ) as fd:
     d1 = pickle.load(fd)
print d1

json

这次我们直接在Ipython的交互式中进行操作json的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
(1)json的导出
[root@localhost ~] # ipython
Python 2.6.6 (r266:84292, Feb 22 2013, 00:00:18) 
Type  "copyright" "credits"  or  "license"  for  more  information.
 
IPython 1.2.1 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about  'object' , use  'object??'  for  extra details.
 
In [1]:  import  json
 
In [2]: d = { 'a' : 'a' , 'b' :235, 'c' :( 'c1' , 'c2' ), 'd' : 'True' , 'e' : 'None' }
 
In [3]: d
Out[3]: { 'a' 'a' 'b' : 235,  'c' : ( 'c1' 'c2' ),  'd' 'True' 'e' 'None' }
 
In [4]: with  open ( '/tmp/test/d.json' , 'w' ) as fd:    
    ...:     json.dump(d,fd)     #写入到文件中
    ...:  
Do you really want to  exit  ([y] /n )? 
[root@localhost ~] # cat /tmp/test/d.json     #在shell模式下查看写入的文件内容
{ "a" "a" "c" : [ "c1" "c2" ],  "b" : 235,  "e" "None" "d" "True" }
 
 
(2)json的载入
[root@localhost ~] # ipython
Python 2.6.6 (r266:84292, Feb 22 2013, 00:00:18) 
Type  "copyright" "credits"  or  "license"  for  more  information.
 
IPython 1.2.1 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about  'object' , use  'object??'  for  extra details.
 
In [1]:  import  json
 
In [2]: with  open ( '/tmp/test/d.json' , 'r' ) as fd:
    ...:      dd  = json.load(fd)
 
In [3]: print  dd
{u 'a' : u 'a' , u 'c' : [u 'c1' , u 'c2' ], u 'b' : 235, u 'e' : u 'None' , u 'd' : u 'True' }


二、多种以POST方式传参的列子

1、pickle的方式

(1)修改views.py文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
[root@localhost Simplecmdb]# cat hostinfo/views.py  
from django.shortcuts import render
from django.http import HttpResponse
from hostinfo.models import Host
import pickle    #导入pickle模块
  
# Create your views here.
def index(req):
     if  req.method ==  'POST' :
     pick_obj = pickle.loads(req.body) #接受客户端的传参是一个字典   
         hostname = pick_obj[ 'hostname' ]    #既然是一个字典,那么我们就一个变量变量的接收
         ip = pick_obj[ 'ip' ]
         osversion = pick_obj[ 'osversion' ]
         memory = pick_obj[ 'memory' ]
         disk = pick_obj[ 'disk' ]
         vendor_id = pick_obj[ 'vendor_id' ]
         model_name = pick_obj[ 'model_name' ]
         cpu_core = pick_obj[ 'cpu_core' ]
         product = pick_obj[ 'product' ]
         Manufacturer = pick_obj[ 'Manufacturer' ]
         sn = pick_obj[ 'sn' ]
  
     try :
         host = Host.objects.get(hostname=hostname)
     except:
             host = Host()
         host.hostname = hostname
         host.ip = ip
         host.osversion = osversion
         host.memory = memory
         host.disk = disk
         host.vendor_id = vendor_id
         host.model_name = model_name
         host.cpu_core = cpu_core
         host.product = product
         host.Manufacturer = Manufacturer
         host.sn = sn    
         host.save()
         return  HttpResponse( 'ok' )
     else :
         return  HttpResponse( 'no data' )

(2)修改搜集主机信息脚本(需要修改一个地方)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
[root@localhost Simplecmdb] # vim post_hostinfo.py 
  
#!/usr/bin/env python
#coding:utf8
#author:Allentuns
#time:2015-02-14
  
from subprocess  import  Popen,PIPE
import  urllib,urllib2
import  pickle
import  json
import  re
  
###[hostname message]#####
def get_HostnameInfo( file ):
     with  open ( file , 'r' ) as fd:
         data = fd. read (). split ( '\n' )
         for  line  in  data:
             if  line.startswith( 'HOSTNAME' ):
                 hostname  = line. split ( '=' )[1]
                 break
     return  hostname
  
#####[ipaddr message]#####
def get_Ipaddr():
     P = Popen([ 'ifconfig' ],stdout=PIPE)
     data = P.stdout. read ()
     list = []
     str =  ''
     option = False
     lines = data. split ( '\n' )
     for  line  in  lines:
         if  not line.startswith( ' ' ):
             list.append(str)
             str = line
         else :
             str += line
     while  True:
         if  ''  in  list:
             list.remove( '' )
         else :
             break
     r_devname = re.compile( '(eth\d*|lo)' )
     r_mac = re.compile( 'HWaddr\s([A-F0-9:]{17})' )
     r_ip = re.compile( 'addr:([\d.]{7,15})' )
     for  line  in  list:
         devname = r_devname.findall(line)
         mac = r_mac.findall(line)
         ip = r_ip.findall(line)
         if  mac:
             return   ip[0]
  
#####[osversion message]#####
def get_OsVerion( file ):
     with  open ( file ) as fd:
         lines = fd.readlines()
         os_version = lines[0][:-8]
         return  os_version
  
#####[memory message]#####
def get_MemoryInfo( file ):
    with  open ( file ) as fd:
         data_list = fd. read (). split ( '\n' )
         MemTotal_line = data_list[0]
         Memory_K = MemTotal_line. split ()[1]
         Memory_G = float(Memory_K) /1000/1000
         Memory_G2 =  '%.2f'  % Memory_G
         memory = Memory_G2 +  'G'
         return  memory
  
#####[disk message]#####
def get_DiskInfo():
     p = Popen([ 'fdisk' , '-l' ],stdout=PIPE,stderr=PIPE)
     stdout,stderr = p.communicate()
     diskdata = stdout
  
     disk_initial_size = 0
     re_disk_type = re.compile(r 'Disk /dev/[shd]{1}.*:\s+[\d.\s\w]*,\s+([\d]+).*' )
     disk_size_bytes = re_disk_type.findall(diskdata)
     for  size  in  disk_size_bytes:
         disk_initial_size += int(size)
     disk_size_total_bytes =  '%.2f'   % (float(disk_initial_size) /1000/1000/1000 )
     disk_size_total_G = disk_size_total_bytes +  'G'
     disk = disk_size_total_G
     return  disk
  
#####[cpu message]#####
def get_CpuInfo():
     p = Popen([ 'cat' , '/proc/cpuinfo' ],stdout=PIPE,stderr=PIPE)
     stdout, stderr = p.communicate()
     cpudata = stdout.strip()
  
     cpu_dict = {}
     re_cpu_cores = re.compile(r 'processor\s+:\s+([\d])' )
     re_vendor_id = re.compile(r 'vendor_id\s+:\s([\w]+)' )
     re_model_name = re.compile(r 'model name\s+:\s+(.*)' )
  
     res_cpu_cores = re_cpu_cores.findall(cpudata)
     cpu_dict[ 'Cpu_Cores' ] = int(res_cpu_cores[-1]) + 1
     res_vendor_id = re_vendor_id.findall(cpudata)
     cpu_dict[ 'Vendor_Id' ] = res_vendor_id[-1]
     res_model_name = re_model_name.findall(cpudata)
     cpu_dict[ 'Model_Name' ] = res_model_name[-1]
     return  cpu_dict
  
#####[Demi message]#####
def get_dmidecode():
     P = Popen([ 'dmidecode' ],stdout=PIPE)
     data = P.stdout. read ()
     lines = data. split ( '\n\n' )
     dmidecode_line =  lines[2]
     line = [i.strip()  for  in  dmidecode_line. split ( '\n' if  i]
     Manufacturer = line[2]. split ( ': ' )[-1]
     product = line[3]. split ( ': ' )[-1]
     sn = line[5]. split ( ': ' )[-1]
     return  Manufacturer,product,sn
  
if  __name__ ==  '__main__' :
     #####[get data]#####
     hostname  = get_HostnameInfo( '/etc/sysconfig/network' )
     ip = get_Ipaddr()
     osversion = get_OsVerion( '/etc/issue' )
     memory = get_MemoryInfo( '/proc/meminfo' )
     disk = get_DiskInfo()
     Vendor_Id = get_CpuInfo()[ 'Vendor_Id' ]
     Model_Name = get_CpuInfo()[ 'Model_Name' ]
     Cpu_Cores = get_CpuInfo()[ 'Cpu_Cores' ]
     Manufacturer,product,sn = get_dmidecode()
  
     #####[get dict]##### 
     hostinfo = {
         'hostname' : hostname ,
         'ip' :ip,
         'osversion' :osversion,
         'memory' :memory,
         'disk' :disk,
         'vendor_id' :Vendor_Id,
         'model_name' :Model_Name,
         'cpu_core' :Cpu_Cores,
         'product' :product,
         'Manufacturer' :Manufacturer,
         'sn' :sn,
         }
     print hostinfo
     #data = urllib.urlencode(hostinfo)    #注释掉原来
     data = pickle.dumps(hostinfo)     #添加一行
  
     req = urllib2.urlopen( 'http://192.168.1.210:80/hostinfo' ,data)

(3)执行此脚本

1
2
[root@localhost Simplecmdb] # python post_hostinfo.py 
{ 'product' 'VMware Virtual Platform' 'ip' '192.168.1.210' 'vendor_id' 'GenuineIntel' 'cpu_core' : 1,  'disk' '17.18G' 'hostname' 'localhost.localdomain' 'sn' 'VMware-56 4d 41 69 ad a2 e6 3c-84 eb 81 81 e9 b4 4a 54' 'memory' '0.50G' 'osversion' 'CentOS release 6.4 ' 'model_name' 'Intel(R) Xeon(R) CPU E5-2407 0 @ 2.20GHz' 'Manufacturer' 'VMware, Inc.' }

(4)刷新浏览器,会看到新添加了一行

wKioL1T1U-3Cv96tAAkYqbtpQsg850.jpg


2、json方式(和上述方法基本相同)

(1)修改views.py文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
[root@localhost Simplecmdb] # cat hostinfo/views.py
from django.shortcuts  import  render
from django.http  import  HttpResponse
from hostinfo.models  import  Host
import  pickle
import  json     #导入模块
 
# Create your views here.
def index(req):
     if  req.method ==  'POST' :
     pick_obj = json.loads(req.body)     #修改此处
         hostname  = pick_obj[ 'hostname' ]
         ip = pick_obj[ 'ip' ]
         osversion = pick_obj[ 'osversion' ]
         memory = pick_obj[ 'memory' ]
         disk = pick_obj[ 'disk' ]
         vendor_id = pick_obj[ 'vendor_id' ]
         model_name = pick_obj[ 'model_name' ]
         cpu_core = pick_obj[ 'cpu_core' ]
         product = pick_obj[ 'product' ]
         Manufacturer = pick_obj[ 'Manufacturer' ]
         sn = pick_obj[ 'sn' ]
 
     try:
         host = Host.objects.get( hostname = hostname )
     except:
             host = Host()
         host. hostname  hostname
         host.ip = ip
         host.osversion = osversion
         host.memory = memory
         host.disk = disk
         host.vendor_id = vendor_id
         host.model_name = model_name
         host.cpu_core = cpu_core
         host.product = product
         host.Manufacturer = Manufacturer
         host.sn = sn    
         host.save()
         return  HttpResponse( 'ok' )
     else :
         return  HttpResponse( 'no data' )

(2)修改搜集主机信息脚本(需要修改一个地方)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
[root@localhost Simplecmdb] # cat post_hostinfo.py 
#!/usr/bin/env python
#coding:utf8
#author:Allentuns
#time:2015-02-14
 
from subprocess  import  Popen,PIPE
import  urllib,urllib2
import  pickle
import  json
import  re
 
###[hostname message]#####
def get_HostnameInfo( file ):
     with  open ( file , 'r' ) as fd:
         data = fd. read (). split ( '\n' )
         for  line  in  data:
             if  line.startswith( 'HOSTNAME' ):
                 hostname  = line. split ( '=' )[1]
                 break
     return  hostname
 
#####[ipaddr message]#####
def get_Ipaddr():
     P = Popen([ 'ifconfig' ],stdout=PIPE)
     data = P.stdout. read ()
     list = []
     str =  ''
     option = False
     lines = data. split ( '\n' )
     for  line  in  lines:
         if  not line.startswith( ' ' ):
             list.append(str)
             str = line
         else :
             str += line
     while  True:
         if  ''  in  list:
             list.remove( '' )
         else :
             break
     r_devname = re.compile( '(eth\d*|lo)'
     r_mac = re.compile( 'HWaddr\s([A-F0-9:]{17})' )
     r_ip = re.compile( 'addr:([\d.]{7,15})' )
     for  line  in  list:
         devname = r_devname.findall(line)
         mac = r_mac.findall(line)
         ip = r_ip.findall(line)
         if  mac:
             return   ip[0]
 
#####[osversion message]#####
def get_OsVerion( file ):
     with  open ( file ) as fd:
     lines = fd.readlines()
     os_version = lines[0][:-8]
     return  os_version
 
#####[memory message]#####
def get_MemoryInfo( file ):
    with  open ( file ) as fd:
         data_list = fd. read (). split ( '\n' )
         MemTotal_line = data_list[0]
         Memory_K = MemTotal_line. split ()[1]
         Memory_G = float(Memory_K) /1000/1000
         Memory_G2 =  '%.2f'  % Memory_G
         memory = Memory_G2 +  'G'
         return  memory
 
#####[disk message]#####
def get_DiskInfo():
     p = Popen([ 'fdisk' , '-l' ],stdout=PIPE,stderr=PIPE)
     stdout,stderr = p.communicate()
     diskdata = stdout
 
     disk_initial_size = 0
     re_disk_type = re.compile(r 'Disk /dev/[shd]{1}.*:\s+[\d.\s\w]*,\s+([\d]+).*' )
     disk_size_bytes = re_disk_type.findall(diskdata)
     for  size  in  disk_size_bytes:
     disk_initial_size += int(size)
     disk_size_total_bytes =  '%.2f'   % (float(disk_initial_size) /1000/1000/1000 )
     disk_size_total_G = disk_size_total_bytes +  'G'
     disk = disk_size_total_G
     return  disk
 
#####[cpu message]#####
def get_CpuInfo():
     p = Popen([ 'cat' , '/proc/cpuinfo' ],stdout=PIPE,stderr=PIPE)
     stdout, stderr = p.communicate()
     cpudata = stdout.strip()
 
     cpu_dict = {}
     re_cpu_cores = re.compile(r 'processor\s+:\s+([\d])' )
     re_vendor_id = re.compile(r 'vendor_id\s+:\s([\w]+)' )
     re_model_name = re.compile(r 'model name\s+:\s+(.*)' )
 
     res_cpu_cores = re_cpu_cores.findall(cpudata)
     cpu_dict[ 'Cpu_Cores' ] = int(res_cpu_cores[-1]) + 1
     res_vendor_id = re_vendor_id.findall(cpudata)
     cpu_dict[ 'Vendor_Id' ] = res_vendor_id[-1]
     res_model_name = re_model_name.findall(cpudata)
     cpu_dict[ 'Model_Name' ] = res_model_name[-1]
     return  cpu_dict
 
#####[Demi message]#####
def get_dmidecode():
     P = Popen([ 'dmidecode' ],stdout=PIPE)
     data = P.stdout. read ()
     lines = data. split ( '\n\n' )
     dmidecode_line =  lines[2]    
     line = [i.strip()  for  in  dmidecode_line. split ( '\n' if  i]
     Manufacturer = line[2]. split ( ': ' )[-1]
     product = line[3]. split ( ': ' )[-1]
     sn = line[5]. split ( ': ' )[-1]
     return  Manufacturer,product,sn
 
if  __name__ ==  '__main__' :
     #####[get data]#####
     hostname  = get_HostnameInfo( '/etc/sysconfig/network' )
     ip = get_Ipaddr()
     osversion = get_OsVerion( '/etc/issue' )
     memory = get_MemoryInfo( '/proc/meminfo' )
     disk = get_DiskInfo()
     Vendor_Id = get_CpuInfo()[ 'Vendor_Id' ]
     Model_Name = get_CpuInfo()[ 'Model_Name' ]
     Cpu_Cores = get_CpuInfo()[ 'Cpu_Cores' ]
     Manufacturer,product,sn = get_dmidecode()
     
     #####[get dict]##### 
     hostinfo = {
     'hostname' : hostname ,
     'ip' :ip,
     'osversion' :osversion,
     'memory' :memory,
     'disk' :disk,
     'vendor_id' :Vendor_Id,
     'model_name' :Model_Name,
     'cpu_core' :Cpu_Cores,
     'product' :product,
     'Manufacturer' :Manufacturer,
     'sn' :sn,
     }
     print hostinfo
     #data = urllib.urlencode(hostinfo)
     #data = pickle.dumps(hostinfo)    #注释掉
     data = json.dumps(hostinfo)        #添加一行
 
     req = urllib2.urlopen( 'http://192.168.1.210:80/hostinfo' ,data)

(3)执行此脚本

1
2
[root@localhost Simplecmdb] # python post_hostinfo.py 
{ 'product' 'VMware Virtual Platform' 'ip' '192.168.1.210' 'vendor_id' 'GenuineIntel' 'cpu_core' : 1,  'disk' '17.18G' 'hostname' 'localhost.localdomain' 'sn' 'VMware-56 4d 41 69 ad a2 e6 3c-84 eb 81 81 e9 b4 4a 54' 'memory' '0.50G' 'osversion' 'CentOS release 6.4 ' 'model_name' 'Intel(R) Xeon(R) CPU E5-2407 0 @ 2.20GHz' 'Manufacturer' 'VMware, Inc.' }

(4)刷新浏览器,会看到再次新添加了一行

wKioL1T1VqXixKeOAAm22zx6Q9w076.jpg










     本文转自zys467754239 51CTO博客,原文链接:http://blog.51cto.com/467754239/1616806,如需转载请自行联系原作者


相关文章
|
19天前
|
JSON 安全 数据安全/隐私保护
告别密码泄露!Python OAuth与JWT双剑合璧,守护你的数字资产💰
本文探讨了在Python环境中利用OAuth 2.0和JSON Web Tokens (JWT) 提高系统安全性的方法。OAuth 2.0是一种开放标准授权协议,通过用户授权和令牌颁发来保护资源访问。JWT则是一种紧凑、自包含的认证方式,用于安全传输信息。文章详细介绍了如何使用Flask-OAuthlib实现OAuth 2.0认证,以及使用PyJWT生成和验证JWT。结合这两种技术,可以构建出既安全又高效的认证体系,为数据安全提供双重保障。
24 3
|
4月前
|
编译器 开发工具 C++
【Python】已解决error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build
【Python】已解决error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build
2217 0
|
1月前
|
JSON 安全 数据安全/隐私保护
告别密码泄露!Python OAuth与JWT双剑合璧,守护你的数字资产💰
【10月更文挑战第2天】密码泄露是互联网安全的重大隐患。为了解决这一问题,开发人员采用更安全的认证机制,如 OAuth 2.0 和 JSON Web Tokens (JWT),以保护用户数字资产。OAuth 2.0 作为一种开放标准授权协议,允许资源拥有者向客户端授予访问权限而不必暴露凭证;JWT 则是一种用于安全传输信息的紧凑格式,能够在各方间传递自包含认证信息。
39 3
|
2月前
|
JSON 安全 数据安全/隐私保护
告别密码泄露!Python OAuth与JWT双剑合璧,守护你的数字资产💰
【9月更文挑战第5天】密码泄露是互联网安全的重大隐患。为了解决这一问题,开发者们采用了更为安全的认证机制,如OAuth 2.0和JSON Web Tokens (JWT),以保护用户的数字资产。OAuth 2.0通过授权协议允许资源拥有者授予客户端访问权限而不暴露凭证;JWT则提供了一种紧凑且安全的信息传输方式,使得认证信息自包含于令牌中。
86 8
|
4月前
|
数据采集 小程序 数据库
20年“镇国级”IT大牛,竟搞出500页漫画Python零基础顶级教程!
乔布斯说每个人都应该学习一门编程语言。Python正热,我决定通过编程让自己习得一种思考问题的方式,这也是我在个人编程生涯中的最大收获。 我以为只能枯燥无味地学编程,直到看到本书的样章,以漫画形式让我更直观、生动地了解到什么是编程。超级喜欢这种漫画风格。我回想起自己当年学习编程语言时的情景:逼迫自己背诵和消化、吸收那些自己根本没有理解的内容。如果当时有这么一本书,我就不会学得那么艰难,然后用了那么久才摸索成为一名“攻城狮”。
|
3月前
|
Python
【Python】解决Can‘t find model ‘en‘. It doesn‘t seem to be a shortcut link, a Python package or a valid
在使用以下代码时,报错Can’t find model ‘en’. It doesn’t seem to be a shortcut link, a Python package or a valid path to a data directory.
62 1
|
4月前
|
数据挖掘 Python
🚀告别繁琐!Python I/O管理实战,文件读写效率飙升的秘密
【7月更文挑战第29天】在 Python 编程中,高效的文件 I/O 对性能至关重要。
49 4
|
4月前
|
数据挖掘 数据处理 Python
🔍深入Python系统编程腹地:文件系统操作与I/O管理,打造高效数据处理流水线
【7月更文挑战第29天】深入Python系统编程腹地:文件系统操作与I/O管理,打造高效数据处理流水线
39 3
|
4月前
|
安全 数据安全/隐私保护 Python
下一篇
无影云桌面