django用户登录的实现


发布时间:2019-02-15 13:08    作者: 晖哥哥   已过去:2 年,8 月   阅读总量:585 已被赞:0


实现步骤:

1.新建登录的html页面,使用手机和密码登陆,并带有记住我选择框

action="{% url 'xfzauth:login' %} 为登陆提交的URL, method="post" 提交方式

<form action="{% url 'xfzauth:login' %}" method="post">
    {% csrf_token %}
  <div class="form-group has-feedback">
    <input type="text" class="form-control" placeholder="手机号" name="telephone">
    <span class="glyphicon glyphicon-envelope form-control-feedback"></span>
  </div>
  <div class="form-group has-feedback">
    <input type="password" class="form-control" placeholder="密码" name="password">
    <span class="glyphicon glyphicon-lock form-control-feedback"></span>
  </div>
  <div class="row">
    <div class="col-xs-8">
      <div class="checkbox icheck">
        <label>
          <input type="checkbox" name="remember" value="1"> 记住我
        </label>
      </div>
    </div>
    <!-- /.col -->
    <div class="col-xs-4">
      <button type="submit" class="btn btn-primary btn-block btn-flat">登录</button>
    </div>
    <!-- /.col -->
  </div>
</form>

2.在apps下新建一个py文件,封装处理获取表单错误的方法

apps/forms.py

#encoding: utf-8
#封装的一个获取表单验证错误信息的方法,以后全部表单只要继承这个类就可以了
class FormMixin(object):
    def get_errors(self):
        #如果表单有错误
        if hasattr(self,'errors'):
            #提取出错误
            errors = self.errors.get_json_data()
            new_errors = {}
            #将错误的K和V都遍历出来存放到字典里
            for key, message_dicts in errors.items():
                messages = []
                for message in message_dicts:
                    messages.append(message['message'])
                new_errors[key] = messages
            return new_errors
        #如果没错误,返回一个空字典
        else:
            return {}

3.在用户模块下,新建表单,用于验证提交的数据,表单要继承上面的FormMixin,获取错误方法

class LoginForm(forms.Form,FormMixin):
    telephone = forms.CharField(max_length=11)
    password = forms.CharField(max_length=10,min_length=6)
    remember = forms.IntegerField(required=False) #required=False 默认

4.views.py 建立登陆处理的视图

from django.contrib.auth import logout,login,authenticate
from django.views.decorators.http import require_POST
from django.http import JsonResponse
from .forms import LoginForm

# 一般这样去设计json返回内容:
# {"code":400,"message":"","data":{}}

@require_POST
def login_view(request):
    form = LoginForm(request.POST)
    if form.is_valid():
        telephone = form.cleaned_data.get('telephone')
        password = form.cleaned_data.get('password')
        remember = form.cleaned_data.get('remember')
        user = authenticate(request,username=telephone,password=password)
        if user:
            if user.is_active:
                login(request,user)
                if remember:
                    request.session.set_expiry(None)
                else:
                    request.session.set_expiry(0)
                return JsonResponse({'code':200,'message':'','data':{}})
            else:
                return JsonResponse({'code':405,'message':'你的账户被冻结了','data':{}})
        else:
            return JsonResponse({'code':400,'message':'手机号或密码错误','data':{}})
    else:
        errors = form.get_errors()
        # {"password":['密码最大长度不能超过20为!','xxx'],"telephone":['xx','x']}
        return JsonResponse({'code':400,'message':'','data':errors})

5.分路由的设置:

from django.urls import path
from .views import *

app_name = 'xfzauth'

urlpatterns = [
     path('login/', login_view,name='login'),
]

6.总路由的设置

path('accmont/',include('apps.xfzauth.urls'))

7.完成,测试!

因为要采用ajax处理,所以全部使用JsonResponse 返回数据!

8.对JSON错误返回的优化:

为什么要优化:JSON错误返回很多地方都是相同的代码,为了使得代码封装性更好,我们这里对代码进行封装,封装步骤如下:、

第一步:在工程下新建一个python包,用于存放全部的工具类代码.utils

第二步:utils/restful.py:

#Json返回的API接口
#encoding: utf-8
from django.http import JsonResponse

#类似枚举顶变量定义
class HttpCode(object):
    ok = 200 #正常
    paramserror = 400 #参数错误
    unauth = 401 #用户没有授权
    methoderror = 405 #请求方式错误
    servererror = 500 #服务器内部错误

# {"code":400,"message":"","data":{}}
#定义json返回的方法,将code,message,data,kwargs传入
def result(code=HttpCode.ok,message="",data=None,kwargs=None):
    #用一个字典接受传进来的内容
    json_dict = {"code":code,"message":message,"data":data}
    #判断kwargs是否有传入且为字典格式且有值,都满足就写进字典
    if kwargs and isinstance(kwargs,dict) and kwargs.keys():
        json_dict.update(kwargs)
    #返回一个json对象回去
    return JsonResponse(json_dict)


#定义正常,200的时候,正确就不需要传递信息进去
def ok():
    return result()

#定义参数错误的方法400
def params_error(message="",data=None):
    return result(code=HttpCode.paramserror,message=message,data=data)

#定义用户没有授权的处理方法401
def unauth(message="",data=None):
    return result(code=HttpCode.unauth,message=message,data=data)

#定义请求方式错误的处理方法405
def method_error(message='',data=None):
    return result(code=HttpCode.methoderror,message=message,data=data)

#定义服务器错误的方法500
def server_error(message='',data=None):
    return result(code=HttpCode.servererror,message=message,data=data)
#*******************************************************************
#凡是有页面需要使用这些错误提示,就引入这个restful.py文件
# from utils import restful #引入自定义的JOSN错误处理模块,
#使用方法 如 :return restful.unauth(message="您的账号已经被冻结了!")
#*******************************************************************

第三步,视图引用,并修改JSON返回代码部分:、

from utils import restful #引入自定义的JOSN错误处理模块
@require_POST
def login_view(request):
    form = LoginForm(request.POST)
    if form.is_valid():
        telephone = form.cleaned_data.get('telephone')
        password = form.cleaned_data.get('password')
        remember = form.cleaned_data.get('remember')
        user = authenticate(request,username=telephone,password=password)
        if user:
            if user.is_active:
                login(request,user)
                if remember:
                    request.session.set_expiry(None)
                else:
                    request.session.set_expiry(0)
                return restful.ok()
            else:
                return restful.unauth(message="您的账号已经被冻结了!")
        else:
            return restful.params_error(message="手机号或者密码错误!")
    else:
        errors = form.get_errors()
        # {"password":['密码最大长度不能超过20为!','xxx'],"telephone":['xx','x']}
        return restful.params_error(message=errors)

点赞

0




登陆后方可评论