DRF 跨域 Vue 登录!
下载
# 版本, 我 Django3.x Python3.7
# django-cors-headers 4.0.0
pip install django-cors-headers
配置
# 打开 settings.py
# 增加
INSTALLED_APPS = [
...
'corsheaders',
]
# 添加中间件
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
...
]
# 增加
CORS_ORIGIN_ALLOW_ALL = True # 所有ip都可以访问后端接口
# CORS_ORIGIN_WHITELIST = ["http://127.0.0.1:8080",["http://192.168.10.1:8080"] # 指定能够访问后端接口的ip或域名列表
# 允许访问的请求方法
CORS_ALLOW_METHODS = (
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
'VIEW',
)
# 允许的headers
CORS_ALLOW_HEADERS = (
'accept',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
)
后端原生写法
前端 Vue
我使用的是 gitee.com 上开源封装好的 vue
# 下载地址: git clone https://gitee.com/nmgwap/vueproject.git
# 配置
# /vueproject/config/index.js
proxyTable: {
'/api': {
target: 'http://127.0.0.1:8000', // 你请求的第三方接口
changeOrigin: true, // 在本地会创建一个虚拟服务端,然后发送请求的数据,并同时接收请求的数据,这样服务端和服务端进行数据的交互就不会有跨域问题
pathRewrite: { // 路径重写,
'^/api': '/api' // 替换target中的请求地址,也就是说以后你在请求http://api.jisuapi.com/XXXXX这个地址的时候直接写成/api即可。
}
}
},
修改 login.vue, 它里面有 token 还有验证码认证, 我暂时后端还没有做,就需要先注释掉, 否则登录会失败
<template>
<div class="login-wrap">
<el-form label-position="left" :model="ruleForm" :rules="rules" ref="ruleForm" label-width="0px" class="demo-ruleForm login-container">
<h3 class="title">用户登录</h3>
<el-form-item prop="username">
<el-input type="text" v-model="ruleForm.username" auto-complete="off" placeholder="账号"></el-input>
</el-form-item>
<el-form-item prop="password">
<el-input type="password" v-model="ruleForm.password" auto-complete="off" placeholder="密码"></el-input>
</el-form-item>
<!-- <el-row>-->
<!-- <el-col :span="12">-->
<!-- <el-form-item prop="code">-->
<!-- <el-input type="text" v-model="ruleForm.code" auto-complete="off" placeholder="图形验证码" @keyup.enter.native="submitForm('ruleForm')"></el-input>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :span="12" class="code-box">-->
<!-- <img :src="ruleForm.codeimg" alt="" class="codeimg" @click="getcode()">-->
<!-- </el-col>-->
<!-- </el-row>-->
<el-checkbox class="remember" v-model="rememberpwd">记住密码</el-checkbox>
<el-form-item style="width:100%;">
<el-button type="primary" style="width:100%;" @click="submitForm('ruleForm')" :loading="logining">登录</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script type="text/ecmascript-6">
import { login } from '../api/userMG'
import { setCookie, getCookie, delCookie } from '../utils/util'
import md5 from 'js-md5'
export default {
name: 'login',
data() {
return {
//定义loading默认为false
logining: false,
// 记住密码
rememberpwd: false,
ruleForm: {
//username和password默认为空
username: '',
password: '',
code: '',
randomStr: '',
codeimg: ''
},
//rules前端验证
rules: {
username: [{ required: true, message: '请输入账号', trigger: 'blur' }],
password: [{ required: true, message: '请输入密码', trigger: 'blur' }],
// code: [{ required: true, message: '请输入验证码', trigger: 'blur' }]
}
}
},
// 创建完毕状态(里面是操作)
created() {
this.$message({
message: '账号密码及验证码不为空即可',
type: 'success'
})
// 获取图形验证码
// this.getcode()
// 获取存在本地的用户名密码
this.getuserpwd()
},
// 里面的函数只有调用才会执行
methods: {
// 获取用户名密码
getuserpwd() {
if (getCookie('user') != '' && getCookie('pwd') != '') {
this.ruleForm.username = getCookie('user')
this.ruleForm.password = getCookie('pwd')
this.rememberpwd = true
}
},
//获取info列表
submitForm(formName) {
this.$refs[formName].validate(valid => {
if (valid) {
this.logining = true
// 测试通道,不为空直接登录
// setTimeout(() => {
// this.logining = false
// this.$store.commit('login', 'true')
// this.$router.push({ path: '/goods/Goods' })
// }, 1000)
// 注释
login(this.ruleForm).then(res => {
// alert(res.status)
if (res.status === 201) {
if (this.rememberpwd) {
//保存帐号到cookie,有效期7天
setCookie('user', this.ruleForm.username, 7)
//保存密码到cookie,有效期7天
setCookie('pwd', this.ruleForm.password, 7)
} else {
delCookie('user')
delCookie('pwd')
}
//如果请求成功就让他2秒跳转路由
setTimeout(() => {
this.logining = false
// 缓存token
// localStorage.setItem('logintoken', res.data.token)
// 缓存用户个人信息
localStorage.setItem('userdata', JSON.stringify(res.data))
this.$store.commit('login', 'true')
this.$router.push({ path: '/goods/Goods' })
}, 1000)
} else {
this.$message.error(res.msg)
this.logining = false