三、auth自定义授权

客户端代码:

import requests
import hashlib
import time current_time = time.time()
#自意义的字符串app_id,和服务端ck一致
app_id ='8kasoimnasodn8687asdfkmasdf'
app_id_time = "%s|%s" % (app_id,current_time,) m = hashlib.md5()
m.update(bytes(app_id_time,encoding='utf-8'))
authkey = m.hexdigest() authkey_time ="%s|%s" % (authkey,current_time,)
print(authkey_time) host_data = {
'status':True,
'data':{
'hostname':'c1.com',
'disk':{'status':True,'data':'xxx'},
'mem':{'status':True,'data':'xxx'},
'nic':{'status':True,'data':'xxx'},
},
} response=requests.post(
url='http://127.0.0.1:8000/api/asset/',
json=host_data,
headers={'authkey':authkey_time},
) print(response.text) # requests.get(url='http://127.0.0.1:8000/api/asset/?k1=123')
# requests.get(url='http://127.0.0.1:8000/api/asset/',params={'k1':'v1','k2':'v2'})
# requests.post(
# url='http://127.0.0.1:8000/api/asset/',
# params={'k1':'v1','k2':'v2'}, # GET形式传值
# data={'username':'1123','pwd': '666'}, # POST形式传值
# headers={'a':'123'} # 请求头数据
# )

服务端代码:

from django.shortcuts import render,HttpResponse
from django.views.decorators.csrf import csrf_exempt,csrf_protect
import hashlib
import time #自定义的字符串
ck='8kasoimnasodn8687asdfkmasdf'
#5秒钟的授权列表
auth_list = [] @csrf_exempt
def asset(request):
auth_key_time = request.META.get('HTTP_AUTHKEY')
auth_key_client,client_ctime = auth_key_time.split('|')
server_current_time = time.time()
if server_current_time - 5 > float(client_ctime):
#太久远了
return HttpResponse('时间太久远了')
if auth_key_time in auth_list:
#已经访问过了
return HttpResponse('你来晚了')
key_time = '%s|%s' %(ck,client_ctime)
m = hashlib.md5()
m.update(bytes(key_time,encoding='utf-8'))
authkey = m.hexdigest() if authkey != auth_key_client:
return HttpResponse('授权失败')
auth_list.append(auth_key_time) if request.method == 'POST':
import json
print(authkey)
host_info = json.loads(str(request.body,encoding='utf-8'))
print(host_info)
return HttpResponse('授权成功') def test(request):
# print(request.POST,type(request.POST))
# from django.http.request import QueryDict
response = render(request,'index.html')
response.set_signed_cookie('kkkk','vvvv',salt='asdf')
return response

线程池和进程池

#!/usr/bin/env python
# -*- coding:utf8 -*- ####### 编写方式一 ########## from concurrent.futures import ThreadPoolExecutor
from concurrent.futures import ProcessPoolExecutor
import requests
import time def task(url):
response = requests.get(url)
print(url,response) pool = ThreadPoolExecutor(5) url_list = [
'https://www.baidu.com',
'http://www.sina.com.cn',
'http://cn.bing.com',
'https://home.cnblogs.com/u/liaoboshi/',
'https://www.linkedin.com',
'http://mil.news.baidu.com',
] for url in url_list:
pool.submit(task,url) pool.shutdown(wait=True) ####### 编写方式一 ################################ from concurrent.futures import ThreadPoolExecutor
import requests
import time def task(url):
'''
下载页面
:param url:
:return:
'''
response = requests.get(url)
return response def done(future,*args,**kwargs):
response = future.result()
print(response.status_code,response.content) pool = ThreadPoolExecutor(5) url_list = [
'https://www.baidu.com',
'http://www.sina.com.cn',
'http://cn.bing.com',
'https://home.cnblogs.com/u/liaoboshi/',
'https://www.linkedin.com',
'http://mil.news.baidu.com',
] for url in url_list:
v = pool.submit(task,url)
# 每一个线程函数走完,再走下面的另一个回调函数
v.add_done_callback(done) pool.shutdown(wait=True)

