django rest framework vue 实现用户登录详解

作者:Blue·Sky 时间:2022-04-15 00:53:52 

后端代码就不介绍了,可以参考 django rest framework 实现用户登录认证

这里介绍一下前端代码,和前后端的联调过程

在components下新建login.vue 文件


<template>
<div class="login">
 <el-form label-width="80px">
 <el-form-item label="用户名">
  <el-input v-model="form.username"></el-input>
 </el-form-item>
 <el-form-item label="密码">
  <el-input v-model="form.password" type="password"></el-input>
 </el-form-item>
 <el-form-item>
  <el-button type="primary" @click="onLogin">登录</el-button>
  <el-button>取消</el-button>
 </el-form-item>
 </el-form>
</div>
</template>

<script>
import axios from 'axios';
export default {
name: "login",
data() {
return {
 form: {
 username: null,
 password: null
 }
}
},
methods: {
onLogin() {
 axios.post('http://127.0.0.1:8000/api/v1/auth/',this.form,{withCredentials:true}).then((res)=> {
 console.log(res);
 this.$router.go({path:'/'});
 });
}
}
}
</script>

<style scoped>
.login {
width: 50%;
margin: 0 auto;
}
</style>

修改rounter下index.js


import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import test from '@/components/test'
import runoob from '@/components/runoob'
import vhtml from '@/components/vhtml'
import Login from '@/components/login'
Vue.use(Router)

var router = new Router({
routes: [
{
 path: '/',
 name: 'HelloWorld',
 component: HelloWorld
},
{
 path: '/test',
 name: 'test',
 component: test
}
,
{
 path: '/login',
 name: 'login',
 component: Login
}
,
{
 path: '/runoob',
 name: 'runoob',
 component: runoob
},
{
 path: '/vhtml',
 name: 'vhtml',
 component: vhtml
},
]
})
router.beforeEach((to,from,next)=> {
if(to.path==='/login') {
window.hideLogin = false;
}
// if(!window.token&&to.path!=='/login') {
// router.go('/login');
// }else {
// next();
// }
next();
})
export default router;

修改项目 man.js


// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'
import ElementUI from 'element-ui'
import axios from 'axios'
Vue.prototype.axios = axios

Vue.config.productionTip = false

Vue.use(ElementUI); // 引入elementui

/* eslint-disable no-new */
new Vue({
el: '#app',
router,
components: { App },
template: '<App/>'
})

启动项目 npm run dev

django rest framework vue 实现用户登录详解

输入url,访问查看页面

django rest framework vue 实现用户登录详解

启动服务端

django rest framework vue 实现用户登录详解

浏览器打开检查功能

数据用户名和密码,点击登录 如下图。

django rest framework vue 实现用户登录详解

因为还没做登录跳转页。所以 先通过这种方式,检验是否登录成功。

查看后台返回信息

django rest framework vue 实现用户登录详解

遇到的问题:

1、跨域问题

因为vue 和django项目是两个前后端独立的项目,分别启动后,存在端口不一致的跨域问题。

如这里vue端口是8080,django 是8000,会一直存在找不到服务的问题。

解决方法:修改jango settings.py 文件

首先安装 corsheaders


# 安装
pip install django-cors-headers

# 添加 corsheaders 应用
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'api',
'corsheaders', # 解决跨域问题 修改1
]

# 中间层设置
# 添加如下
MIDDLEWARE = [
...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
]

# CORS 设置跨域域名 配置白名单
CORS_ORIGIN_WHITELIST = [
"https://example.com",
"https://sub.example.com",
"http://localhost:8080",
"http://localhost:8000",
"http://127.0.0.1:8000"
]

#直接允许所有主机跨域

CORS_ORIGIN_ALLOW_ALL = True 默认为False

CORS_ALLOW_CREDENTIALS = True # 允许携带cookie

# 下面这两个设置 经测试无用
#
# # 解决跨域问题 修改5
# CORS_ALLOW_METHODS = (
#  'DELETE',
#  'GET',
#  'OPTIONS',
#  'PATCH',
#  'POST',
#  'PUT',
#  'VIEW',
# )
# # 解决跨域问题 修改6
# CORS_ALLOW_HEADERS = (
#  'XMLHttpRequest',
#  'X_FILENAME',
#  'accept-encoding',
#  'authorization',
#  'content-type',
#  'dnt',
#  'origin',
#  'user-agent',
#  'x-csrftoken',
#  'x-requested-with',
#  'Pragma',
# )

settings.py文件


