django+vue项目搭建实现前后端通信

下面让我来详细讲解一下如何使用 Django 和 Vue.js 搭建前后端通信的完整攻略。

1. 准备工作

在开始之前,需要确保本地已经安装了以下软件:
- Python 3
- pipenv 或 virtualenv
- Node.js
- Vue CLI

2. 后端 Django 项目搭建

首先需要创建一个 Django 项目,可以直接使用命令行创建:

django-admin startproject myproject

接着创建一个应用:

python manage.py startapp myapp

在项目中安装 Django REST framework 和 django-cors-headers ,这两个库分别用于快速构建 RESTful API 和处理跨域资源共享请求。

pipenv install djangorestframework
pipenv install django-cors-headers

myproject/settings.py 中添加以下内容:

INSTALLED_APPS = [
    # ...
    'rest_framework',
    'corsheaders',
]

MIDDLEWARE = [
    # ...
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
]

CORS_ORIGIN_ALLOW_ALL = True

然后在 myapp/views.py 中编写一个示例 API:

from rest_framework.decorators import api_view
from rest_framework.response import Response

@api_view(['GET'])
def hello(request):
    return Response({'message': 'Hello World!'})

myapp/urls.py 中添加以下内容:

from django.urls import path
from .views import hello

urlpatterns = [
    path('hello/', hello),
]

3. 前端 Vue 项目搭建

在开始前端项目之前,需要确保已经安装了 Vue CLI ,可以使用以下命令全局安装:

npm install -g @vue/cli

在命令行中使用以下命令创建一个基于 webpack 模板的 Vue 项目:

vue init webpack myvueapp

创建完毕后安装必要的库:

cd myvueapp
npm install axios
npm install vuex --save

4. 前后端通信

为了在前端使用此 API ,需要使用 axios 发送 HTTP 请求,并处理响应。

在 Vue 中,可以将 HTTP 请求封装在一个公共服务对象(src/services/ApiService.js),如下所示:

import axios from 'axios'

const API_URL = 'http://localhost:8000/api'; // Django API URL

class ApiService {
  get(url) {
    const headers = { 'Content-Type': 'application/json' }
    return axios.get(`${API_URL}/${url}`, { headers })
  }
}

export default new ApiService()

接着在 Vuex 存储中使用这个服务对象,如下所示:

import Vue from 'vue'
import Vuex from 'vuex'
import ApiService from '@/services/ApiService'

Vue.use(Vuex)

const state = {
  message: ''
}

const mutations = {
  setMessage(state, data) {
    state.message = data
  }
}

const actions = {
  fetchMessage({ commit }) {
    return ApiService.get('hello/')
      .then(response => {
        commit('setMessage', response.data.message)
      })
  }
}

export default new Vuex.Store({
  state,
  mutations,
  actions
})

最后在 Vue 组件中使用该存储对象,如下所示:

<template>
  <div class="hello">
    <h1>{{ message }}</h1>
  </div>
</template>

<script>
    import { mapState, mapActions } from 'vuex'

    export default {
      name: 'Hello',
      computed: mapState(['message']),
      methods: mapActions(['fetchMessage']),
      created() {
        this.fetchMessage()
      }
    }
</script>

在以上示例中,代码展示了如何在 Vue 中使用 axios 获取来自 Django API 的信息,并存储该信息到 Vuex 存储中,最终在 Vue 组件中渲染展示。

5. 示例说明

下面是两个使用 Django 和 Vue.js 搭建前后端通信的示例:

示例一:TodoList

在这个示例中,我们将创建一个 Todo List 回应 API,然后在 Vue 中使用此 API 获取 Todo 列表并展示。

首先创建 Django API:

from django.http import JsonResponse

todos = ['Todo 1', 'Todo 2', 'Todo 3']

def todo_list(request):
    return JsonResponse({'todos': todos})

接着在 Vue 组件中展示 TodoList:

<template>
  <div class="todolist">
    <ul>
      <li v-for="todo in todos" :key="todo">{{ todo }}</li>
    </ul>
  </div>
</template>

<script>
    import { mapState, mapActions } from 'vuex'

    export default {
      name: 'TodoList',
      computed: mapState(['todos']),
      methods: mapActions(['fetchTodos']),
      created() {
        this.fetchTodos()
      }
    }
</script>

在 Vuex 存储中处理 Todos:

import Vue from 'vue'
import Vuex from 'vuex'
import ApiService from '@/services/ApiService'

Vue.use(Vuex)

const state = {
  todos: []
}

const mutations = {
  setTodos(state, data) {
    state.todos = data
  }
}

const actions = {
  fetchTodos({ commit }) {
    return ApiService.get('todo-list/')
      .then(response => {
        commit('setTodos', response.data.todos)
      })
  }
}

export default new Vuex.Store({
  state,
  mutations,
  actions
})

示例二:登录和认证

在这个示例中,我们将创建一个用户登录和认证回应 API,在 Vue 组件中,用户输入他们的凭证和密码,然后将这些信息提交到 Django API 完成用户认证。

开始创建 Django API:

from django.contrib.auth import authenticate, login
from django.http import JsonResponse

def login_user(request):
    username = request.POST.get('username')
    password = request.POST.get('password')
    user = authenticate(request, username=username, password=password)

    if user is not None:
      login(request, user)
      return JsonResponse({'message': 'Authenticated'})
    else:
      return JsonResponse({'message': 'Not authenticated'})

接着在 Vue 上面创建登录和认证表单:

