后端:Django Rest FrameWork
前端:Vue+ElementUI
数据库:mysql
效果演示:
首先在django项目的setting.py中添加authtoken模块:
INSTALLED_APPS = (
'rest_framework',
'rest_framework.authtoken',
)
然后添加token认证项,
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.TokenAuthentication', # token认证
)
}
常常我们的token都会存在数据库的一个表里面,那么现在去数据库注册一张表:
python manage.py migrate
这样之后,我们的项目数据库中就会多一张 authtoken_token 的表
因为我也没有特殊需求,所以django自带的用户模型足够我使用,下面直接开始写视图。
(ps.django默认模型字段有限,假如业务需要新增字段比如手机号,可以自定义模型,见我另外的文章)
class LoginViewSet(APIView):
'''登录获取token方法'''
permission_classes = (AllowAny,) # AllowAny 允许所有用户
def post(self, request, *args, **kwargs):
username = request.data.get('username')
password = request.data.get('password')
# django.contrib.auth.models.User
user = auth.authenticate(username=username, password=password)
if not user:
return JsonResponse(data={"code": 401,
"msg": "用户名或密码不对!"}, status=401)
# 删除原有的Token
old_token = Token.objects.filter(user=user)
old_token.delete()
# 创建新的Token
token = Token.objects.create(user=user)
return JsonResponse({"code": 200,
"message": "success!",
"data": token.key,
"uuid": user.id,
"username": user.username
}, status=200)
同时在路由映射添加:
url('/login/', views.LoginViewSet.as_view())
至此后端就结束了,现在用api工具去验证一下
本来上面基本都完成了,突然想起前端调用后端服务的时候,可能会跨域,顺便加一下。
在setting.py中添加:
#在settings.py中修改
#先添加
INSTALLED_APPS = [
"corsheaders",
]
#然后添加
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware', # 注意顺序,放在中间件前面
'django.middleware.common.CommonMiddleware', # 中间件
]
因为登录的button绑定了handleLogin方法,所以需要定义一下点击后的处理
// 登录请求
handleLogin() {
this.$refs["loginRef"].validate((valid) => {
if (!valid) {
return;
} else {
let params = {
username: this.loginForm.username, //从页面手动输入的账号
password: this.loginForm.password, //从页面手动输入的密码
};
// fetchLogin(params).then((res) => {
this.$http.login(params).then((res) =>{//发起api接口返回正确then,否则执行catch
if (res.data.code === 200) {
sessionStorage.setItem("token", res.data.data);//将用户id存入SessionStorage
sessionStorage.setItem("username", res.data.username);
sessionStorage.setItem("uuid", res.data.uuid); //登录后路由跳转,一般是首页
this.$router.push("/dashboard");
this.$notify.success("登录成功") //登录后路由跳转,一般是首页
} else {
this.$message.error(res.data);
return;
}
}).catch(error=>{
this.$notify.error("账号或密码不正确哦!");
});
}
});
},