美文网首页
django 图片验证码与邮箱验证

django 图片验证码与邮箱验证

作者: 入间 | 来源:发表于2018-05-24 23:30 被阅读0次

一. 图片验证码

Install django-simple-captcha
或者
pip install django-simple-captcha==0.6.4

  • 使用步骤

1 添加app

# settings.py
INSTALLED_APPS = [
 ...
    'captcha',
]

2 建立form表单类

# forms.py 
#一般将一些表单类写到同一个py文件里
from captcha.fields import CaptchaField
class RegisterForm(forms.Form):
    # 邮箱
    email = forms.EmailField(required=True, )
    # 密码验证
    password = forms.CharField(required=True)
    #invalid 表示出错时候的显示信息.
    captcha = CaptchaField(error_messages={'invalid': '验证码输入有误'})

3 生成验证码

​ 3.1 在加载页面时获得验证码

# views.py
# 创建对象
register_form = RegisterForm()
return render(request, 'register.html', {'register_form': register_form})

​ 3.2 前端使用

<label>验 证 码</label>
    {{ register_form.captcha }}

此时网页渲染时会自动生成验证码表单

<img src="/captcha/image/2f3f82e5f7a054bf5caa93b9b0bb6cc308fb7011/" alt="captcha" class="captcha" /> <input id="id_captcha_0" name="captcha_0" type="hidden" 
value="2f3f82e5f7a054bf5caa93b9b0bb6cc308fb7011" /> <input autocomplete="off" id="id_captcha_1" name="captcha_1" type="text" />

4 对用户输入的验证码进行验证

#views.py
register_form = RegisterForm(request.POST)
        if register_form.is_valid():
            pass

这个app功能比较强大,它会自动提取 用户提交的验证码并与数据库进行比对,不需要开发人员进行操作比对

二. 邮箱注册验证激活

1 发送

1.1 创建邮箱激活链接

# apps目录下的 utils 文件夹下 的send_email.py  
import random
#生成一个随机的字符串
def get_random_str(count):
    random_str = ''
    chars = 'fjdsalkfjdsklafjlkewjflkdjfsaflaeiw9ru'
    str_len = len(chars) - 1
    for i in range(count):
        randindex = random.randint(0, str_len)
        randomchar = chars[randindex]
        str += randomchar
    return random_str

1.2 具体的发送函数(省略生成随机字符串的函数)

# 同上
from django.core.mail import send_mail  # 这个是django自带的邮件发送方法
def send_register_email(email, send_type='register'):
    email_record = EmailVerifyRecord()
    random_str = get_random_str(10)
    email_record.code = random_str
    email_record.email = email
    email_record.type = send_type
    email_record.save()
    if send_type == 'register':
        email_title = 'click here'
        email_body = '请点击下边的链接激活 http://b.com/active/{0}'.format(random_str)
        send_status = send_mail(email_title, email_body, settings.EMAIL_FROM, [email], html_message=email_body)
    return send_status

1.3 用户注册时发送

# views.py
user = UserProfile()
user.username = username
user.password = make_password(password)
user.email = username
# 是否激活
user.is_active = False  # 默认是不激活的  后面可以加限制条件  只有激活后才能登陆
user.save()
status = send_register_email(username, 'register')

1.4 setting.py设定初始

# 配置邮箱发邮件的相关功能
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.163.com'
EMAIL_PORT = 25
#发送邮件的邮箱
EMAIL_HOST_USER = '1111@163.com'
#在邮箱中设置的客户端授权密码
EMAIL_HOST_PASSWORD = ''
#收件人看到的发件人
EMAIL_FROM = '1111@163.com'

1.5. 用户收到邮件

2用户激活

2.1. 配置url

 # 使用了命名组  
    url(r'^active/(?P<active_code>\w*)/$', views.Active.as_view(), name='user_active'),

2.2 根据url中active_code 获取对应的EmailVerifyRecord类对象
(注: 在1.2中创建了EmailVerifyRecord对象, 在1.3中在user对象中存储了email)

# views.py
all_records = EmailVerifyRecord.objects.filter(code=active_code)

2.3 根据EmailVerifyRecord对象获得相应用户并修改is_active字段.

   # views.py
    if all_records:
        for record in all_records:
            email = record.email
            user = UserProfile.objects.get(email=email)
            user.is_active = True  # 修改该字段为True 即为激活
            user.save()
        return render(request, 'login.html', {'msg': '激活成功, 现在可以登录'})

2.4 改进登录view(限制未激活用户的登录)

# views.py
if user.is_active:
    login(request, user)
    # 登录成功, 则返回主页
    return redirect('/')
else:
    # 否则返回提示
    return render(request, 'login.html', {'msg': '需要先激活'})

相关文章

网友评论

      本文标题:django 图片验证码与邮箱验证

      本文链接:https://www.haomeiwen.com/subject/rzbejftx.html