<template>
  <div class="login-form">
    <form>
      <input type="text" placeholder="Username" v-model="username" />
      <input type="password" placeholder="Password" v-model="password" />
      <button type="submit" @click.prevent="submitForm">Login</button>
    </form>
  </div>
</template>

<script>
    import { mapState, mapActions } from 'vuex'

    export default {
      name: 'LoginForm'
      data() {
        return {
          username: '',
          password: ''
        }
      },
      methods: {
        ...mapActions(['login']),
        submitForm() {
          this.login({ username: this.username, password: this.password })
        }
      }
    }
</script>

最后在 Vuex 存储中处理登录和认证:

import Vue from 'vue'
import Vuex from 'vuex'
import ApiService from '@/services/ApiService'

Vue.use(Vuex)

const state = {
  authenticated: false
}

const mutations = {
  setAuthenticated(state, data) {
    state.authenticated = data
  }
}

const actions = {
  login({ commit }, { username, password }) {
    return ApiService.post('login/', { username, password })
      .then(response => {
        if (response.data.message === 'Authenticated') {
          commit('setAuthenticated', true)
        }
      })
  }
}

export default new Vuex.Store({
  state,
  mutations,
  actions
})

以上示例介绍了如何使用 Django 和 Vue.js 搭建前后端通信,您可以根据您的需求进一步拓展,希望这篇攻略对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:django+vue项目搭建实现前后端通信 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • Vue3响应式对象Reactive和Ref的用法解读

    Vue3响应式对象Reactive和Ref的用法解读 什么是Vue3的响应式对象? Vue3中的响应式对象是指一种特殊的JavaScript对象,它可以被Vue3追踪其变化并进行响应式渲染。在Vue2中,响应式数据的实现是通过ES5提供的Object.defineProperty()方法来实现的,而在Vue3中,响应式数据的实现则是依赖于ES6中的Proxy…

    Vue 2023年5月28日
    00
  • 在vue中使用防抖函数组件操作

    在 Vue 中使用防抖函数组件操作的完整攻略如下: 1. 防抖函数的定义 防抖函数是指在一段时间内,如果短时间内连续多次触发同一个函数,只执行最后一次触发的函数,而忽略之前的所有触发操作。它的作用是减少函数执行的频率,避免过度渲染或者频繁请求造成服务器的负担。 通常防抖函数的实现方法有两种,一是通过 setTimeout,一是通过 Promise。 以下是使…

    Vue 2023年5月28日
    00
  • Vue组件之非单文件组件的使用详解

    下面我将为您详细讲解“Vue组件之非单文件组件的使用详解”的完整攻略。 什么是非单文件组件? 非单文件组件是指将组件的HTML、JS、CSS等代码都写在同一个文件中,并使用Vue.extend()方法将其构造成组件的一种方式。这种方式比较旧,但在一些老的Vue项目中仍有应用。目前Vue的官方文档已经不推荐使用这种方式。 非单文件组件的优缺点 优点 代码简单。…

    Vue 2023年5月28日
    00
  • 一文带你了解vue3.0响应式

    一文带你了解Vue3.0响应式 Vue 3.0是当前最新版本的Vue框架,它提供了更快速的性能和更好的可维护性,其中最引人注目的改进之一是对响应式系统的改进。Vue 3.0中的响应式系统被重新设计,会给开发者带来全新的开发体验。本文将为你详细介绍Vue 3.0的响应式系统,包括如何创建响应式数据、如何在应用程序中使用响应式数据、以及Vue 3.0中新增的一些…

    Vue 2023年5月27日
    00
  • 一文详解uniapp中如何使用easycom自定义组件

    一、概述 easycom是基于uni-app框架开发的自定义组件解决方案,可以帮助开发者在uni-app中快速开发自定义组件。本篇文章将详细讲解如何使用easycom自定义组件。 二、准备工作 在进行easycom自定义组件之前,需要先安装“uni-center-cli”、 “vue-cli-plugin-easycom”和“easycom-cli”三个插件…

    Vue 2023年5月28日
    00
  • vue实现公共方法抽离

    下面是“Vue实现公共方法抽离”的完整攻略,其中包含两个示例。 1. 需求背景 在Vue项目中,有一些公共方法会被多个组件共用,为了避免代码冗余,我们需要将这些公共方法抽离出来,然后挂载到Vue的prototype上,以便全局调用。 2. 具体实现步骤 2.1 抽离公共方法 将多个组件中共用的方法,抽离出来,建议以模块化的方式管理。下面是一个示例,假设我们将…

    Vue 2023年5月28日
    00
  • 使用Vue-cli3.0创建的项目 如何发布npm包

    下面我将详细讲解使用Vue-cli3.0创建的项目如何发布npm包的完整攻略。 1. 创建Vue-cli3.0项目 使用Vue-cli3.0创建一个Vue项目,可以通过以下命令进行创建: vue create my-project 该命令会在当前目录下创建一个名为my-project的Vue项目。 2. 编写组件 在my-project项目中,使用Vue框架…

    Vue 2023年5月28日
    00
  • Vue项目中使用jsonp抓取跨域数据的方法

    使用jsonp抓取跨域数据是前端开发中常用的一种方法,而在Vue项目中使用jsonp抓取跨域数据则需要注意一些细节。下面是Vue项目中使用jsonp抓取跨域数据的完整攻略: 1.概述 前端的同学们都知道,由于浏览器的同源策略限制,导致 Ajax 请求不能跨域。而 JSONP 是一种跨域请求的解决方案,可以通过 script 标签来实现跨域请求。Vue.js …

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部