django 連接 MySQL 後架簡易後台上傳 xls, csv 等檔案

Pei Lee
9 min readMar 16, 2018

--

需求描述:有個後台讓 user 能上傳自己的檔案寫入資料庫,以下介紹的方式支援的格式有 xls, xlsx, csv, tsv, yaml, html, json, ods。

首先在 GCP 上面開一台 ubuntu 16.04 的機器,新增防火牆規則開了 8000 Port。

一、安裝 django

  1. 先在家目錄準備資料夾:
cd ~
mkdir pei
cd pei

2. 安裝 Python 的 pip:

sudo apt-get install python-pip

3. 安裝套件,建一個名字叫做 env 的虛擬環境,進去:

pip install virtualenv 
virtualenv env
. env/bin/activate

4. 安裝 django,我安裝版本 1.11(LTS),建立專案:

pip install django==1.11
django-admin startproject myProject

5. 編輯 settings.py

nano myProject/settings.py

STATIC_URL = '/static/' 下面一行加入:

STATIC_ROOT = os.path.join(BASE_DIR, 'static')

ALLOWED_HOSTS加入 GCP VM 的外部 IP

ALLOWED_HOSTS = ['Your Server IP Address']

儲存後離開 nano。

6. 建立 APP:

python manage.py startapp testImportExport

7. 把新建的 APP 加入 myProject,編輯 settings.py

nano myProject/settings.py

在 # Application definition 下面加入剛才建立的 testImportExport

# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'testImportExport',
]

二、安裝 MySQL

sudo apt-get install python3-dev libmysqlclient-dev   
pip install mysqlclient
sudo apt-get install mysql-server

確認 MySQL 是否有正常在運行:

systemctl status mysql.service

三、連接資料庫

安裝套件:

pip install MySQL-python

編輯 myProject 設定檔:

nano myProject/settings.py

把 settings.py 裡面的設定改成:

DATABASES = {    
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '[DB Name]',
'USER': '[DB User]',
'PASSWORD': '[DB Password]',
'HOST': '[DB Host]',
}
}

再來編輯 MySQL 的設定檔:

nano /etc/mysql/my.cnf

在 my.cnf 下面加入

[client]
database = [DB Name]
host = [DB Host]
user = [DB User]
password = [DB Password]
default-character-set = utf8

注意這邊不需要引號,直接打相對應的名稱即可。

接著來建立超級使用者:

python manage.py createsuperuser

按照畫面的指示就能順利建立。

最後來測試一下跑不跑得起來:

python manage.py runserver [ GCP VM 內部 IP ]:8000

然後打開外部的瀏覽器,在網址列輸入 [ GCP VM 外部 IP ]:8000/admin,用剛才建立的超級使用者的帳密登入,如此這般就能看到後台了。

四、安裝 django-import-export

django-import-export 是有大神寫好的 APP,文件在這邊,其他用途的 APP 資源列表可以參考這邊

  1. 安裝設定
pip install django-import-export

2. 編輯設定檔:

nano myProject/settings.py

在 # Application definition 下面加入 import_export

# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'testImportExport',
'import_export', ]

然後新增 IMPORT_EXPORT_USE_TRANSACTIONS = True,儲存後離開 nano。

3. 按照文件指示再輸入指令:

python manage.py collectstatic

五、測試 django-import-export

  1. 進入剛才建立的 APP testImportExport,新增檔案 resources.py:
from import_export import resources
from .models import Person

class PersonResource(resources.ModelResource):
class Meta:
model = Person

2. 編輯 models.py:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models
# Create your models here.
class Person(models.Model):
schoolClass = models.CharField(max_length=20) # 班級
className = models.CharField(max_length=20) # 班級名稱
schoolClassChinese = models.CharField(max_length=20) # 班級名稱1
seatNumber = models.CharField(max_length=20) # 座號
studentID = models.CharField(max_length=20) # 學號
name = models.CharField(max_length=30) # 姓名
identityCard = models.CharField(max_length=30) # 身分證
sex = models.CharField(max_length=2) # 性別
birth_date = models.CharField(max_length=20) # 出生日期

3. 編輯 admin.py:

from django.contrib import admin
from import_export.admin import ImportExportModelAdmin
from .models import Person

@admin.register(Person)
class PersonAdmin(ImportExportModelAdmin):
list_display = ('id', 'schoolClass', 'className', \
'schoolClassChinese', 'seatNumber', \
'studentID', 'name', 'identityCard', \
'sex', 'birth_date')

4. 資料移轉:

python manage.py makemigrations
python manage.py migrate

5. 測試:

python manage.py runserver [ GCP VM 內部 IP ]:8000

會發現原本 Django administration 除了原本的 AUTHENTICATION AND AUTHORIZATION 會多一個剛才建的 APP 名稱 TESTIMPORTEXPORT,下面的 Person 是剛才定義的 class 物件。

點進去看,右上角會有三個按鈕,分別可以 IMPORT csv, xls 等檔案批次上傳資料進資料庫,也可以選擇 ADD PERSON 一筆一筆新增資料,最後 EXPORT 資料時可以選擇檔案格式。目前測起來有個小問題是 ID 會跳號。

目前 IMPORT / EXPORT 支援的檔案格式有以下這些:

另外在 IMPORT 資料時好像很多人會遇到 KeyError,可以參考這篇討論串

--

--

Pei Lee
Pei Lee

Written by Pei Lee

Data Team Lead @ Retail & E-commerce Industry

No responses yet