Django+Vue 实现登录功能(elementUI,axios,Qs)前后端分离

2023-10-27

技术栈:

Django  vue  Element  webpack axios Qs

介绍:

利用django + vue 实现了 前后端分离 目前只实现了登录功能 后期项目将继续更新

实现步骤:

1创建Django项目

django-admin startproject pc_admin

2创建一个App作为项目的后台

python manage.py startapp backend

3使用vue-cli 创建一个名叫frontend 的vue 项目作为项目前端

vue-init webpack frontend

4在vue 中 创建一个 component 作为登录组件

<template>
  <div style="text-align: center">

    <el-form :model="ruleForm" status-icon :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm" style="width: 30%;display: inline-block">
      <el-form-item>
        <h1>登录</h1>
      </el-form-item>

      <el-form-item label="" prop="username">
        <el-input v-model="ruleForm.username" placeholder="请输入用户名"></el-input>
      </el-form-item>

      <el-form-item label="" prop="password">
        <el-input type="password" v-model="ruleForm.password" autocomplete="off" placeholder="请输入密码" ></el-input>
      </el-form-item>


      <el-form-item>
        <el-button type="primary" @click="submitForm('ruleForm')">登录</el-button>
        <el-button @click="resetForm('ruleForm')">重置</el-button>
      </el-form-item>
    </el-form>
  </div>
</template>

<script>
  import axios from 'axios';
  import Qs from 'qs';
  export default {
    data() {
      return {
        ruleForm: {
          username: '',
          password: '',
        },
        rules: {
          username:[
            // 当组件离开焦点的时候进行验证
            {required:true, message:'请输入用户名',trigger:'blur'}
          ],
          password:[
            {required:true, message:'请输入密码',trigger:'blur'}
          ]
        }
      };
    },
    methods: {
      submitForm(formName) {
        this.$refs[formName].validate((valid) =>{
          if (valid){
            const _this = this
            var data = Qs.stringify({"username":this.ruleForm.username,"password":this.ruleForm.password})
            axios.post("http://localhost:8080",data).then(
              function (resp) {
                const flag = resp.data.request['flag']
                if (flag == 'yes'){
                  // console.log(resp.data.request['flag'])
                  _this.$router.push("/index")
                }else {
                  alert("错误登录")
                }
              }
            )
            // 开始用的 axios 发送请求
            // console.log(this.ruleForm)
          }else {
            alert("验证错误")
          }
        })
      },
      resetForm(formName) {
        this.$refs[formName].resetFields();
      }
    }
  }
</script>

5其中引入了element_ui

引入的方式为

npm i element-ui

在src/main.js 中添加 如下配置

import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
Vue.use(ElementUI)

则上述的 el 代码可以出现效果

6进行路由配置

在进行路由配置之前 最好在 routes:[ ] 前加上 moded:‘hsitory’ 防止出现 路径出现 #

具体的路由配置如下

import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import Login from '@/components/Login'
import index from '@/components/index'
Vue.use(Router)

export default new Router({
  mode:'history',
  routes: [
    {
      path: '/',
      name: 'Login',
      component: Login
    },
    {
      path: '/index',
      name: 'index',
      component: index
    }
  ]
})

6 此时可进行前端调试

出现满意的效果之后可以写后台

7因为比较喜欢用mysql 所以先加上mysql 的配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'xxxxxxxxxxxxx', # 数据库
        'HOST' : '39.101.140.131',
        'PORT' : 3306,
        'USER':'root',
        'PASSWORD':'xxxxxxxxxxx'  #密码
    }
}

8添加vue 的静态路径 (webpack 打包可以默认出现dist 文件夹 )

# Add for vue.js
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "frontend/dist/static"),
]
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        # 'DIRS': [],
	    'DIRS':['frontend/dist'],
        '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',
            ],
        },
    },
]

9直接上后台代码 以为比较熟悉

# pc_admin/urls
from django.contrib import admin
from django.urls import path,include
from backend import urls as backend_urls
from django.views.generic.base import TemplateView

urlpatterns = [
    path('admin/', admin.site.urls),
	path(r'', include(backend_urls)),
]
# backend/url
from django.urls import path
from . import views

urlpatterns = [
	path("", views.login)
]

# backend/view
from . import models
from django.http import JsonResponse
# Create your views here.


def login(request):
	username = request.POST.get("username")
	password = request.POST.get("password")
	print(username)
	print(password)
	try:
		user = models.User.objects.get(username=username)
	except:
		date = {'flag': 'no', "msg" : "no to user"}
		return JsonResponse({'request':date})
	if password == user.password:
		date_msg = "登陆成功"
		date_flag = "yes"
		print("成功")
	else:
		date_msg = "密码输入错误"
		date_flag = "no"
	date = {'flag':date_flag,'msg': date_msg}

	return JsonResponse({'request': date})

