PYTHON August 20, 2018

linux下django+vue.js环境搭建及项目构建

Words count 17k Reading time 16 mins. Read count 0

一、环境搭建

python: 2.7.5

django: 1.11.7

node: 8.5.0

mysql: 5.7

1. 安装python

centos下默认已经安装了python

2. 安装 node.js

下载安装包 版本地址

wget https://nodejs.org/dist/v8.5.0/node-v8.5.0-linux-x64.tar.gz

解压

tar zxvf node-v8.5.0-linux-x64.tar.gz

配置环境变量/etc/profile

export NODE_HOME="/root/node-v8.5.0-linux-x64"
export PATH=$PATH:$NODE_HOME/bin

使修改后的文件生效

source /etc/profile

查看安装情况

node -v
npm -v

3. 安装mysql

安装mysql源

wget http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
rpm -ivh mysql57-community-release-el7-9.noarch.rpm

安装

yum install mysql-community-server

启动mysql

service mysqld start

查看初始密码

grep 'temporary password' /var/log/mysqld.log

使用初始密码登录

mysql -u root -p //回车,然后输入上一步查到的初始密码

更改初始密码

ALTER USER 'root'@'localhost' IDENTIFIED BY '123456Aa?';

创建名为config_tool的数据库

mysql> create database config_tool;
Query OK, 1 row affected (0.00 sec)

4. 安装pip

yum install python-pip

如果yum源中没有这个安装包,需要安装epel扩展源,然后再尝试安装

yum -y install epel-release

5. 安装Django

pip install Django==1.11.7
# 查看django版本
python -m django --version

6. 安装vue-cli

安装cnpm

安装npm淘宝源cnpm:在cmd下运行

​```
npm install -g cnpm --registry=https://registry.npm.taobao.org
​```

安装vue-cli

//安装全局的vue-cli命令行工具
cnpm install -g vue-cli

7.安装samba服务

由于是环境是在linux虚拟机上,我们需要在windows下开发,这时候就需要用到samba服务来共享数据。

检查是否安装

#rpm -qa | grep samba

未安装的话,执行安装命令

yum install samba

重启smb服务

service smb restart

在Linux上建立samba用户

useradd samba

创建Smb用户,此用户必须是Linux上已经建立的,输入密码,完成即可

smbpasswd -a root

注意:smbpasswd -a 是添加用户的意思 后面跟的是用户名,此用户名一定要跟linux登录用户名一样。smbpasswd -x 用户名 :是删除用户的意思

添加共享目录到samba,修改/etc/samba/smb.conf

[indta_dev]
        path = /root/indata_dev
        browsable=yes
        writable=yes
        guest ok=yes
        read only=no

重启samba服务

在windos下打开计算机,在导航栏输入 \\192.168.162.111

输入用户名和密码,然后右击indata_dev目录,选择映射到网络磁盘驱动器,然后点击【完成】

8.关闭防火墙

systemctl stop firewalld
systemctl disable firewalld
systemctl is-enabled firewalld
改/etc/selinux/config文件中设置SELINUX=disabled

二、构建项目

构建Django项目

1. 创建项目

在指定目录下创建一个名字为indata_dev的项目

django-admin startproject indata_dev

2. 创建APP

切换到上一步创建的项目indata_dev目录下

cd indata_dev

然后创建利用下面的命令创建一个名为 indata_tool_api 的app

python manage.py startapp indata_tool_api

目录结构:

3.配置数据库

django默认配置的数据库是 sqlite3,这个数据库无需安装配置,直接就可以用,但是不支持并发操作,性能上不如mysql。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

所以我们选用mysql数据库,配置在 indata_dev/settiongs.py里,如下图所示:

name 为数据库的名字,user 为mysql的用户名,password为msql用户密码 host,host是主机地址

# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'config_tool',
        'USER': 'root',
        'PASSWORD': '123456Aa?',
        'HOST': 'localhost',
    }
}

4. 添加app到列表

把创建的 indata_tool_api 加入到 settings.py中的 INSTALLED_APPS列表里

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'indata_tool_api'
]

5. 创建测试model

在indata_tool_api目录下的models.py里我们写一个测试model 如下:

# -*- coding: utf-8 -*-
from django.db import models


# Create your models here.

class TestModel(models.Model):
   model_name = models.CharField(max_length=64)
   add_time = models.DateTimeField(auto_now_add=True)

6.创建测试方法

在indta_tool_api 目录下的views.py里创建两个测试方法如下:

# -*- coding: utf-8 -*-
from django.http import JsonResponse
from indata_tool_api.models import TestModel


def add_model(request):
    model_name = request.GET.get('model_name')
    response = {}
    try:
        test_model = TestModel(model_name=model_name)
        test_model.save()
        response['msg'] = 'success'
        response['error_num'] = 0
    except Exception, e:
        response['msg'] = str(e)
        response['error_num'] = 1

    return JsonResponse(response)


def show_models(request):
    response = {}
    try:
        test_model = TestModel.objects.values()
        response['list'] = list(test_model)
        response['msg'] = 'success'
        response['error_num'] = 0
    except Exception, e:
        response['msg'] = str(e)
        response['error_num'] = 1

    return JsonResponse(response)

7.配置URL

在app目录下创建一个urls.py的文件

from django.conf.urls import url, include
from indata_tool_api import views

urlpatterns = [
url(r'add_model$', views.add_model, ),
url(r'show_models$', views.show_models, ),
]

