<p>我也有同样的问题。在</p>
<p>这是我在python3.5中的解决方案。在</p>
<p>在处理程序.py在</p>
<pre><code>class VerificationCodeHandler(BaseRequestHandler):
@asynchronous
@gen.coroutine
def post(self):
code_type = self.body_argument.get('code_type', 'register')
phone_number = self.body_argument.get('phone_number')
# 发送阿里云短信
try:
# This is another API, encapsulate into a coroutine
send_result = yield ali_sms.ali_send_code_sms(phone_number, code_type, code)
http_code, send_sms_result = send_result.code, json.loads(send_result.body.decode('utf-8'))
if int(http_code) == 200:
if send_sms_result.get('Code').upper() == 'OK':
self.success(self.prompt_msg.AUTH_SEND_MSG_SUCCESS)
# 缓存数据
self.redis.set(key_lasttime, 'send', ex=settings.SMS_INTERVAL)
self.redis.set(key_times,
int(is_overrun) + 1 if is_overrun else 1,
ex=settings.SMS_USER_LIMIT)
self.redis.set(key_code, code, ex=settings.SMS_EXPIRATION)
else:
self.fail(send_sms_result.get('Message', self.prompt_msg.AUTH_SEND_MSG_ERROR))
else:
self.fail(self.prompt_msg.AUTH_SEND_MSG_ERROR_AGAIN)
except:
# TODO 系统异常,需要通知管理员
logger.exception('发送短信失败')
self.fail(self.prompt_msg.AUTH_SEND_MSG_ERROR_AGAIN)
</code></pre>
<p>阿里_短信.py在</p>
^{pr2}$
<p>在unittest.mock在</p>
<pre><code>class VerificationCodeTestCast(BaseHandelrTestCase):
@mock.patch('common.aliyun.sms.ali_send_code_sms')
def test_send_sms_fail(self, sms):
fetch_future = tornado.concurrent.Future()
fetch_future._result = mock.Mock(body=json_encode({'Code': 'OK'}).encode('utf-8'), code=200)
fetch_future._done = True
sms.return_value = fetch_future
resp = self.fetch('/get_ver_code/', method='POST',
body=json_encode({'code_type': 'register',
'phone_number': '17980888160'})
)
result = json_decode(resp.body)
self.assertEqual(200, resp.code)
self.assertEqual(400, result.get('code'))
self.assertEqual(result['msg'], '今日发送短信超限,请明日再试')
</code></pre>
<p>注:
在处理程序中使用<code>ali_send_code_sms</code>时,不要<code>from ali_sms import ali_send_code_sms</code>,<code>import ali_sms</code>然后<code>ali_sms.ali_send_code_sms</code></p>