django项目用户登录登出功能:

    	用户登录功能实现
        ·流程处理:
        1 判断用户输入的账号是否为空
        2 判断用户输入的密码是否为空,格式是否正确
        3 判断用户输入的账号与密码是否正确

       ·请求方法:POST 在向后端发起请求时,需要附带csrf token

       ·url定义:`/login/`
        from django.urls import path
        from . import views
        app_name = 'user'#命名空间
        urlpatterns = [
            path('login/', views.LoginView.as_view(), name='login'),

        ]

       ·请求参数:url路径参数
            user_account:类型是字符串;前端必传数据;用户输入的账号可以是手机号也可以是用户名
            password:类型是字符串;前端必传数据;用户输入的密码
            rememberme:类型字符串;前端必传数据;用户选择是否记住我

       ·后端代码:
       # 在user目录下的views.py文件中定义如下类:

        class LoginView(View):
            def get(self,request):
                title = '登录页面'
                return render(request,'users/login.html',context={'title':title})

            def post(self,request):
                js_str = request.body
                if not js_str:
                    return res_json(errno=Code.PARAMERR,errmsg='参数错误')
                dict_data = json.loads(js_str.decode())
                # 数据验证   使用form 表单验证
                form = LoginForm(data=dict_data,request=request)
                if form.is_valid():
                    # 表单验证成功处理
                    return res_json(errno=Code.OK)
                else:
                    # 表单验证失败处理
                    msg_list = []
                    for i in form.errors.get_json_data().values():
                        msg_list.append(i[0].get('message'))
                    msg_str = '/'.join(msg_list)
                    return res_json(errno=Code.PARAMERR,errmsg=msg_str)

        ·在users目录下的forms.py文件中定义如下类:
            用来写forms表单处理
            import re
            from django import forms
            from django.contrib.auth import login
            from django.db.models import Q
            from .models import Users
            from . import constants

            class LoginForm(forms.Form):
                user_account = forms.CharField()
                password = forms.CharField(max_length=20,min_length=6,
                                           error_messages={
                                               'min_length':'密码长度大于6',
                                               'max_length':'密码长度小于20',
                                               'required':'密码不能为空'
                                           })
                remember = forms.BooleanField(required=False)


                def __init__(self,*a,**k):
                    self.request =k.pop('request')
                    super().__init__(*a,**k)

                def clean_user_account(self):
                    user_info = self.cleaned_data.get('user_account')
                    if not user_info:
                        raise forms.ValidationError('用户名不能为空')

                    if not re.match(r'^1[3-9]\d{9}$]', user_info) and (len(user_info)<5 or len(user_info)>20 ):
                        raise forms.ValidationError('输入的用户名格式错误,请重新输入!')
                    return user_info

                def clean(self):
                    cleaned_data = super().clean()
                    user_info = cleaned_data.get('user_account')
                    pass_wd= cleaned_data.get('password')
                    rmber = cleaned_data['remember']

                    # 判断是否是用户名你还是手机号  Q
                    user_qs = Users.objects.filter(Q(mobile=user_info) | Q(username=user_info))
                    if user_qs:
                        user = user_qs.first()
                        # 判断密码
                        if user.check_password(pass_wd):
                            if rmber:
                                self.request.session.set_expiry(constants.SESSION_EXPIRY_TIME)
                            else:
                                self.request.session.set_expiry(None)
                            login(self.request,user)

                        else:
                            raise forms.ValidationError('用户名或密码错误,请重新输入')
                    else:
                        raise forms.ValidationError('用户名不存在,请重新输入!')

                    return cleaned_data

        ·在users目录下的constants.py文件中定义如下常量
            用户session设置过期时间 一般为14天 可根据自己情况设置
            SESSION_EXPIRY_TITME = 14 * 24 * 60 * 60


        ·前端代码:
        $(function(){
            let $login = $('.form-contain');
            $login.submit(function(e){
                e.preventDefault();
                let Susername = $('input[name=telephone]').val();
                    if(Susername===""){
                    //message是自定义的js 需要自己去写也可以用弹窗alert代替
                        message.showError('用户名不能为空!');
                        return
                    }
                    if(!(/^[\u4e00-\u9fa5\w]{5,20}$/).test(Susername)){
                        message.showError('请输入5-20位字符的用户名');
                        return
                    }

                let Spassword = $('input[name=password]').val();
                    if(!Spassword){
                    message.showError('密码不能为空!');
                    return
                }
                    if(Spassword.length<6 || Spassword.length>20){
                    message.showError('密码长度需要在6-20位之间');
                    return
                }

                let status = $("input[type='checkbox']").is(':checked');

                let Sdata = {
                    "user_account":Susername,
                    "password":Spassword,
                    "remember":status
                };
                $.ajax({
                    url:'/user/login/',
                    type:'POST',
                    data:JSON.stringify(Sdata),
                    contentType:'application/json; charset=utf-8',
                    dataType:'json'
                })
                    .done(function(res){
                        if(res.errno==='0'){
                            message.showSuccess('登录成功!');
                            setTimeout(function(){
                                window.location.href = '/user/index/';
                            },3000)
                        }else{
                            message.showError('参数错误')
                        }
                    })
                    .fail(function(){
                        message.showError('服务器超时,请重试!')
                    })
            })
        })
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值