登录方法 在安全性上还没有做太多考虑 后期会加密

10 做后台方法的测试 没有问题后进行前后台=端结合

11 进行跨域配置 setting

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
	'backend',
	'corsheaders', # 跨域配置1
]
MIDDLEWARE = [
	'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware', # 注意顺序  跨域配置二  两个中间件
    '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',
]
# 跨域配置三
#跨域增加忽略
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True
CORS_ORIGIN_WHITELIST = (
    'http://localhost:8080',
	'http://localhost:8082'
)

CORS_ALLOW_METHODS = (
    'DELETE',
    'GET',
    'OPTIONS',
    'PATCH',
    'POST',
    'PUT',
    'VIEW',
)

CORS_ALLOW_HEADERS = (
    'XMLHttpRequest',
    'X_FILENAME',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',
    'Pragma',
)

12 vue 进行跨域请求

import axios from 'axios';
import Qs from 'qs';

引入axios 是为了进行请求 引入Qs 是为了封装post请求发送的数据 封装为form-data

var data = Qs.stringify({"username":this.ruleForm.username,"password":this.ruleForm.password})

具体代码

<script>
  import axios from 'axios';
  import Qs from 'qs';
  export default {
    data() {
      return {
        ruleForm: {
          username: '',
          password: '',
        },
        rules: {
          username:[
            // 当组件离开焦点的时候进行验证
            {required:true, message:'请输入用户名',trigger:'blur'}
          ],
          password:[
            {required:true, message:'请输入密码',trigger:'blur'}
          ]
        }
      };
    },
      
    methods: {
       // 提交方法
      submitForm(formName) {
        // 检查是否拿到了正确的需要验证的form
        this.$refs[formName].validate((valid) =>{
          if (valid){
            const _this = this
            // 进行post 请求体的封装 在上面提到过
            var data = Qs.stringify({"username":this.ruleForm.username,"password":this.ruleForm.password})
            // axios 发送请求
            axios.post("http://localhost:8080",data).then(
              function (resp) {
                const flag = resp.data.request['flag']
                if (flag == 'yes'){
                  // console.log(resp.data.request['flag'])
                   // 请求成功后进行跳转 由于this 指向问题 加上了_this
                  _this.$router.push("/index")
                }else {
                  alert("错误登录")
                }
              }
            )
            // 开始用的 axios 发送请求
            // console.log(this.ruleForm)
          }else {
            alert("验证错误")
          }
        })
      },
      // 将填写的表单 置空
      resetForm(formName) {
        this.$refs[formName].resetFields();
      }
    }
  }
</script>

其中的this 指向问题是前端中老生常谈的问题 我的方法是指明this

13 跑起项目

python manage.py runserve 0:8080

npm run dev (根据package.json 以及vue 的版本)

14 GitHub 地址

