当前位置: 首页 > article >正文

【VUE+DRF】案例升级

1、功能完善(简易版)

1.1 后端API校验

基于drf的认证组件实现只有登录之后才能查看

utils/auth.py

from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import APIException, AuthenticationFailed
from rest_framework import status
from api import models


class MineAuthenticationFailed(APIException):
    status_code = status.HTTP_200_OK


class MineAuthentcation(BaseAuthentication):
    def authenticate(self, request):
        token = request.query_params.get("token")
        if not token:
            raise MineAuthenticationFailed("token不存在")

        user_object = models.UserInfo.objects.filter(token=token).first()
        if not user_object:
            raise MineAuthenticationFailed("认证失败")

        return user_object, token

settings.py


REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": ["utils.auth.MineAuthentcation"],
}

account.py

class AuthView(MineApiView):
    authentication_classes = []

1.2 前端校验

axios.js

const _axios = axios.create(config)
const info = userInfoStore()

_axios.interceptors.request.use(function (config) {
    // console.log("请求拦截器:", config)
    // 1. 去pinia中读取当前用户token
    // 2. 发送请求时携带token
    if (info.userToken) {
        if (config.params) {
            config.params["token"] = info.userToken
        } else {
            config.params = {"token": info.userToken}
        }
    }
    return config
})
_axios.interceptors.response.use(function (response) {
    console.log("响应拦截器:", response)
    // 认证失败
    if (response.data.code === "1000") {
        router.replace({name: "login"})
    }
    return response
}, function (error) {
    console.log("拦截器异常", error)
    if (error.response.data.code === "1000") {
        router.replace({name: "login"})
    }
    return Promise.reject(error)
})

export default _axios

LoginView.vue

const doLogin = function () {
  // 1、获取数据
  console.log(msg.value)
  // 2、发送网络请求
  _axios.post("/api/auth/", msg.value).then((res) => {
    console.log(res.data)
    if (res.data.code === 0){
      store.doLogin(res.data.data)
      router.push({name: "home"})
    } else {
      error.value = res.data.msg
      setTimeout(function (){
        error.value=""
      }, 5000)
    }
  })
}

http://www.kler.cn/a/377116.html

相关文章:

  • Unity 3D 从入门到精通:开启游戏开发的奇幻之旅
  • github提交不上去,网络超时问题解决
  • Python 实现 冒泡排序算法示例
  • 使用three.js 实现vr全景图展示,复制即可用
  • 计算机体系结构期末复习3:GPU架构及控制流问题
  • 【最新】17个一站式数据集成平台案例PPT下载(Apache SeaTunnel )
  • 如何在Oracle数据库中获取版本信息
  • es拼音分词器(仅供自己参考)
  • 前端react常见面试题目(basic)
  • 树莓派开发相关知识七 -串口数码管
  • 从0开始学统计-什么是中心极限定理
  • [perl] 数组与哈希
  • 【Linux】IPC进程间通信:并发编程实战指南(一)
  • 纯前端生成PDF(jsPDF)并下载保存或上传到OSS
  • 提升当当网数据爬取效率:代理IP并发抓取技术
  • [Redis] Redis事务
  • Linux内核与用户空间
  • 问:Redis如何做到原子性?
  • (自用)机器学习python代码相关笔记
  • ES入门:查询和聚合
  • Java之继承
  • Rust 跨平台应用的最佳实践
  • MiniWord
  • RHCE: DNS服务器
  • Redis为什么用跳表实现有序集合
  • 如何引用一个已经定义过的全局变量?