实现登录

现在我们的系统,API接口 已经由架构师定义好了, 点击这里查看

我们只需要根据这个接口文档,实现后端系统的部分。

首先我们先 实现系统的管理员登录接口。



临时取消 CSRF 校验

根据接口文档, 登录请求是个Post请求

POST /网站名/api/mgr/signin  HTTP/1.1
Content-Type:   application/x-www-form-urlencoded

注意,缺省创建的项目, Django 会启用一个 CSRF (跨站请求伪造) 安全防护机制。

在这种情况下, 所有的Post请求都必须在HTTP请求头中携带用于校验的数据。

为了简单起见,我们先临时取消掉CSRF的 校验机制,等以后有需要再打开。

要临时取消掉CSRF的 校验机制,非常简单,只需要在 项目的配置文件 bysms/settings.pyMIDDLEWARE 配置项 里 注释掉 ‘django.middleware.csrf.CsrfViewMiddleware’ 即可。

如下所示

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]



创建mgr应用目录和处理请求代码文件

前面我们已经学习过 用 startapp 命令创建 应用目录了。

其实如果应用目录比较简单,我们也可以自己直接创建目录。

大家可以在项目根目录下面创建一个mgr目录,这里目录里面的代码是专门负责处理管理员相关的操作请求的。

我们可以在里面创建一个代码文件 sign_in_out.py

这个代码文件就是用来处理 管理员登录和登出 的API 请求的



大家可以思考一下, 我们的处理函数该如何处理登录请求呢?

无非就把请求参数里面的用户名、密码取出来, 和数据库中记录的用户名密码进行比对。

如果和数据库中 记录的一致就认为是认证通过,否则就是不通过。

Django中,缺省的项目已经为我们创建好了用户表,名为 auth_user,如下所示

default

并且已经为我们做好了登录校验的库

我们只需要使用 库里面的方法就可以了。

Django的文档就给出了登录和登出代码范例,我们稍微修改一下,在sign_in_out.py 文件中,输入如下内容

from django.http import JsonResponse

from django.contrib.auth import authenticate, login, logout

# 登录处理
def signin( request):
    # 从 HTTP POST 请求中获取用户名、密码参数
    userName = request.POST.get('username')
    passWord = request.POST.get('password')

    # 使用 Django auth 库里面的 方法校验用户名、密码
    user = authenticate(username=userName, password=passWord)
    
    # 如果能找到用户,并且密码正确
    if user is not None:
        if user.is_active:
            if user.is_superuser:
                login(request, user)
                # 在session中存入用户类型
                request.session['usertype'] = 'mgr'

                return JsonResponse({'ret': 0})
            else:
                return JsonResponse({'ret': 1, 'msg': '请使用管理员账户登录'})
        else:
            return JsonResponse({'ret': 0, 'msg': '用户已经被禁用'})
        
    # 否则就是用户名、密码有误
    else:
        return JsonResponse({'ret': 1, 'msg': '用户名或者密码错误'})


# 登出处理
def signout( request):
    # 使用登出方法
    logout(request)
    return JsonResponse({'ret': 0})



创建 url路由

根据接口,管理员登录的API 路径是 /api/mgr/signin

根据前面的学习, 我们可以在主路由文件 bysms/urls.py 中 添加如下路由记录

    # 凡是 url 以 api/mgr  开头的,
    # 都根据 mgr.urls 里面的 子路由表进行路由
    path('api/mgr/', include('mgr.urls')),

然后在mgr 目录下面 ,创建子路由文件 urls.py

在其中,添加如下内容

from django.conf.urls import url
from mgr.sign_in_out import signin, signout

urlpatterns = [

    url('signin', signin),
    url('signout', signout),

]

这样就表示:

如果有HTTP请求 url是 /api/mgr/signin 就由 sign_in_out.py 里面的signin 函数处理,

如果有HTTP请求 url是 /api/mgr/signout 就由 sign_in_out.py 里面的signout 函数处理。



测试我们的代码

这样我们后端的登录请求处理的代码已经完成了。

那么,怎么测试是否正确呢?

有的同学说,可以等前端开发好了对接。

但是, 我们后端的开发和前端开发是并行的,要等前端开发好了?

不需要的。

测试我们的代码,可以自己开发测试程序,模拟前端,发出http请求给后端进行测试。

我们前面的教程中,有关于 requests库的 ,点击这里

大家可以参考它,使用 requests库构建 登录请求http消息, 检查响应,看看是否能登录成功。

非常简单,如下代码即可

import  requests,pprint

payload = {
    'username': 'byhy',
    'password': 'byhybyhy'
}

response = requests.post('http://localhost/api/mgr/signin',
              data=payload)

pprint.pprint(response.json())

运行一下,大家看看,是不是可以返回这样的结果呢?

{'ret': 0}

根据接口文档,ret 值为0,表示登录接口调用成功。



到目前为止,我们的项目代码应该是这样的,大家点击这里下载代码

上一页 下一页