https://github.com/ggkong/pc_admin
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django+Vue 实现登录功能(elementUI,axios,Qs)前后端分离 的相关文章

  • 如何在 Django 上发送重置密码电子邮件?

    在使用 Django 框架创建我的第一个网站的过程中 我遇到了一个小问题 目前还没有找到解决方案 因此 当用户想要重置他或她的密码时 我想向他 她发送一封重置邮件 到目前为止 我有这个 urls py from django contrib
  • 如何在 django 表单中设置自定义 HTML 属性?

    我有一个 Django 表单 它是页面的一部分 假设我有一个字段 search input forms CharField u Search word required False 我只能通过模板访问它 form search input
  • 放弃处理 无法处理视频 - Youtube API?

    我正在使用 youtube data v3 api 通过我的网站上传 mp4 视频 http post 请求如下所示 access token request session access token url https www googl
  • 为不同用户隐藏 Django 管理站点中的某些字段

    我有一个管理网站 需要向更多管理员开放 目前我的模型看起来像 class YouTube models Model name models CharField max length 100 credit card number models
  • 媒体文件上的 404 - Django

    昨晚我将项目上传到 pythonanywhere com 我想在那里测试我的项目生产设置 在我允许的模型之一中用户上传JPG 团队徽标 上传过程运行良好 文件位于我的 MEDIA ROOT 中 问题是 当我尝试在模板中访问它 以将其显示在页
  • MySQL - 通过部分单词匹配和相关性评分进行高效搜索(全文)

    如何进行 MySQL 搜索 既匹配部分单词 又提供准确的相关性排序 SELECT name MATCH name AGAINST math IN BOOLEAN MODE AS relevance FROM subjects WHERE M
  • Typescript + Jquery Ajax + 这个

    我正在将一些 javascript 代码移植到 typescript 中 但遇到了一个问题 我有一个 ajax 调用 它将一个对象作为上下文传递 该对象包含一些回调和一些其他信息 这些信息由成功或错误回调读出 指示成功调用应重定向到的位置
  • 如何针对具有参数的给定 url 调用带有参数的反向()?

    我有一个 django 模型定义为 from utils utils import APIModel from django db import models from django core urlresolvers import rev
  • 根据多行中的总分对 mysql 中的用户进行排名

    我有与这个问题中描述的非常相似的要求 mysql中的用户按积分排名 https stackoverflow com questions 34637943 rank users in mysql by their points 唯一的区别在于
  • 使用 AJAX 来回发送信息

    使用 post 你可以向服务器发送信息 但是当你需要从服务器接收信息时怎么办呢 信息如何从可以由 php 变量保存的方式变为可以由 javascript 变量保存的方式 反之亦然 这与您的问题更相关 http docs jquery com
  • 如何在 BigQuery/SQL 中将行转置为包含大量数据的列?

    我在将 BigQuery 中的大量数据表 15 亿行 从行转置为列时遇到问题 我可以弄清楚如何在硬编码时使用少量数据来完成此操作 但是对于如此大量的数据 该表的快照如下所示 CustomerID Feature Value 1 A123 3
  • 有什么好的适用于 Google App Engine 应用程序的 AJAX 框架吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试在我的 Google App Engine 应用程序中实现 AJAX 因此我正在寻找一个好的
  • 当子查询具有组列时,MySQL 8 不使用 INDEX

    我们刚刚从 mariadb 5 5 迁移到 MySQL 8 一些更新查询突然变得很慢 经过更多调查 我们发现当子查询有组列时 MySQL 8不使用索引 例如 下面是一个示例数据库 桌子users维护每种类型用户的当前余额 表 帐户 维护每天
  • 拖放图像上传在服务器上不起作用

    我正在尝试实现拖放图像上传 我在网上找到了一个相当简单的脚本并适合我的使用 在我的本地安装中 文件上传得很好 但在服务器上却不行 从我的调试尝试来看 SERVER HTTP X FILENAME 甚至没有被 php 设置 我尝试了以下方法
  • Session_set_save_handler 未设置

    我在设置 session set save handler 时遇到问题 我将 php ini 配置为 session handler user 这个简单的测试失败了 Define custom session handler if sess
  • ImproperlyConfigured at / 不允许空静态前缀 - Django

    我正在使用 Django 上传 显示图像 该网站部署在 Heroku 上 下列的this https coderwall com p bz0sng教程我能够成功上传图像 但是 图像并未显示在模板中 然后我了解到我的 urls py 末尾应该
  • Django 1.7:如何使用 html/css 文件作为模板发送电子邮件

    从 Django 1 7 开始 可以send email 使用新参数 html message 不幸的是 没有关于如何使用它的全面指南 新手友好 或者至少我找不到它 我需要使发送的电子邮件变得漂亮 因此 我试图弄清楚如何将我的消息包含到 h
  • HTMX 传递所选列表中的按钮值

    我正在尝试使用 Django 使用 htmx 制作一个应用程序 我创建了一个下拉列表
  • PHP - While/Else 错误? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我有以下
  • 通过jquery ajax()和serialize()提交html表单

    我想通过 jquery ajax 提交此表单 这是我所做的 但它不起作用 即表单正在提交并刷新页面 但我没有看到响应 即在同一页面上打印数组 HTML

