用户登录登出功能实现 |
您所在的位置:网站首页 › 百度怎么登出帐号信息提示 › 用户登录登出功能实现 |
用户登录登出功能实现
一、功能需求分析
1. 登录退出功能分析
流程图 ![]() 返回结果 登录页面 2.后端代码 user/views.py代码: from django.shortcuts import render from django.views import View # .... class LoginView(View): """ 登录视图 """ def get(self, request): return render(request, 'user/login.html') user/urls.py代码: from django.urls import path, include from . import views app_name = 'user' urlpatterns = [ path('register/', views.RegisterView.as_view(), name='register'), path('login/', views.LoginView.as_view(), name='login'), ] 3.前端页面代码1.user/login.html 因为表单需要post请求,所以记得在页面使用{% csrf_token %}标签。 注册功能已经开发好了,所以页面的上的立即注册处的a标签href可以写好 {% extends 'base/base.html' %} {% load static %} {% block title %}登录{% endblock title %} {% block link %} {% endblock link %} {% block main_start %} 请登录 立即注册 ; {% csrf_token %} 记住我 忘记密码? {% csrf_token %} {% endblock main_start %}接口说明: 类目说明请求方法POSTurl定义/user/login/参数格式表单参数参数说明: 参数名类型是否必须描述account字符串是用户输入的用户名password字符串是用户输入的密码remember字符串否用户是否选择免登录返回结果: { "errno": "0", "errmsg": "OK", } 3.后端代码 视图 在user目录下的views.py文件中定义如下视图: class LoginView(View): """ 登录视图 """ def get(self, request): return render(request, 'user/login.html') def post(self, request): form = LoginForm(data=request.POST, request=request) if form.is_valid(): return json_response(errmsg='恭喜登录成功!') else: err_msg_list = [] for item in form.errors.values(): err_msg_list.append(item[0]) err_msg_str = '/'.join(err_msg_list) return json_response(errno=Code.PARAMERR, errmsg=err_msg_str) 表单 在user目下的forms.py文件中定义如下表单: class LoginForm(forms.Form): account = forms.CharField(error_messages={'required': '账户不能为空'}) password = forms.CharField(max_length=20, min_length=6, error_messages={ 'max_length': '密码长度要小于20', 'min_length': '密码长度要大于6', 'require': '密码不能为空' }) remember = forms.BooleanField(required=False) def __init__(self, *args, **kwargs): self.request = kwargs.pop('request', None) super().__init__(*args, **kwargs) def clean_account(self): """ 校验用户账户 :return:account """ account = self.cleaned_data.get('account') if not re.match(r'^1[3-9]\d{9}$', account) and (len(account)20): raise forms.ValidationError('用户账户格式不正确,请重新输入') # 一定要return return account def clean(self): """ 校验用户名密码,并实现登录逻辑 :return: """ cleaned_data = super().clean() account = cleaned_data.get('account') password = cleaned_data.get('password') remember = cleaned_data.get('remember') # 登录逻辑 #Q 相当于 or,判断输入账户是是手机号或用户名 user_queryset = User.objects.filter(Q(mobile=account)|Q(username=account)) if user_queryset: user = user_queryset.first() #user.check_password()是框架自带的用来校验密码是否一致的方法 if user.check_password(password): if remember: self.request.session.set_expiry(constants.USER_SESSION_EXPIRY) else: self.request.session.set_expiry(0) login(self.request, user) else: raise forms.ValidationError('用户名密码错误!') else: raise forms.ValidationError('用户账号不存在,请重新输入!') 在user文件加下创建constants.py文件定义如下常量 # 用户session信息过期时间 单位秒 默认14天 USER_SESSION_EXPIRY = 14*24*60*60 4.前端js代码修改user/login.html中用户账户输入框input的name为account。 在static/js/user/下创建login.js文件 接口说明: 类目说明请求方法GETurl定义/user/logou/参数格式无参数2.后端代码 # 在user目录下的views.py文件中定义如下视图: class LogoutView(View): """ 登出视图 """ def get(self, request): logout(request) return redirect(reverse('user:login')) # 在urser目录下的urls.py文件定义如下路由: from django.urls import path from . import views app_name = 'user' urlpatterns = [ path('register/', views.RegisterView.as_view(), name='register'), path('login/', views.LoginView.as_view(), name='login'), path('logout/', views.LogoutView.as_view(), name='logout'), ]3.前端代码 # 修改templates/base/base.html中的header部分的代码如下 Python 首页 在线课堂 下载文档 搜索 {% if user.is_authenticated %} {{ user.username }} {% if user.is_staff %} 后台管理 {% endif %} 退出登录 {% else %} 登录 / 注册 {% endif %} |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |