需求描述:有個後台讓 user 能上傳自己的檔案寫入資料庫,以下介紹的方式支援的格式有 xls, xlsx, csv, tsv, yaml, html, json, ods。
首先在 GCP 上面開一台 ubuntu 16.04 的機器,新增防火牆規則開了 8000 Port。
一、安裝 django
- 先在家目錄準備資料夾:
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 資源列表可以參考這邊。
- 安裝設定
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
- 進入剛才建立的 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,可以參考這篇討論串。