上传(post)数据,应该怎么做?

举报
我们都是云专家 发表于 2019/09/06 18:25:05 2019/09/06
【摘要】 它就是用于用户权限验证的,authorization 的值分为两部分:type 和 credentials,前者是验证采用的类型,后者是具体的参数值。这里的类型可以看到用的是 Bearer 类型。

登录完毕后想执行其他的操作,比如上传(post)数据的话,我应该怎么做?

首先要跟刚才一样,需要通过真实操作观察请求记录中对应记录的请求详情,根据 api 的地址和所需参数请求头等信息用代码进行构造,模拟真实的网络请求发送场景。下图为提交表单的请求详情信息:

20190906ly00048.PNG



请求参数


跟上面类似,根据返回的参数和请求头构造代码,结果会如何?

结果返回的状态码是 401,由于 scrapy 默认只处理 2xx 和 3xx 状态的请求、4开头和5开头的都不处理,但是我们又需要观察401状态返回的内容,这怎么办呢?

我们可以在settings.py中空白处新增代码:

""" 状态码处理 """ HTTPERROR_ALLOWED_CODES = [400, 401] 复制代码

然后在下一个方法中观察response回来的数据(这个地方当时作为萌新的我是懵逼的,所以委屈各位读者大佬跟我一起懵逼)。

后来查询了401的意思:未获得授权,也就是用户权限验证不通过。经过多方资料查找,发现请求头中有这么一条:


输入图片说明在这里输入图片标题


它就是用于用户权限验证的,authorization 的值分为两部分:type 和  credentials,前者是验证采用的类型,后者是具体的参数值。这里的类型可以看到用的是 Bearer 类型。

我又去观察登录时候的返回值,发现登录成功后的返回值除了 succeed 之外,还有其他的一些返回值,里面包括了一个叫 access_token 的字段,看样子它是 JWT 登录方式用来鉴权的 token 信息,经过比对确认 authorization 用的也正好就是这个 token 作为值。

那么代码就应该在第一次登录时候,取出access_token的值,并传递下去,用于后面请求的鉴权,所以代码改为:

    def is_login(self, response):         """         根据返回值中的message值来判断是否登录成功             如果登录成功则对数据传输页发起请求,并将结果回传给parse方法             如果登录失败则提示         由于后面的用户权限验证需要用到token信息,所以这里取到登录后返回的token并传递给下一个方法         """         results = json.loads(response.text)         if results['message'] == "succeed":             urls = 'http://xxx.yyy.ccc.aa'             access_token = results['data']['access_token']             print("登录成功,开始调用方法")             yield Request(url=urls, callback=self.parse, meta={"access_token": access_token})         else:             print("登录失败,请重新检查") 复制代码

下面的pase方法中,将 authorization 设定到 header 中以对数据进行请求:

header = {             "authorization": "Bearer " + access_token         } 复制代码

这样就解决了用户权限的问题,不再出现401


作者:云享专家韦世东
链接:https://juejin.im/post/5c10f6a8e51d451402773605
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。