python跳板机需要实现登录短信验证功能,怎么做

2021-04-20 14:39发布

2条回答
studentaaa
2楼 · 2021-04-25 22:30

第一步: 下载python-redis模块


pip install python-redis


第二步: 配置setting.py中写配置


配置Redis为python的缓存,替换原来的session


1. #配置Redis为Django缓存

2. CACHES = {

3. "default": {

4. "BACKEND": "django_redis.cache.RedisCache",

5. "LOCATION": "redis://127.0.0.1:6379/0", #地址

6. "OPTIONS": {

7. "CLIENT_CLASS": "django_redis.client.DefaultClient",

8.  }

9.  }

10. }

11. # 将session缓存在Redis中

12. SESSION_ENGINE = "django.contrib.sessions.backends.cache"

13. SESSION_CACHE_ALIAS = "default"

14. # session 设置(可以不写)

15. SESSION_COOKIE_AGE = 60 * 60 * 12 # 12小时

16. SESSION_SAVE_EVERY_REQUEST = True

17. SESSION_EXPIRE_AT_BROWSER_CLOSE = True # 关闭浏览器,则COOKIE失效


第三步: views导入缓存cache模块


from django.core.cache import cache

1

第四步: 使用


1. def test_redis(request):

2.  # 存储数据

3.  chache.set("name", "tom", 20) # 该值的有效期为20s

4.   # 判断Redis中是否存在

5.  print(cache.has_kay("name"))  # 包含: true

6.   # 获取

7.    print(cache.get("name"))  # 返回: tom  无返回null

8.  return HttpResponse("测试Redis")


功能2: 短信下发

第一步: 申请短信服务

第二步: 独立发送短信和生成验证码的模块


#!/usr/bin/env python

#coding=utf-8

import random

from aliyunsdkcore.client import AcsClient

from aliyunsdkcore.request import CommonRequest

from utils import restful