把app下的urls.py添加到项目下的urls里。在indata_dev/indta_dev/urls.py里

from django.conf.urls import url, include
from django.contrib import admin
from django.views.generic import TemplateView
import indata_tool_api.urls
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^api/', include(indata_tool_api.urls)),
    url(r'^$', TemplateView.as_view(template_name="index.html")),
]

8.初始化数据库表

在项目根目录下运行如下命令,用以生成创建或更改数据库表结构的文件:

python manage.py makemigrations

将更改应用到数据库

python manage.py migrate

注意在执行第一条命令的时候会报错:

看错误信息,是因为我们没有安装 mysqlclient导致的。所以我们可以通过pip安装

pip install mysqlclient

但是在安装mysqlclient的时候报错了,原因是没有安装 mysql-devel导致的。

所以利用yum安装mysql-devel

yum install mysql-devel

仍然报错。。错误信息提示没有安装gcc,执行如下命令安装gcc以及依赖环境

yum install gcc libffi-devel python-devel openssl-devel

执行完上面命令之后,我们就可以看到数据库中被创建了我们需要的表。

9. 运行django项目

python manage.py runserver 0.0.0.0:8000 
[root@localhost indata_dev]# python manage.py runserver 0.0.0.0:8000
Performing system checks...

System check identified no issues (0 silenced).
January 17, 2018 - 09:02:38
Django version 1.11.7, using settings 'indata_dev.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.

报错,因为django不允许其他host访问,所以我们可以通过修改settings.py里的配置,来允许所有hosts访问

ALLOWED_HOSTS = ['*']

10.测试api

写入数据

读取数据

构建VUE项目

1.创建项目

在indta_dev项目根目录下运行如下命令,创建VUE项目

vue-init webpack indata_tool_web

创建过程需要填写项目名、描述、作者、以及一些选项。

2.启动服务

创建完成后,我们进入该vue项目indta_tool_web下进入config目录修改index.js,修改host为0.0.0.0

 host: '0.0.0.0', 

然后保存退出。

在VUE项目根目录下,运行如下命令,启动vue server测试vue项目是否创建成功

npm run dev

访问:192.168.162.111:8080

3.安装组件

vue-router 路由功能(已安装)

vue-resource 用于发送http请求

element-ui 饿了吗ui组件库

nprogress 进度条(可选)

安装vue-resource

在vue项目根目录运行如下命令:

npm install vue-resource

在indata_tool_web\src\main.js里引入vue-resource

import VueResource from 'vue-resource'
Vue.use(VueResource)
安装element-ui

在vue项目根目录运行如下命令:

npm install element-ui

在indata_tool_web\src\main.js里引入element-ui

import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
Vue.use(ElementUI)
安装 nprogress
npm install nprogress

在indata_tool_web\src\main.js里引入nprogress

import NProgress from 'nprogress' // Progress 进度条
import 'nprogress/nprogress.css'// Progress 进度条样式

三、项目整合

前面我们已经把django、vue的环境搭建起来,以及能够使他们各自能独立运行起来,下面我们将对两个项目进行整合开发。

1. 项目导入pycharm

2. 调用api

在vue 项目里测试调用django的api.

修改indata_tool_web\src\components\HelloWorld.vue,添加如下代码:

<template>
  <div>
    <el-input v-model="model_name"></el-input>
    <el-button type="primary" @click="addModel">提交</el-button>
  </div>
</template>
export default {
  name: 'HelloWorld',
  data() {
    return {
      model_name: ''
    }
  },
  methods: {
    addModel() {
      this.$http.get('http://192.168.162.111:8000/api/add_model?model_name=' + this.add_model).then(
        (response) => {
          const res = JSON.parse(response.bodyText);
          //console.log(res);
        },
        (response) => {
        }
      );
    }
  }
}

出现这种错误,是django不允许跨域的问题,所以我们需要设置django允许跨域访问。这时候我们须要在Django层注入header,用Django的第三方包django-cors-headers来解决跨域问题:

  pip install django-cors-headers

修改settings.py

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

CORS_ORIGIN_ALLOW_ALL = True

3.打包vue

在前端工程目录下,输入npm run build,如果项目没有错误的话,就能够看到所有的组件、css、图片等都被webpack自动打包到dist目录下了:

4.Django、vue整合

将django的TemplateView指向我们刚才生成的前端dist文件

找到project目录的urls.py,使用通用视图创建最简单的模板控制器,访问 『/』时直接返回 index.html:

from django.conf.urls import url, include
from django.contrib import admin
from django.views.generic import TemplateView
import indata_tool_api.urls


urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^api/', include(indata_tool_api.urls)),
    url(r'^$', TemplateView.as_view(template_name="index.html")),
]

上一步使用了Django的模板系统,所以需要配置一下模板使Django知道从哪里找到index.html。在project目录的settings.py下:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': ['indata_tool_web/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',
            ],
        },
    },
]

我们还需要配置一下静态文件的搜索路径。同样是project目录的settings.py下:

# Add for vuejs
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "indata_tool_web/dist/static"),
]

配置完成,我们在project目录下输入命令python manage.py runserver 0.0.0.0:8000,就能够看到我们的前端页面在浏览器上展现:

至此,一个django+vue的环境以及整合项目就搭建完成了。

参考文章:https://www.qcloud.com/community/article/774449:

0%