通過項目來深入理解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函數里,可以用偏函數的方式把參數放到協程函數里

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM