CVAT——3. Advanced功能分享

🎅1. REST API

官方文档手册,点击这里
如果已经有了搭建好的CVAT环境,那么可以访问http://XXX:8080/api/swagger/

其中有很多分类,主要包括以下类型:

auth - user authorization queries
comments - requests to post/delete comments to issues
issues - update, delete and view problem comments
jobs -requests to manage the job
lambda - requests to work with lambda function
projects - project management queries
restrictions - requests for restrictions
reviews -adding and removing the review of the job
server - server information requests
tasks - requests to manage tasks
users - user management queries

其中最值得关注的应该是:可以请求标注信息jobs
在这里插入图片描述

🎠2. 以job接口为例

👑2.1 自带示例

其实给了访问方法, 点击某行,比如下面的Method returns details of a job
在这里插入图片描述
然后可以看到对于jobs来说,最重要的一个属性就是id,
在这里插入图片描述
输入一个你项目中存在的job的id序号,比如job #6,点击try it out,然后界面就会变成如下样子,之前try it out的地方变成cancel,同时多出来一个ExecuteClear按键。
在这里插入图片描述
点击Execute,可以看到下面的response
在这里插入图片描述

🎀2.2 project,task以及job的id

其实CVAT有好几种组织形式,分别是Projects,每个Projects可以包含多个tasks,每个task包含多个job,但是直接在task界面看到的#15这些数字序号其实是job的id。
在这里插入图片描述
project和task在有些界面也是可以看到它们的id的,例如:
Project # 2
在这里插入图片描述
Task #13
在这里插入图片描述

😀3. 代码

🍙3.1 授权

一开始没有考虑到授权/密码等问题,直接:

import requests
import json

job_id = 6

request_url = "http://data.a-stack.com:8080/api/v1/jobs/"+str(job_id)
response=requests.get(request_url)
if response.status_code==200:
    print(json.loads(response))
else:
    print(response)

返回<Response [401]>未授权。

直接去看文档,这里,没有看到和请求授权相关的内容,

🍱3.2 token问题

💘3.2.1 auth接口

请教了同事之后,知道需要先去auth接口,输入用户名密码等得到token,这里还看到一个X-CSRFToken的东西,需要加在headers中,但是这个每发送一次请求就会更新。
在这里插入图片描述
搜索之后,发现网上对这个东西也有一些说法,主要是django这个框架会有一个csrf机制,
根据:django设置csrf_token

关于csrf_token
csrf:跨站请求伪造,防止其他人改造,盗取信息,反正就是一种网站的防护措施
服务器端:设置随机的csrf_token,get请求的时候就该设置好
客户端:携带上相应的csrf_token,post请求的时候携带上

另外,搜索过程发现有人可以在网页上找到这个csrf-token,随即刷新页面,查看页面html代码
在这里插入图片描述
确实页面中有一个元素含有这个csrf-token,搞一下填进去就好了。但是加进去还是错,尝试把请求的链接直接输入网页:
在这里插入图片描述
就看到了这样的测试界面


所以其实是被给的提示中的curl命令误导了:
在这里插入图片描述
在这里插入图片描述
API说明中说的很简单,不需要header(也就不需要去网页里扣那个csrftoken了),只需要这几个data即可。最终代码如下:

def get_token(UserName, Email, PassWord):
    request_url = "XXXX/api/v1/auth/login"
    params = {"username": UserName, "email": Email, "password": PassWord}
    response = requests.post(request_url, data=params)
    if response.status_code == 200:
        print(json.dumps(response.json(), sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False))
        dictRS = dict(response.json())
        return dictRS
    else:
        print(response)

🐬3.2.2 job接口

同理,在使用那个测试页面查看过到底需要哪些字段后,可以去看看job接口的情况,确定到底该以什么样的形式发送请求。
在这里插入图片描述
可以看到,对于job这个接口来说,其实还有几个选项,不管那么多,测试最简单的。
auth接口可以得到key/token,原话是:

  1. Check the credentials and return the REST Token if the credentials are valid and authenticated.
    检查凭据,如果凭据有效且经过身份验证,则返回REST令牌。
  2. Calls Django Auth login method to register User ID in Django session framework
    调用Django Auth login方法在Django session框架中注册用户ID
  3. Accept the following POST parameters: username, password Return the REST Framework Token Object’s key.
    使用POST参数,用户名,密码,返回REST框架令牌对象的密钥

所以这里得到的密钥,是要作为后面API访问时登录的依据。

由于之前没有研究过restAPI,所以搜索的时候搜了很多无效解决方案,最后还是直接看django-rest-framework官方文档,找到了我关心的东西。
在这里插入图片描述
简单来说,就是要在新的请求中,把这个Authorization授权信息放到header中,同时获取到的key和token这个词语之间要有个空格,最后的代码类似:

def get_result(token):
    request_url = "XXXX/api/v1/jobs/6"
    print(request_url)
    headers = {"Authorization": "Token " + token}
    # 头部信息中有一个授权字段,其值是Token+空格+auth接口返回的key作为token
    response = requests.get(request_url, headers=headers)
    if response.status_code == 200:
        print(json.dumps(response.json(), sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False))
    else:
        print(response)

然后就可以获取和测试界面一样的数据了,OK!!!!!!!!

💎3.2.3 其他接口

有了job接口解决掉授权的问题之后,其他都是一样的,比如要获取project的介绍信息,整体代码如下:

import requests
import json

def get_token(username, email, password):
"""
授权获取token
"""
    request_url = "XXX/api/v1/auth/login"
    params = {"username": username, "email": email, "password": password}
    response = requests.post(request_url, data=params)
    if response.status_code == 200:
        print(json.dumps(response.json(), sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False))
        dictRS = dict(response.json())
        return dictRS
    else:
        print(response)
        
def get_result(token):
    request_url = "XXX/api/v1/projects"
    print(request_url)
    # 将获取的token放入header中作为授权
    headers = {"Authorization": "Token " + token}
    response = requests.get(request_url, headers=headers)
    if response.status_code == 200:
        print(json.dumps(response.json(), sort_keys=True, indent=4, separators=(', ', ': '), ensure_ascii=False))
    else:
        print(response)

username = "XXX"
email = "XX@XX.com"
password = "XXX"

rs = get_token(username, email, password)
key = rs["key"]
get_result(key)

然后就可以得到想要的projects信息了在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吨吨不打野

解决了问题,觉得还行就给点

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值