def send_sms(phone,code):

    client = AcsClient('mxTYXZ4QDQecJQDN', 'znxNezmm4zfA9k

    Pyqx1WrpznjCaJFT', 'cnhangzhou')

    #phone = '17600950805'

    #aa= '222222'

    code = "{'code':%s}"%(code)

    request = CommonRequest()

    request.set_accept_format('json')

    request.set_domain('dysmsapi.aliyuncs.com')

    request.set_method('POST')

    request.set_protocol_type('https') # https | http

    request.set_version('2017-05-25')

    request.set_action_name('SendSms')

    request.add_query_param('RegionId', 'cn-hangzhou')

    request.add_query_param('PhoneNumbers', phone)

    request.add_query_param('SignName', '北网')

    request.add_query_param('TemplateCode',             'SMS_162738723')

    request.add_query_param('TemplateParam',code )

    response = client.do_action(request)

    # python2: print(response)

    print(str(response, encoding = 'utf-8'))

    return str(response, encoding = 'utf-8')

#数字表示生成几位, True表示生成带有字母的 False不带字母的

def get_code(n=6,alpha=True):

    s = '' # 创建字符串变量,存储生成的验证码

    for i in range(n): # 通过for循环控制验证码位数

            num = random.randint(0,9) # 生成随机数字0-9

            if alpha: # 需要字母验证码,不用传参,如果不需要字母的,

            关键字alpha=False

                upper_alpha = chr(random.randint(65,90))

                lower_alpha = chr(random.randint(97,122))

                num = random.choice([num,upper_alpha,lower_alpha])

            s = s + str(num)

    return s

if __name__ == '__main__':

    send_sms('18434288349', get_code(6,False))

    print(get_code(6,False)) # 打印6位数字验证码

    print(get_code(6,True)) # 打印6位数字字母混合验证码

    print(get_code(4,False)) # 打印4位数字验证码

    print(get_code(4,True)) # 打印4位数字字母混合验证码


功能3: 后台功能: 发送短信接口

流程:

获取手机号---->生成6位验证码–>缓存验证码到Redis—>发短信–>返回状态


# 发短信接口

def sms_send(request):

    # http://localhost:8000/duanxin/duanxin/sms_send/?phone=18434288349

    # 1 获取手机号

    phone = request.GET.get('phone')

    # 2 生成6位验证码

    code = aliyunsms.get_code(6, False)

    # 3 缓存到Redis

    cache.set(phone,code,60) #60s有效期

    print('判断缓存中是否有:',cache.has_key(phone))

    print('获取Redis验证码:',cache.get(phone))

    # 4 发短信

    result = aliyunsms.send_sms(phone, code)

    return HttpResponse(result)


功能4: 短信验证码校验

流程:

获取前台电话和验证码----> 获取Redis中存的验证码—>对比是否相等–>返回结果


# 短信验证码校验

def sms_check(request):

    # /duanxin/sms_check/?phone=xxx&code=xxx

    # 1. 电话和手动输入的验证码

    phone = request.GET.get('phone')

    code = request.GET.get('code')

    # 2. 获取redis中保存的code

    print('缓存中是否包含:',cache.has_key(phone))

    print('取值:',cache.get(phone))

    cache_code = cache.get(phone)

    # 3. 判断

    if code == cache_code:

        return HttpResponse(json.dumps({'result':'OK'}))

    else:

        return HttpResponse(json.dumps({'result':'False'}))


手动在浏览器上给假设的参数进行测试:


http://localhost:8000/duanxin/sms_send/?phone=手机号

http://localhost:8000/duanxin/sms_check/?phone=手机号&code=验证码


功能5: 统一接口的数据格式:


参考:


https://blog.csdn.net/xyy1028/article/details/84981627

https://www.runoob.com/w3cnote/restful-architecture.html


统一的接口模块restful.py


#encoding: utf-8

from django.http import JsonResponse

class HttpCode(object):

    ok = 200

    pageerror = 404

    methoderror = 405

    servererror = 500

# {"code":400,"message":"","data":{}}

def result(code=HttpCode.ok,message="",data=None,kwargs=None):

    json_dict = {"code":code,"message":message,"result":data}

    if kwargs and isinstance(kwargs,dict) and kwargs.keys():

        json_dict.update(kwargs)

    return JsonResponse(json_dict,json_dumps_params={'ensure_ascii': False})

def ok(message='OK',data=None):

    return result(code=HttpCode.ok,message=message,data=data)

def page_error(message="",data=None):

    return result(code=HttpCode.pageerror,message=message,data=data)

def method_error(message='',data=None):

    return result(code=HttpCode.methoderror,message=message,data=data)

def server_error(message='',data=None):

    return result(code=HttpCode.servererror,message=message,data=data)


任何接口的返回结果,都是用resutful.py方法进行规整


# 短信验证码校验

def sms_check(request):

    # /duanxin/sms_check/?phone=xxx&code=xxx

    # 1. 电话和手动输入的验证码

    phone = request.GET.get('phone')

    code = request.GET.get('code')

    # 2. 获取redis中保存的code

    print('缓存中是否包含:',cache.has_key(phone))

    print('取值:',cache.get(phone))

    cache_code = cache.get(phone)

    # 3. 判断

    if code == cache_code:

        #格式统一调整后的

        return restful.ok("OK",data=None)

    else:

        #格式统一调整后的

        return restful.params_error("验证码错误", data=None)

  • dic = {"a":7,"b":5,"c":9,"d":3,"e":6}

  • li = sorted(dic.items(), key=lambda kv: kv[1])

  • dic = {k:v for k,v in li}

  • print(dic)



回答: 2021-11-19 15:05



import random

from qcloudsms_py import SmsSingleSender

from qcloudsms_py.httpclient import HTTPError

class Captcha():

def create_captcha(self, ):

"""

create and return captcha

:param self:

:return: A six-digit verification code

"""

captcha = ''

for i in range(6):

now_number = str(random.randint(0, 9))

captcha += now_number

return captcha

def create_ssender(self, ):

"""

create ssender object

:return: a ssender object

"""

appid = ******

appkey = '******'

ssender = SmsSingleSender(appid, appkey)

return ssender

def send_short_message(self, phone_number):

"""

Send Verification Code Short Message

:param phone_number:Short Message Receiving Number

:return: a status code

"""

ssender = self.create_ssender()

params = []

captcha = self.create_captcha()

defult_time = "2"

params.append(captcha)

params.append(defult_time)

template_id = ******

sms_sign = '******'

try:

result = ssender.send_with_param(86,

phone_number,

template_id,

params,

sign=sms_sign,

extend="",

ext="")

return result['result']

except HTTPError as e:

print(e)

except Exception as e:

print(e)

相关问题推荐

  • 回答 3

    换行。比如,print hello\nworld效果就是helloworld\n就是一个换行符。\是转义的意思,'\n'是换行,'\t'是tab,'\\'是,\ 是在编写程序中句子太长百,人为换行后加上\但print出来是一整行。...

  • 回答 42

    十种常见排序算法一般分为以下几种:(1)非线性时间比较类排序:a. 交换类排序(快速排序、冒泡排序)b. 插入类排序(简单插入排序、希尔排序)c. 选择类排序(简单选择排序、堆排序)d. 归并排序(二路归并排序、多路归并排序)(2)线性时间非比较类排序:...

  • 回答 70
    已采纳

    前景很好,中国正在产业升级,工业机器人和人工智能方面都会是强烈的热点,而且正好是在3~5年以后的时间。难度,肯定高,要求你有创新的思维能力,高数中的微积分、数列等等必须得非常好,软件编程(基础的应用最广泛的语言:C/C++)必须得很好,微电子(数字电...

  • 回答 28

    迭代器与生成器的区别:(1)生成器:生成器本质上就是一个函数,它记住了上一次返回时在函数体中的位置。对生成器函数的第二次(或第n次)调用,跳转到函数上一次挂起的位置。而且记录了程序执行的上下文。生成器不仅记住了它的数据状态,生成器还记住了程序...

  • 回答 9

    python中title( )属于python中字符串函数,返回’标题化‘的字符串,就是单词的开头为大写,其余为小写

  • 回答 6

    第一种解释:代码中的cnt是count的简称,一种电脑计算机内部的数学函数的名字,在Excel办公软件中计算参数列表中的数字项的个数;在数据库( sq| server或者access )中可以用来统计符合条件的数据条数。函数COUNT在计数时,将把数值型的数字计算进去;但是...

  • 回答 1

    head是方法,所以需要取小括号,即dataset.head()显示的则是前5行。data[:, :-1]和data[:, -1]。另外,如果想通过位置取数据,请使用iloc,即dataset.iloc[:, :-1]和dataset.iloc[:, -1],前者表示的是取所有行,但不包括最后一列的数据,结果是个DataFrame。...

  • Python入门简单吗2021-09-23 13:21
    回答 45

    挺简单的,其实课程内容没有我们想象的那么难、像我之前同学,完全零基础,培训了半年,直接出来就工作了,人家还在北京大公司上班,一个月15k,实力老厉害了

  • 回答 4

    Python针对众多的类型,提供了众多的内建函数来处理(内建是相对于导入import来说的,后面学习到包package时,将会介绍),这些内建函数功用在于其往往可对多种类型对象进行类似的操作,即多种类型对象的共有的操作;如果某种操作只对特殊的某一类对象可行,Pyt...

  • 回答 8

     相当于 ... 这里不是注释

  • 回答 4

    还有FIXME

  • 回答 3

    python的两个库:xlrd和xlutils。 xlrd打开excel,但是打开的excel并不能直接写入数据,需要用xlutils主要是复制一份出来,实现后续的写入功能。

  • 回答 8

    单行注释:Python中的单行注释一般是以#开头的,#右边的文字都会被当做解释说明的内容,不会被当做执行的程序。为了保证代码的可读性,一般会在#后面加一两个空格然后在编写解释内容。示例:#  单行注释print(hello world)注释可以放在代码上面也可以放在代...

  • 回答 2

    主要是按行读取,然后就是写出判断逻辑来勘测行是否为注视行,空行,编码行其他的:import linecachefile=open('3_2.txt','r')linecount=len(file.readlines())linecache.getline('3_2.txt',linecount)这样做的过程中发现一个问题,...

  • 回答 4

    或许是里面有没被注释的代码

  • 回答 26

    自学的话要看个人情况,可以先在B站找一下视频看一下

没有解决我的问题,去提问