通过项目来深入理解tornado(二):AsyncHttpClient异步发送短信

通过项目来深入理解tornado(二):AsyncHttpClient异步发送短信

前言

首先,短信平台使用的是云片网

https://www.yunpian.com(审核是真心麻烦.)

云片网的短信接口比较简单,很容易就看懂了,先附上完整版代码,随后一一解释

import asyncio

from urllib.parse import urlencode
from tornado.httpclient import AsyncHTTPClient, HTTPRequest


class YunPian:

    def __init__(self, phone):
        self.client = AsyncHTTPClient()
        self.url = 'https://sms.yunpian.com/v2/sms/single_send.json'
        self.phone = phone
        self.apikey = ''
        self.text = ''
        self.header = {'Accept':'application/json;charset=utf-8',
                        'Content-Type':'application/x-www-form-urlencoded;charset=utf-8'}
        self.request = HTTPRequest(url=self.url,
                                   method='POST',
                                   headers=self.header,
                                   body=urlencode({'mobile':self.phone,
                                         'apikey':self.apikey,
                                         'text':self.text}))

    async def send_single_msg(self):

            res = await self.client.fetch(self.request)
            print(res.body.decode('utf8'))


if __name__ == '__main__':
    yun_pian = YunPian('你的电话号码')
    loop = asyncio.get_event_loop()
    loop.run_until_complete(yun_pian.send_single_msg)

  这里的坑还是有一些的,先说重点

async def send_single_msg(self):

            res = await self.client.fetch(self.request)
            print(res.body.decode('utf8'))

  

这个是主要的函数,参数等等都在初始化里完成了。主要使用了tornado自带的异步Http模块

fetch函数返回的是一个协程对象,需要用await关键字,因为这个函数是去请求url,所以耗时,我们需要切换出去执行其他的协程。所以必须加上await

说完了主要的协程函数,再来看看初始化函数的内容

def __init__(self, phone):
        self.client = AsyncHTTPClient()
        self.url = 'https://sms.yunpian.com/v2/sms/single_send.json'
        self.phone = phone
        self.apikey = ''
        self.text = ''
        self.header = {'Accept':'application/json;charset=utf-8',
                        'Content-Type':'application/x-www-form-urlencoded;charset=utf-8'}
        self.request = HTTPRequest(url=self.url,
                                   method='POST',
                                   headers=self.header,
                                   body=urlencode({'mobile':self.phone,
                                         'apikey':self.apikey,
                                         'text':self.text}))

  第一行,没啥好说的,创建一个异步Http对象。

  前面都没啥好说的,重点在request这里。

  因为Fetch方法只能接受单纯的url字符串或者request对象,如果是单纯的url没办法post,并且参数不好传,

  所以需要构建一个request对象,tornado文档里提供了这样一个类,tornado.httpclient.HttpRequest

  需要注意的是,body是参数,但是它只能接受unicode,不能接受字典,所以需要用到urllib.parse里面的urlencode方法

  另外,如果不想把所有参数都放到init函数里,可以用偏函数的方式把参数放到协程函数里

 

posted @ 2018-11-25 16:00  __Miracle  阅读(1238)  评论(2编辑  收藏  举报