用户登录功能实现 ·流程处理: 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('服务器超时,请重试!') }) }) })
django项目用户登录登出功能:
最新推荐文章于 2024-04-12 07:08:33 发布