1. 正文
在本文中,我们将讨论使用Django和Vue.js构建单页应用程序(SPA)的示例。Django是一种基于Python的Web框架,而Vue.js是一种JavaScript框架,专注于构建用户界面(UI)。
1.1 Djang
我们将从Django开始。Django是一种MVC框架,这意味着它将应用程序分为Model(模型)、View(视图)和Controller(控制器)。 它还具有内置的ORM(对象关系映射),使得将应用程序与数据库进行交互变得更加容易。 ORM还将使得在我们代码中进行数据库更改变得很容易,因为它们更像是使用Python编写的代码而不是SQL语句。
我们将使用Django来构建我们的后端,并将它连接到前端Vue.js框架。 我们将使用Django REST框架,它是将Django转化为RESTful API的扩展。尽管不一定需要使用Django REST框架构建我们的API,但它是一种流行的选择,因为它可以快速生成模型(以及模型之间的关系),并为我们的API自动生成文档。
我们可以使用命令行安装Django REST框架,它会自动下载Django和其他必要的依赖项。在命令行输入以下命令,启动Django项目:
pip install djangorestframework
现在,我们已经成功安装了Django REST框架,我们可以创建一个新的Django项目并添加REST框架。我们将创建一个名为mysite的新Django项目:
django-admin startproject mysite
在安装完成后,我们将在settings.py文件中添加REST框架。 我们将首先添加'rest_framework'到INSTALLED_APPS列表中。 然后,我们将设置REST框架的默认配置:
INSTALLED_APPS = [
# ...
'rest_framework',
]
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.AllowAny',
],
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.SessionAuthentication',
],
}
尝试运行服务器,确保一切都可以正常工作:
python manage.py runserver
现在,我们已经成功安装了Django REST框架,并已经创建了一个新的Django项目,我们可以开始将前端Vue.js框架与后端Django项目连接起来。
1.2 Vue.js
Vue.js是一种专注于UI的JavaScript框架。 Vue.js被设计为可以轻松与其他框架和库协同工作,包括React和Angular等框架。 Vue.js的主要目标是提供一种简单的方式来将UI组件化,并将这些组件与其他组件组合在一起。
我们将使用Vue.js来构建我们的前端,并将它连接到我们的Django后端。我们将使用Vue.js CLI来快速生成Vue.js应用程序。在命令行输入以下命令,安装Vue.js CLI工具:
npm install -g vue-cli
创建一个新的Vue.js项目,并链接到我们的Django后端:
vue create myproject
cd myproject
npm install axios --save
使用编辑器打开src / main.js文件,我们将关键的部分添加到Vue.js项目中。 我们将添加以下代码:
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import axios from 'axios'
Vue.config.productionTip = false
new Vue({
router,
render: h => h(App),
created() {
const token = localStorage.getItem('token')
if (token) {
axios.defaults.headers.common['Authorization'] = `Token ${token}`
}
}
}).$mount('#app')
我们还需要在src / router.js文件中添加路由器。 我们将添加以下代码:
import Vue from 'vue'
import Router from 'vue-router'
import Home from './views/Home.vue'
import Login from './views/Login.vue'
import Register from './views/Register.vue'
Vue.use(Router)
export default new Router({
mode: 'history',
routes: [
{
path: '/',
name: 'home',
component: Home
},
{
path: '/login',
name: 'login',
component: Login
},
{
path: '/register',
name: 'register',
component: Register
}
]
})
现在,我们已经成功建立了Django后端和Vue.js前端之间的连接。
1.3 示例应用程序
现在我们将创建一个示例应用程序,它将显示所有用户并允许注册新用户。 我们将使用DRF的Serializers和Views构建我们的API,并使用Vue.js构建我们的前端。
首先,让我们创建一个Django应用程序,该应用程序将处理我们的用户数据:
python manage.py startapp users
现在,我们将在users(新建应用程序) / models.py文件中定义用户模型。 我们将添加以下代码:
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
pass
现在,我们将在users(新建应用程序) / serializers.py文件中定义该用户模型的序列化器。 我们将添加以下代码:
from rest_framework import serializers
from .models import User
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'email')
现在,我们将在users(新建应用程序) / views.py文件中定义我们的用户视图。 视图将处理所有关于用户的请求。 我们将添加以下代码:
from django.shortcuts import render
from rest_framework import generics
from .models import User
from .serializers import UserSerializer
class UserList(generics.ListCreateAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
class UserDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
接下来我们需要在mysite(Django项目) / urls.py文件中将该视图添加到我们的路由中。 我们将添加以下代码:
from django.contrib import admin
from django.urls import path, include
from rest_framework.authtoken.views import obtain_auth_token
from users.views import UserList, UserDetail
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('rest_framework.urls')),
path('api-token-auth/', obtain_auth_token, name='api_token_auth'),
path('users/', UserList.as_view(), name='user_list'),
path('users//', UserDetail.as_view(), name='user_detail')
]
使用命令行创建Vue.js相关组件。我们将创建视图组件,它们将显示所有用户并允许用户注册:
vue generate view UserList
vue generate view UserDetail
vue generate view Register
接下来,让我们在src / components目录下创建一个名为Api.js的文件。它将包含所有与Django后端通信的功能。 在文件中添加以下JavaScript代码:
import axios from 'axios'
export default () => {
return axios.create({
baseURL: 'http://localhost:8000'
})
}
现在,我们将在src / views / Register.vue组件中添加以下代码。 它将启动用户注册UI:
import Api from '@/components/Api'
export default {
name: 'Register',
data () {
return {
user: {
username: '',
email: '',
password: ''
}
}
},
methods: {
registerUser () {
Api().post('/users/', this.user)
.then(response => {
localStorage.setItem('token', response.data.token)
this.$router.push('/')
})
.catch(error => console.log(error))
}
}
}
现在,我们将在src / views / UserList.vue组件中添加以下代码。 它将显示所有用户:
User List
{{ user.username }} - {{ user.email }}
import Api from '@/components/Api'
export default {
name: 'UserList',
data () {
return {
users: []
}
},
created () {
Api().get('/users/')
.then(response => {
this.users = response.data
})
.catch(error => console.log(error))
}
}
最后,我们将在src / App.vue文件中添加以下代码。 它将展示我们的用户UI,并将所有的Vue.js路由与我们的应用连接起来:
import Api from '@/components/Api'
export default {
name: 'App',
data () {
return {
authenticated: false
}
},
created () {
const token = localStorage.getItem('token')
if (token) {
Api().get('/auth/users/me/')
.then(() => {
this.authenticated = true
})
.catch(() => {
this.authenticated = false
localStorage.removeItem('token')
})
}
},
methods: {
logoutUser () {
localStorage.removeItem('token')
this.authenticated = false
this.$router.push('/')
}
}
}
现在,我们已经成功构建了一个单页应用程序(SPA)示例,使用Django和Vue.js连接。