• 基于ajax和form组件实现的注册、登录功能


    一、视图函数

    导入相关模块和数据表

     1 from django.shortcuts import render,HttpResponse,redirect
     2 
     3 # Create your views here.
     4 import random
     5 
     6 from django.http import JsonResponse
     7 
     8 from django.contrib import auth
     9 from django import forms
    10 
    11 from django.core.exceptions import ValidationError
    12 import re
    13 from app01.models import UserInfo,Customer
    14 from app01.form import UserForm

    这里将forms组件单独写在form.py文件里

     1 from django.forms import widgets
     2 
     3 from app01.models import UserInfo
     4 from django.core.exceptions import ValidationError
     5 import re
     6 from django import forms
     7 class UserForm(forms.Form):
     8     user=forms.CharField(min_length=2,label="用户名")
     9     gender=forms.ChoiceField(choices=((1,""),(2,"")))
    10     pwd=forms.CharField(min_length=5,widget=widgets.PasswordInput(),label="密码")
    11     r_pwd=forms.CharField(min_length=5,widget=widgets.PasswordInput(),label="确认密码")
    12     email=forms.EmailField(min_length=5,label="邮箱")
    13 
    14     def __init__(self, *args, **kwargs):
    15         super().__init__(*args, **kwargs)
    16         for filed in self.fields.values():
    17             filed.widget.attrs.update({'class': 'form-control'})
    18 
    19 
    20     def clean_user(self):
    21         val=self.cleaned_data.get("user")
    22         user=UserInfo.objects.filter(username=val).first()
    23         if user:
    24             raise ValidationError("用户已存在!")
    25         else:
    26             return val
    27 
    28     def clean_pwd(self):
    29         val=self.cleaned_data.get("pwd")
    30         if val.isdigit():
    31             raise ValidationError("密码不能是纯数字!")
    32         else:
    33             return val
    34 
    35     def clean_email(self):
    36         val=self.cleaned_data.get("email")
    37         if re.search("w+@163.com$",val):
    38             return val
    39         else:
    40             raise ValidationError("邮箱必须是163邮箱!")
    41 
    42     def clean(self):
    43         pwd=self.cleaned_data.get("pwd")
    44         r_pwd=self.cleaned_data.get("r_pwd")
    45 
    46         if pwd and r_pwd and r_pwd!=pwd:
    47             self.add_error("r_pwd", ValidationError("两次密码不一致!"))
    48         else:
    49             return self.cleaned_data
    View Code

    注册视图函数

     1 def reg(request):
     2     '''
     3     基于ajax和forms实现的注册功能
     4     :param request:
     5     :return:
     6     '''
     7     if request.method=="POST":
     8         print(request.POST)
     9         form=UserForm(request.POST)
    10         res={"user":None,"err_msg":""}
    11         if form.is_valid():
    12             res["user"]=form.cleaned_data.get("user")
    13             print("cleaned_data",form.cleaned_data)
    14             user=form.cleaned_data.get("user")
    15             pwd=form.cleaned_data.get("pwd")
    16             email=form.cleaned_data.get("email")
    17 
    18             user=UserInfo.objects.create_user(username=user,password=pwd,email=email)
    19 
    20 
    21         else:
    22             print(form.errors)
    23             print(form.cleaned_data)
    24             res["err_msg"] =form.errors
    25 
    26         return JsonResponse(res)
    27 
    28 
    29     else:
    30         form=UserForm()
    31         return  render(request,"reg.html",locals())

    登录视图函数

     1 def login(request):
     2     '''
     3     基于ajax和用户认证组件实现的登录功能
     4     :param request:
     5     :return:
     6     '''
     7     # if request.method=="POST":
     8     if request.is_ajax():
     9         user=request.POST.get("user")
    10         pwd=request.POST.get("pwd")
    11         validcode=request.POST.get("validcode")
    12 
    13         #Ajax请求返回一个字典
    14         response={"user":None,"err_msg":""}
    15         if validcode.upper() == request.session.get("keep_str").upper():
    16             user_obj=auth.authenticate(username=user,password=pwd)
    17             if user_obj:
    18                 auth.login(request,user_obj) # request.session["user_id"]=user_obj.pk
    19                 response["user"]=user
    20             else:
    21                 response['err_msg']="用户名或者密码错误!"
    22         else:
    23             response["err_msg"]="验证码错误!"
    24 
    25         return JsonResponse(response)
    26     else:
    27         return render(request, "login.html")

    退出登录

    1 def logout(request):
    2     auth.logout(request)
    3     return redirect("/login/")

    二、生成验证码

     1 def get_random_color():
     2     return (random.randint(0,255),random.randint(0,255),random.randint(0,255))
     3 
     4 
     5 def getcode(request):
     6     # if request.method=="GET":
     7     #     return render(request,'login.html')
     8     #设置验证码图片的背景色
     9     img=Image.new("RGB",(350,38),get_random_color())
    10     draw=ImageDraw.Draw(img)
    11     #引入字体
    12     font=ImageFont.truetype('static/font/kumo.ttf',32)
    13     code_str=''
    14     for i in range(6):
    15         random_num=str(random.randint(0,9))
    16         random_low=chr(random.randint(97,122))
    17         random_up=chr(random.randint(65,90))
    18         random_chr=random.choice([random_num,random_low,random_up])
    19 
    20         #保存每次的验证码
    21         code_str+=random_chr
    22         #设置每一个验证码的字体颜色和大小
    23         draw.text((i*30+50,0),random_chr,get_random_color(),font=font)
    24 
    25     f=BytesIO()
    26     img.save(f,'png')
    27     data=f.getvalue()
    28 
    29     #将每次生成的验证码保存在session里
    30     request.session['code_str']=code_str
    31     return HttpResponse(data)

    三、HTML

     1 <body>
     2 <div class="container">
     3     <div class="row">
     4         <div class="col-md-8 col-md-offset-2">
     5             <form action="" method="post">
     6                 {% csrf_token %}
     7                 <div class="form-group">
     8                     <label for="">用户名</label>
     9                     <input type="text" class="form-control" id="user">
    10                 </div>
    11                 <div class="form-group">
    12                     <label for="">密码</label>
    13                     <input type="password" class="form-control" id="pwd">
    14                 </div>
    15                 <div class="form-group">
    16                     <label for="">验证码</label>
    17                     <div class="row">
    18                         <div class="col-md-6">
    19                             <input type="text" class="form-control" id="vailcode">
    20                         </div>
    21                         <div class="col-md-6">
    22                             <img width="350",heigth="38" src="/getcode/" alt="" id="img">  # 这里调用了后端的getcode方法
    23                         </div>
    24                     </div>
    25                 </div>
    26                 <span class="error"></span>
    27                 <input type="button" class="btn-warning log_btn" value="登录">
    28             </form>
    29         </div>
    30     </div>
    31 </div>
    32 <script>
    33     $(function () {
    34         $('.log_btn').click(function () {
    35             $.ajax({
    36                 url:'/login/',
    37                 type:'post',
    38                 data:{
    39                     user:$('#user').val(),
    40                     pwd:$('#pwd').val(),
    41                     vailcode:$('#vailcode').val(),
    42                     csrfmiddlewaretoken:$("[name='csrfmiddlewaretoken']").val()
    43                 },
    44                 success:function (response) {
    45                     if (response['user']){
    46                         location.href='http://www.baidu.com'
    47                     }
    48                     else{
    49                         $('.error').css('color','red').html(response['error'])
    50                     }
    51 
    52                 }
    53             })
    54         });
    55         //验证码刷新
    56         $('#img').click(function () {
    57             this.src+='?'
    58         })
    59     })
    60 </script>
    61 </body>
  • 相关阅读:
    python课堂练习
    Python爬虫学习笔记(九)——Selenium的使用
    Python爬虫学习笔记(八)——智高考数据爬取
    Python爬虫学习笔记(七)——Ajax
    Python爬虫学习笔记(六)——BeautifulSoup和pyquery的使用
    Python爬虫学习笔记(五)——XPath的使用
    Python爬虫学习笔记(四)——猫眼电影Top100
    Python爬虫学习笔记(三)——正则表达式
    Python爬虫学习笔记(二)——requests库的使用
    Python爬虫学习笔记(一)——urllib库的使用
  • 原文地址:https://www.cnblogs.com/liaopeng123/p/9917633.html
Copyright © 2020-2023  润新知