自定义异步IO框架

#!/usr/bin/env python
# -*- coding:utf8 -*- # IO多路复用: 监听多个socket对象,感知变化,利用其特性可以并发出异步IO模块
# 异步IO: 异步是非阻塞 非阻塞 + IO多路复用
# setblocking(False) import select
import socket class HttpRequest:
def __init__(self,sk,host,callback):
self.socket = sk
self.host = host
self.callback = callback def fileno(self):
return self.socket.fileno() class HttpResponse:
def __init__(self,recv_data):
self.recv_data = recv_data
self.header_dict = {}
self.body = None self.initialize() def initialize(self):
headers, body = self.recv_data.split(b'\r\n\r\n', 1)
self.body = body
header_list = headers.split(b'\r\n')
for h in header_list:
h_str = str(h, encoding='utf-8')
v = h_str.split(':', 1)
if len(v) == 2:
self.header_dict[v[0]] = v[1] class AsyncRequest:
def __init__(self):
self.conn = []
self.connection = [] # 用于检测是否已经连接成功 def add_request(self,host,callback):
try:
sk = socket.socket() # 创建 socket 对象
sk.setblocking(False) # 设置socket为非阻塞
sk.connect((host,80,)) # 连接 主机 except BlockingIOError as e: # 设置socket为非阻塞后,会报错,要抓住异常
pass request = HttpRequest(sk,host,callback) # 创建一个socket对象 要返回self.socket.fileno()
self.conn.append(request) # 把对象加到列表里
self.connection.append(request) # 把对象加到列表里 def run(self): while True:
rlist,wlist,elist = select.select(self.conn,self.connection,self.conn,0.05) # 创建select对象
for w in wlist:
print(w.host,'连接成功...')
# 只要能循环到,表示socket和服务器端已经连接成功
tpl = 'GET / HTTP/1.0\r\nHost:%s\r\n\r\n' % w.host
w.socket.send(bytes(tpl,encoding='utf8')) # 给发服务器送消息
self.connection.remove(w) # 发送完消息后,删除对象
for r in rlist:
# r,是HttpRequest
recv_data = bytes()
while True:
try:
chunck = r.socket.recv(8096) # 接收服务器返回消息
recv_data += chunck
except Exception as e:
break response = HttpResponse(recv_data) # 返回的消息包装成字典(请求头和请求体)
r.callback(response) # 执行回调函数
r.socket.close() # 关闭连接
self.conn.remove(r) #删除对象
if len(self.conn) == 0:
break def f1(response): # 回调函数拿到返回的请求头和请求体
print('保存到文件', response.header_dict) def f2(response):
print('保存到数据库', response.header_dict) url_list = [
{'host': 'www.baidu.com', 'callback': f1},
{'host': 'cn.bing.com', 'callback': f2},
{'host': 'www.cnblogs.com', 'callback': f2},
] req = AsyncRequest() # 创建一个对象 for item in url_list:
req.add_request(item['host'],item['callback']) # 运行类的add_request方法,把 主机名 和 回调函数 传进去 req.run() # 运行类的run方法

自定义异步IO框架

