Django项目(二)

云片网发送短信验证码(API)

URL = "https://sms.yunpian.com/v2/sms/single_send.json"
apikey = "9b11127a9701975c734b8aee81ee3526"   #  9bddae557939db620e2080b2db52ade8
mobile = "15205201314"    
text:【云片网】您的验证码是 1234   # 【XXX】您的验证码是#code#。如非本人操作,请忽略本短信

import requests
def send_single_sms(apikey,code,mobile):
	url = "https://sms.yunpian.com/v2/sms/single_send.json"
	text = '【云片网】您的验证码是'.format(code)
	res = requests.post(url,data = {
			'apikey':apikey,
			'mobile':mobile,
			'text':text
		})
	result = res.json()
	return result

if__name__= '__main__':
	send_single_sms(apikey,'1234',mobile)

Django 验证码

pip install django-simple-captcha
# setting
captcha  # 添加到INSTALLED_APPS中
# 执行
python manage.py migrate

# 路由路径中添加(urls)
# 正则表达式 re_path
re_path(r'^captcha/',include('captcha.urls'))

#apps.users.forms
from captcha.fields import CaptchaField
class DynamicLoginForm(forms.Form):
    captcha = CaptchaField()

# views 中
class LoginView(View):
    def get(self,request):
    	# 判断用户是否已经登陆
    	if request.user.is_authenticated:
    		return redirect(reverse('front:index'))
    	# 对未登录的从DynamicLoginForm 中取验证码,并跟着下发下去
        login_form = DynamicLoginForm()
        return render(request,"login.html",{'login_form':login_form})

动态登陆原理

from django.conf import settings
from django.http import HttpResponse,JsonResponse
from apps.utils.YunPian import send_single_sms    # 发送短信函数
from apps.utils.random_str import generate_random   # code生成文件

class SendSmsView(View):
	# 接收客户端发送过来的请求验证码的信息
	def post(self,request):
		send_sms_form = DynamicLoginForm(request.POST)   # 对动态发送上来的数据进行验证
		
		re_dict = {}
		if send_sms_form.is_valid():
			mobile = send_sms_form.clearned_data.get("mobile")   # 获取手机号
			code = generate_random(4,0)    # 生成随机code
			sms_json = send_single_sms(settings.YP_APIKEY,code,mobile)   # 接收短信接口返回的数据
			if sms_json['code'] == 0:

				# 设置redis数据库  连接、插入数据
				r = redis.Redis(host=settings.REDIS_HOST,port=settings.REDIS_PORT
	,db=0,charset="utf-8",decode_responses=True)
				r.set(mobile,code)
				# 设置redis数据库过期时间
				r.expire(mobile,60*5)
				re_dict['status'] = 'success'
            else:
                re_dict['msg'] = sms_json['msg']
        else:
        	print(send_sms_form.errors.get_json_data())
            for key,value in send_sms_form.errors.items():
                re_dict[key] = value[0]
        return JsonResponse(re_dict) 
        

**#redis 使用方法**

import redis
# redis 默认数据库的个数 16个
r = redis.Redis(host='127.0.0.1', port=6379, db=0, encoding='utf8', decode_responses=True)

r.set('name','juran')
r.expire('name',1)

import time
time.sleep(1)

# b'juran' 字节
print(r.get('name'))


**# 动态登陆方法**
class DynamicLoginView(View):
    def post(self,request):
        dynamic_login = False
        login_form = DynamicLoginPostForm(request.POST)   # 根据手机号验证code是否正确
        d_form = DynamicLoginForm(request.POST)
        if login_form.is_valid():
            mobile = login_form.cleaned_data.get('mobile')
            existed_user = UserProfile.objects.filter(mobile = mobile)
            if existed_user:
                user = existed_user[0]
            else:
                user = UserProfile(username=mobile)
                password = generate_random(10,2)
                user.set_password(password)
                user.mobile = mobile
                user.save()

            login(request, user)
            return redirect(reverse('front:index'))
        
        else:
            print(login_form.errors.get_json_data())
            dynamic_login = True
            content = {
                'login_form': login_form,
                'forms_errors': login_form.errors,
                'd_form': d_form,
                'dynamic_login': dynamic_login
            }
            return render(request, 'login.html', context=content)      		

用户注册

# user.forms中   设置验证码- 在views进行返回前端
class RegisterGetForm(forms.Form)
	captcha = CaptchaField()

# user.forms 中对提交上来的注册信息进行验证(手机号+验证码+密码)
class RegisterPostForm(forms.Form):
	mobile = forms.CharField(max_length=11,min_length=11,required=True)
    code = forms.CharField(min_length=4, max_length=4,required=True)
    password = forms.CharField(required=True)
    
    # 获取手机号,到数据库中去查看下是否存在,如果存在提示 号码已经存在
	def clean_mobile(self):
        mobile = self.cleaned_data.get('mobile')
        mobile_exists = UserProfile.objects.filter(mobile=mobile)
        # 根据验证是否存在做判断
        if mobile_exists:
            raise forms.ValidationError('手机号码已经存在')
        return mobile
    
    # 提取手机号、验证码、链接redis、获取redis中mobile对应code,如果code没问题、则返回、有问题则告知验证码不正确    
    def clean(self):
    	mobile = self.cleaned_data.get('mobile')
        code = self.cleaned_data.get('code')
        r = redis.Redis(host=settings.REDIS_HOST, port=settings.REDIS_PORT, db=0, charset='utf8', decode_responses=True)
        redis_code = r.get(str(mobile))
        if redis_code != code:
            raise forms.ValidationError('验证码不正确')
        return self.cleaned_data


class RegisterView(View):
	# get 请求将HTML 和验证码返回前端
	def get(self,request):
		register_form = RegisterGetForm()
		return render(request,'register.html',{'register_form':register_form})

	# 注册提交的数据进行处理
	def post(self,request):
		# 表单验证
		register_post_form = RegisterPostForm(request.POST)
		# 表单验证是否通过
		if register_post_form.is_valid():
			# 如果通过获取手机号 + 密码
            mobile = register_post_form.cleaned_data.get('mobile')
            password = register_post_form.cleaned_data.get('password')
            # 新建一个用户
            user = UserProfile(username=mobile)
            user.set_password(password)
            user.mobile = mobile
            user.save()
            # 登录
            login(request,user)
            return redirect(reverse('front:index'))
        else:
            # print(register_post_form.errors.get_json_data())
            register_form = RegisterGetForm()
            content = {
                'register_form':register_form,
                'forms_errors':register_post_form.errors
            }
            return render(request,'register.html',context=content)
		
		

发布了50 篇原创文章 · 获赞 3 · 访问量 1797

猜你喜欢

转载自blog.csdn.net/weixin_43056654/article/details/104252096