随机推荐

  • 分治03--二叉搜索树和双向链表

    分治03 二叉搜索树和双向链表 jz26 题目概述 解析 参考答案 注意事项 说明 题目概述 算法说明 输入一棵二叉搜索树 将该二叉搜索树转换成一个排序的双向链表 要求不能创建任何新的结点 只能调整树中结点指针的指向 测试用例 输入 10
  • Thinkcmf 后台弹框页面代码

    thinkcmf是基于layer做的弹出层 https www layui com doc modules layer html 可以看layer的文档学习 选择信息 列表展示 html页面
  • Failed to remove the service because the service is running Stop the service and try again解决方法

    解决方法 Failed to remove the service because the service is running Stop the service and try again mysqld remove 报错 在Window
  • 微信回调 java_详解APP微信支付(java后台_统一下单和回调)

    1 微信配置信息 global properties 2 方法wxpay用于生成预支付订单信息 方法notifyWeiXinPay用于微信支付成功后的回调 注意 在手机端使用微信支付成功后 微信服务器会根据提供的回调地址进行回调 param
  • JavaWeb笔记:第07章 MVC

    JavaWeb笔记 第07章 MVC EL JST Filter Listener JQuery AJAX Maven JSON Redis Linux Nginx 1 MVC 开发模式 2 EL表达式 2 1 概念 作用 语法 2 2 E
  • Springboot初识--Bean的理解

    注解下的Spring Ioc Spring所提供的两个核心理念 一个是控制反转 Inversion of Control IoC 另一个是面向切面编程 Aspect Oriented Progarmming AOP IoC容器是spring
  • Mybatis中parameterType的用法

    在mybatis映射接口的配置中 有select insert update delete等元素都提到了parameterType的用法 parameterType为输入参数 在配置的时候 配置相应的输入参数类型即可 parameterTy
  • rsync安装及使用详细步骤

    目录 1 介绍rsync 2 rsync的安装以及操作方法 3 启动rsync 4 文件传输 5 效验 6 总结 rsync 是一个开源的命令行工具 用于在不同的主机之间同步文件和目录 它可以通过远程 shell 或 rsync 协议 默认
  • SQL语句学习系列(1)

    目录 查询语句 1 查询所有列的所有行 2 查询指定列的所有行 3 查询满足条件的行 4 查询满足多个条件的行 6 查询满足条件的行数 7 查询满足条件的唯一值 8 查询满足条件的分组统计 9 查询满足条件的平均值 10 查询满足条件的最大
  • C语言练习题(14) 有以下函数,该函数的功能是( )int fun(char *s) { char *t = s; while(*t++); return(t-s); }(非常详细的讲解)

    1 有以下函数 该函数的功能是 int fun char s char t s while t return t s A 比较两个字符的大小 B 计算s所指字符串占用内存字节的个数 C 计算s所指字符串的长度 D 将s所指字符串复制到字符串
  • 深入研究源码:Android10.0系统启动流程(三):Zygote

    前言 研究过程中参考了很多的文章 这篇源码分析 可能是全网最全的Zygote源码分析了 如果觉得这篇源码分析太干 也可以先看一下后续的相关总结 戳https juejin im post 6844903966665539591 全文概览 我
  • java项目的心得,java项目的代码层次的架构划分

    java项目使用的架构是ssm Spring SpringMVC MyBatis 一 后台代码一般分三层 Controller Service Dao 1 Controller层是对前端或者接口的响应一个逻辑处理的层 这个层级一般调用的是S
  • 3、MyBatisPlus的CRUD 接口

    MyBatisPlus的CRUD 接口 一 insert 1 插入操作 2 主键策略 二 update 1 根据Id更新操作 2 自动填充 3 乐观锁 三 select 1 根据id查询记录 2 通过多个id批量查询 3 简单的条件查询 4
  • Nor flash 页写地址与数据大小的限制

    厂商提供的flash手册如下 如果页写指令的地址不是256的整数倍 并且写入的数据量超过了当前地址所在页的边界 则超过的那些数据会重新写入当前页的首地址 即256的整数倍地址 所以 在进行页写的时候 要注意这个限制 跨页写数据时注意分多个页
  • JAVA验证数字的整数位长度及小数据位长度

    文章目录 一 案例说明 二 使用步骤 1 引入库 2 读入数据 一 案例说明 验证数字的整数位长度及小数据位长度 二 使用步骤 1 引入库 代码如下 示例 import java util regex Matcher import java
  • 9、无须光照的模型假阴影实现 URP

    模型阴影 我们在实际项目中 经常会有模型影子的需求 这个时候如果使用光照的话 在移动端性能消耗太大 如果使用一个假的阴影片 效果又不太好 我们希望有能够有和灯光系统一样的阴影效果 我们通过模拟灯光的方式来实现 之前我们写的shader都是对
  • USB设备开发---- usb描述符概述

    说到USB设备 不得不提到各种描述符 descriptors 一般来说 描述符有如下几种 1 设备描述符 Device Descriptors 2 配置描述符 Configuration Descriptors 2 接口描述符 Interf
  • 图和带权图(数据结构13-14章——读书笔记)

    一 图 在计算机程序设计中 图是最常用的结构之一 一般来说 用图来帮助解决的问题类型与本书中已经讨论过的问题类型有很大差别 如果处理一般的数据存储问题 可能用不到图 但对某些问题 图是必不可少的 1 1 图简介 图是一种与树有些相像的数据结
  • java中很实用的快捷键

    Windows下eclipse 1 ctrl shift o 自动引入包和删除无用包 2 ctrl shift x和ctrl shift y 英文字母大小写的转换 3 ctrl d 删除当前行 删除当前行 4 ctrl shift 自动注释
  • Django+Vue 实现登录功能(elementUI,axios,Qs)前后端分离

    技术栈 Django vue Element webpack axios Qs 介绍 利用django vue 实现了 前后端分离 目前只实现了登录功能 后期项目将继续更新 实现步骤 1创建Django项目 django admin sta