api安全认证的更多相关文章

  1. Web APi之认证(Authentication)两种实现方式【二】(十三)

    前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再叙述废话. 序言 对于所谓的认证说到底 ...

  2. RESTful Api 身份认证安全性设计

    REST是一种软件架构风格.RESTful Api 是基于 HTTP 协议的 Api,是无状态传输.它的核心是将所有的 Api 都理解为一个网络资源.将所有的客户端和服务器的状态转移(动作)封装到 H ...

  3. Web APi之认证(Authentication)两种实现方式后续【三】(十五)

    前言 之前一直在找工作中,过程也是令人着实的心塞,最后还是稳定了下来,博客也停止更新快一个月了,学如逆水行舟,不进则退,之前学的东西没怎么用,也忘记了一点,不过至少由于是切身研究,本质以及原理上的脉络 ...

  4. 关于RESTFUL API 安全认证方式的一些总结

    常用认证方式 在之前的文章REST API 安全设计指南与使用 AngularJS & NodeJS 实现基于 token 的认证应用两篇文章中,[译]web权限验证方法说明中也详细介绍,一般 ...

  5. RESTful Api 身份认证中的安全性设计探讨

    REST 是一种软件架构风格.RESTful Api 是基于 HTTP 协议的 Api,是无状态传输.它的核心是将所有的 Api 都理解为一个网络资源.将所有的客户端和服务器的状态转移(动作)封装到 ...

  6. 转 Web APi之认证(Authentication)两种实现方式【二】(十三)

    前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再废叙述废话. 序言 对于所谓的认证说到 ...

  7. Web APi之认证

    Web APi之认证(Authentication)两种实现方式后续[三](十五)   前言 之前一直在找工作中,过程也是令人着实的心塞,最后还是稳定了下来,博客也停止更新快一个月了,学如逆水行舟,不 ...

  8. spring cloud+dotnet core搭建微服务架构:Api授权认证(六)

    前言 这篇文章拖太久了,因为最近实在太忙了,加上这篇文章也非常长,所以花了不少时间,给大家说句抱歉.好,进入正题.目前的项目基本都是前后端分离了,前端分Web,Ios,Android...,后端也基本 ...

  9. spring cloud+.net core搭建微服务架构:Api授权认证(六)

    前言 这篇文章拖太久了,因为最近实在太忙了,加上这篇文章也非常长,所以花了不少时间,给大家说句抱歉.好,进入正题.目前的项目基本都是前后端分离了,前端分Web,Ios,Android...,后端也基本 ...

  10. 关于 RESTFUL API 安全认证方式的一些总结

    常用认证方式 在之前的文章REST API 安全设计指南与使用 AngularJS & NodeJS 实现基于 token 的认证应用两篇文章中,[译]web权限验证方法说明中也详细介绍,一般 ...

随机推荐

  1. 51nod 1119 机器人走方格 V2

    1119 机器人走方格 V2  基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 M * N的方格,一个机器人从左上走到右下,只能向右或向下走.有多少 ...

  2. 2018年全国多校算法寒假训练营练习比赛(第五场):A题:逆序数(树状数组or归并排序)

    题目描述 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数.比如一个序列为4 5 1 3 2, 那么这个序列 ...

  3. Thinkpad x230设置启动顺序

    设置可以从CD或者USB启动1.F1进入BIOS,Security → Secure Boot ,设置为:Disabled2.Startup → UEFI/Legacy Boot ,设置为:Both( ...

  4. GC_CONCURRENT freed 循环不停打印日志

    打印类似如下语句: 03-07 19:21:49.562: D/dalvikvm(1677): GC_CONCURRENT freed 2859K, 20% free 12020K/15011K, p ...

  5. java数组实现买彩票(重复则重新遍历查询思想)

    package com.wh.shuzu; import java.util.Arrays; /** * 买彩票 * @author 丁璐同学 * 重复则重新遍历查询思想 */ public clas ...

  6. Rsync 12种故障排查及思路

    Rsync 故障排查整理 Rsync服务常见问题汇总讲解: ====================================================================== ...

  7. Spring @Resource、@Autowired、@Qualifier区别

    @Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入: @Autowired默认是按照类型装配注入的,如果想按照名称来转配注入,则需要结合@Qualif ...

  8. JS 事件添加onclick写法注意。

    自定义函数添加onclick事件写法注意. 错误写法:element.onclick = addclass(className); 正确写法:element.onclick = function(){ ...

  9. windows系统同时安装多个nodejs环境(一键切换)

    由于不同程序对nodejs的环境要求不同,从而导致在单台电脑上开发多个nodejs应用很烦人: 好在gnvm,这个家伙帮我解决了问题 官网: https://github.com/kenshin/gn ...

  10. Node.js(二)常用的系统模块

    http模块 第一章已经介绍了 node.js 的模块都可以传一个回调函数  回调函数支持两个参数  error , data let fs = require('fs'); fs.readFile( ...