"""
Django settings for logintest project.
Generated by 'django-admin startproject' using Django 2.1.2.
For more information on this file, see
https://docs.djangoproject.com/en/2.1/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.1/ref/settings/
"""
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'zj9a#c4al&@_up8^g46ke44a1l%p^_wa1_5xgx60ertwu9$y(%'
# SECURITY WARNING: don't run with debug turned on in production!
# DEBUG = True
DEBUG = False
ALLOWED_HOSTS = ['localhost', '127.0.0.1']
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'api',
'corsheaders', # 解决跨域问题 修改1
]
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',
'corsheaders.middleware.CorsMiddleware', # 解决跨域问题 修改2
'django.middleware.common.CommonMiddleware', # 注意顺序 解决跨域问题 修改3
]
ROOT_URLCONF = 'logintest.urls'
#
# #跨域增加忽略 修改4
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True
# # CORS_ORIGIN_WHITELIST = (
# #  '*'
# # )
CORS_ORIGIN_WHITELIST = [
"https://example.com",
"https://sub.example.com",
"http://localhost:8080",
"http://localhost:8000",
"http://127.0.0.1:8000"
]
#
#
# # 解决跨域问题 修改5
# CORS_ALLOW_METHODS = (
#  'DELETE',
#  'GET',
#  'OPTIONS',
#  'PATCH',
#  'POST',
#  'PUT',
#  'VIEW',
# )
# # 解决跨域问题 修改6
# CORS_ALLOW_HEADERS = (
#  'XMLHttpRequest',
#  'X_FILENAME',
#  'accept-encoding',
#  'authorization',
#  'content-type',
#  'dnt',
#  'origin',
#  'user-agent',
#  'x-csrftoken',
#  'x-requested-with',
#  'Pragma',
# )
TEMPLATES = [
{
 'BACKEND': 'django.template.backends.django.DjangoTemplates',
 # 'DIRS': [],
 'DIRS': ['vuefront/dist'], # 修改1
 'APP_DIRS': True,
 'OPTIONS': {
  'context_processors': [
   'django.template.context_processors.debug',
   'django.template.context_processors.request',
   'django.contrib.auth.context_processors.auth',
   'django.contrib.messages.context_processors.messages',
  ],
 },
},
]
# 新增2
# Add for vue.js
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "vuefront/dist/static"),
]
WSGI_APPLICATION = 'logintest.wsgi.application'
# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases

# DATABASES = {
#  'default': {
#   'ENGINE': 'django.db.backends.sqlite3',
#   'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
#  }
# }
# MySQL adil 密码:helloyyj
DATABASES = {
'default':{
 'ENGINE':'django.db.backends.mysql',
 'HOST':'127.0.0.1',
 'PORT':'3306',
 'NAME':'pyweb', # 数据库名
 'USER':'adil',
 'PASSWORD':'helloyyj',
 'OPTIONS':{
  'sql_mode': 'traditional'
 },
}
}
# Password validation
# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
{
 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/2.1/topics/i18n/
# LANGUAGE_CODE = 'en-us'
#
# TIME_ZONE = 'UTC'
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/
STATIC_URL = '/static/'

更多设置可以参考  https://github.com/ottoyiu/django-cors-headers/

2、ESlint代码检测,启动vue时系统报错错误警告

解决方式

1、如果对自己信不过。最好的办法就是创建项目的时候不要ESlint 直接N

django rest framework vue 实现用户登录详解

2、注释掉ESlint

在自己的项目目录下build.js——webpack.base.conf.js文件里面有段代码注释掉就行

django rest framework vue 实现用户登录详解

来源:https://www.cnblogs.com/BlueSkyyj/p/11214122.html

标签:django,rest,framework,vue,用户,登录
0
投稿

猜你喜欢

  • Python安装依赖(包)模块方法详解

    2023-11-02 15:38:01
  • WAP2.0网页设计中的交互细节

    2010-08-12 20:50:00
  • 用Asp修改注册表

    2008-01-04 12:33:00
  • 对python同一个文件夹里面不同.py文件的交叉引用方法详解

    2023-12-24 00:54:27
  • python开发的小球完全弹性碰撞游戏代码

    2023-11-01 07:47:11
  • python 实现检验33品种数据是否是正态分布

    2022-09-25 19:57:55
  • 更改Python的pip install 默认安装依赖路径方法详解

    2023-01-05 20:55:28
  • python 爬虫 实现增量去重和定时爬取实例

    2022-01-26 01:01:37
  • go语言实现markdown解析库的方法示例

    2023-06-20 07:37:32
  • 教你用python控制安卓手机

    2023-11-10 10:13:39
  • 详解python配置虚拟环境

    2021-08-02 22:02:50
  • asp当中判断函数一览

    2010-05-27 12:15:00
  • python清除字符串中间空格的实例讲解

    2023-12-29 22:40:24
  • python中实现指定时间调用函数示例代码

    2021-04-20 07:14:25
  • python jinjia2的项目使用

    2021-03-16 04:57:21
  • Python filter过滤器原理及实例应用

    2021-03-20 13:11:13
  • 自动定时备份sqlserver数据库的方法

    2011-11-03 17:28:17
  • .Net Core下使用Dapper的方法

    2023-07-16 17:19:17
  • 一文讲解如何查看python脚本所依赖三方包及其版本

    2022-09-17 22:51:04
  • python3+selenium自动化测试框架详解

    2022-01-29 18:26:01
  • asp之家 网络编程 m.aspxhome.com