实现登录
前面我们 实现了 服务端 管理员 的一些增删改查操作,但是,我们还没有实现管理员 登录的功能呢。
现在我们来根据,API接口文档, 点击这里查看 实现 管理员登录 功能。
处理登录、登出请求
我们可以在mgr目录里面创建一个代码文件 sign_in_out.py
这个代码文件就是用来处理 管理员登录和登出 的API 请求的
大家可以思考一下, 我们的代码 该如何处理登录请求呢?
无非就把请求参数里面的用户名、密码取出来, 和数据库中记录的用户名密码进行比对。
如果和数据库中 记录的一致就认为是认证通过,否则就是不通过。
Django中有个内置app 名为 django.contrib.auth
,缺省包含在项目Installed App设置中。
这个app 的 models 定义中包含了一张 用户表,名为 auth_user
。
当我们执行 migrate 创建数据库表时,根据,就会为我们创建 用户表 auth_user,如下所示
django.contrib.auth
这个app 已经 为我们做好了登录验证功能。
我们只需要使用这个app库里面的方法就可以了。
Django的文档就给出了登录和登出代码范例,我们稍微修改一下。
我们在 mgr 目录下面, 创建一个 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路由
Bysms系统,浏览器登陆登录页面的url是 http://127.0.0.1/mgr/sign.html
但是这不是 登录 API接口的url路径。
根据接口,管理员登录的API 路径是 /api/mgr/signin
前面的课程, 我们已经在总路由文件 bysms/urls.py
中 添加了如下路由记录
现在,我们只需要 在mgr 目录下面 的子路由文件 urls.py
里添加如下内容
from django.urls import path
from mgr import sign_in_out
urlpatterns = [
path('signin', sign_in_out.signin),
path('signout', sign_in_out.signout),
]
这样就表示:
如果有HTTP请求 url是 /api/mgr/signin
就由 sign_in_out.py 里面的signin 函数处理,
如果有HTTP请求 url是 /api/mgr/signout
就由 sign_in_out.py 里面的signout 函数处理。
测试我们的代码
这样我们后端的登录请求处理的代码已经完成了。
那么,怎么测试是否正确呢?
还是可以 使用 requests库构建 登录请求http消息, 并且检查响应,看看是否能登录成功。
非常简单,如下代码即可
import requests,pprint
payload = {
'username': 'byhy',
'password': '88888888'
}
response = requests.post('http://localhost/api/mgr/signin',
data=payload)
pprint.pprint(response.json())
运行一下,大家看看,是不是可以返回这样的结果呢?
根据接口文档,ret 值为0,表示登录接口调用成功。
目前为止,我们项目代码,在如下百度网盘中的 bysms_06.zip
百度网盘链接:https://pan.baidu.com/s/1nUyxvq6IYykBNtPUf4Ho6w 提取码:9w2u
Django内置用户表
前面说过,Django内置 django.contrib.auth 包含了内置用户表的定义 和 登录认证的功能。
如果我们要 扩展这个表的字段,或者实现用户记录的添加、修改功能,推荐的做法参考后面的教程这一章