Python Webåå端å离æ¡æ¶Django+Vueæ建
对åé¢æå¦ç¥è¯çå½çº³æ´çï¼æå ´è¶£çå¯ä»¥ççï¼æ¬¢è¿ææ£ã
ä¸ãåå端å离æ¡æ¶ä»ç»
æ¬é¡¹ç®åºäº Python ç Web æ¡æ¶å¼åï¼éç¨åå端å离çå¼å模å¼ï¼åå端ä¹é´éè¿å¯å¼æ¾ç Restful API å®ç°æ°æ®äº¤äºã
å端éç¨ Python ç Django Web æ¡æ¶å¼åï¼å¯é å redis ä½¿ç¨ Celery ä½ä¸ºå¼æ¥ä»»å¡è°åº¦æ¨¡åå®æ¶æ¥è¯¢æ°æ®ã
å端éç¨Vue.jsæ¡æ¶å¼åï¼åºäº Vue-element-admin å¼æºé¡¹ç®äºæ¬¡å¼åï¼ä»¥ B/S 模å¼æä¾å¯è§åçæ°æ®æ¥è¯¢ç»æã
æ°æ®åºåºäºMySQLåRedisï¼MySQLç¨äºåå¨å管çç³»ç»èµæºæ°æ®ï¼Redisç¨äºåå¨åæ´æ°Celeryéåæ§è¡çç»æã
æåå¨èªå»ºçLinuxæå¡å¨ä¸åºäº Nginx+uWSGI å®æé¨ç½²ã
â
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2YfNWawNiZpdmL4kTN1IDO0cTMwMDNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.gif)
该åå端æ¡æ¶ä½¿ç¨ Vue.js ä½ä¸ºå端渲æï¼æ¿æ¢äº Django çå端模æ¿å¼æ渲æï¼éè¿ Restful API è¿è¡æ°æ®äº¤äºï¼å®ç°åå端解è¦ï¼ç»¼åèµ·æ¥å°±æ¯ï¼ M(Django) + C(Django) + MVVM (Vue.js)ã
äºãæ建å¼åç¯å¢
1ãå建并æ¿æ´»èæç¯å¢
å¨windowsç¯å¢ä¸ï¼å¯ä½¿ç¨ python venv æ conda å建èæç¯å¢ï¼è¿é以 conda 为ä¾ï¼ä½¿ç¨ conda å½ä»¤åéå å®è£ Anaconda ï¼ãè¿è¡ä»¥ä¸å½ä»¤å建èæç¯å¢ï¼jk2 为项ç®å称ã
> conda create -n jk2 python
> activate jk2
å¯ä½¿ç¨å½ä»¤
python -V
éªè¯Pythonç¯å¢æ¯å¦å®è£ æåã
æ¥ä¸æ¥å®è£ Django 3.2 çæ¬ã
> pip install django==3.2
> python
>>> import django // 导å
¥django
>>> django.VERSION // æ¥çdjangoçæ¬
è¥è¦ä½¿ç¨mysqlï¼è¿éè¦å®è£ mysqlclientï¼ä½¿ç¨å½ä»¤
pip install mysqlclient
ã
2ãæ°æ®åºé ç½®
å端æ¯æå¤ç§æ°æ®åºï¼è¿é以 MySQL 为ä¾ãå建æ¬é¡¹ç®çæ¬å°æ°æ®åºï¼éè¦å å®è£ MySQLï¼ï¼è¿è¡ä»¥ä¸å½ä»¤å建æ°æ®åºã
> mysql -uroot -p
# è¾å
¥å¯ç
mysql> create database jk2 default charset=utf8mb4;
mysql> flush privileges;
3ãæ建å端 vue.js ç¯å¢
å®è£ Node.js ï¼å¯å¨å®ç½http://nodejs.cnä¸è½½ï¼å®æå®è£ åï¼è¾å ¥å½ä»¤
node -v
ï¼è¥è¾åº node çæ¬ä¿¡æ¯ï¼åå®è£ æåã
å ¨å±å®è£ vue-cli èææ¶ï¼è¾å ¥å½ä»¤ï¼
npm install --global vue-cli
ï¼å®æå®è£ åè¾å ¥å½ä»¤
vue
ï¼è¥è¾åº vue ä¿¡æ¯ï¼åå®è£ æåã
ä¸ãæ建 Django+Vue.js 项ç®
1ãå建 django å端
> django-admin startproject jk2
è¿å ¥é¡¹ç®æ ¹ç®å½ï¼å建ä¸ä¸ª app ä½ä¸ºé¡¹ç®å端ã
> cd jk2
> mkdir backend
> python manage.py startapp account
å³ï¼app åå«å accountãç¶åå° account 移å¨å° backend ç®å½éï¼ä¿®æ¹
backend/account/apps.py
æä»¶ä¸ name çå¼ï¼ä»£ç 为ï¼
class AccountConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'backend.account'
å¨
backend/account
ç®å½æ·»å
urls.py
æ件ï¼ä»£ç 为ï¼
from django.urls import path, re_path
from backend.account import views
urlpatterns = [
]
åæ¶ä¹è¦ä¿®æ¹
jk2/settings.py
æ件ä¸
INSTALLED_APPS
çå¼ï¼æ·»å æ°å»º app ç name å¼ï¼ä»£ç 为ï¼
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'backend.account',
]
ä¿®æ¹
jk2/settings.py
æ件çæ°æ®åºé 置项ï¼æ ¹æ®æ¬æºé ç½®æéä¿®æ¹ï¼ä»£ç 为ï¼
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'jk2', # æ°æ®åºå称
'USER': '********', # ç¨æ·å
'PASSWORD': '********', # å¯ç
'HOST': 'localhost',
'PORT': '3306',
}
}
åæ¥æ°æ®åºï¼å¨ jk2 èæç¯å¢è¿è¡ä»¥ä¸å½ä»¤ï¼
> python manage.py makemigrations # å建åæ¥æ件
> python manage.py migrate # åæ¥å°æ°æ®åº
PS.ææ¶åéè¦æå®å ·ä½appæè½åæ¥æåï¼å¦ï¼
python manage.py makemigrations account
ã
jk2/settings.py
æä»¶å ¶ä»éè¦ä¿®æ¹ææ°æ·»çé 置项ï¼
# DEBUG = False # é¨ç½²å°æå¡å¨è¦æ¹ä¸ºFalse
DEBUG = True
ALLOWED_HOSTS = ['localhost', '127.0.0.1']
# ALLOWED_HOSTS = ['192.168.**.**'] # é¨ç½²å°æå¡å¨è¦æ¹ä¸ºè·æå¡å¨IPä¸è´ã
# Internationalization
# https://docs.djangoproject.com/en/1.11/topics/i18n/
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False
# session设置
SESSION_COOKIE_AGE = 60 * 60 * 12 # 12å°æ¶åsessionèªå¨å¤±æ
SESSION_SAVE_EVERY_REQUEST = True
SESSION_EXPIRE_AT_BROWSER_CLOSE = True # å
³éæµè§å¨ï¼åCOOKIE失æ
2ãå建 vue.js å端
ä½¿ç¨ vue-cli å建ä¸ä¸ª vue.js 项ç®ä½ä¸ºå端ã
å³ï¼é¡¹ç®åå« frontendãæ»ä½ç»æå¦ä¸ï¼
.
âââ backend
â âââ __init__.py
â âââ admin.py
â âââ migrations
â â âââ __init__.py
â âââ models.py
â âââ tests.py
â âââ views.py
âââ frontend
â âââ README.md
â âââ build
â â âââ ....
â âââ config
â â âââ dev.env.js
â â âââ index.js
â â âââ prod.env.js
â â âââ test.env.js
â âââ index.html
â âââ package.json
â âââ src
â â âââ App.vue
â â âââ assets
â â â âââ logo.png
â â âââ components
â â â âââ Hello.vue
â â âââ main.js
â âââ static
â âââ test
â âââ ...
âââ manage.py
âââ jk2
âââ __init__.py
âââ settings.py
âââ urls.py
âââ wsgi.py
å¯ä»¥çå°é¡¹ç®æ ¹ç®å½æ两个æ°æ件夹ï¼ä¸ä¸ªå« backend ï¼ä¸ä¸ªå« frontendï¼åå«æ¯ï¼
- backend åæ¾ django ç app
- frontend vue.js 项ç®
ä½¿ç¨ webpack æå vue.js 项ã
# cd frontend
# npm install
# npm i element-ui -S //å¼å
¥element-ui
# npm run build
æ建å®æä¼çæä¸ä¸ªæ件夹ååå« distï¼éé¢æä¸ä¸ª index.html åä¸ä¸ªæ件夹 static ã
3ãé ç½® django å端 æ¯æ vue.js å端
é ç½® django ç url è·¯ç±é ç½®ã
ä¿®æ¹
jk2/urls.py
æ件ï¼ä½¿ç¨éç¨è§å¾å建æç®åç模æ¿æ§å¶å¨ï¼è®¿é® / æ¶ç´æ¥è¿å index.htmlï¼ä»£ç 为ï¼
from django.contrib import admin
from django.urls import path, re_path, include
from django.views.generic.base import TemplateView
urlpatterns = [
path('admin/', admin.site.urls),
path('', TemplateView.as_view(template_name="index.html")), # æå¡å¨é
ç½®
path('api/accounts/', include('backend.account.urls'))
]
ç¶åï¼é ç½® django ç模æ¿æ索路å¾ã
ä¸ä¸æ¥ä½¿ç¨ django ç模æ¿ç³»ç»ï¼æ以éè¦é ç½®ä¸ä¸æ¨¡æ¿ä½¿ django ç¥éä»åªéæ¾å° index.htmlãæå¼
jk2/settings.py
æ件ï¼æ¾å°TEMPLATESé 置项ï¼ä¿®æ¹å¦ä¸ï¼
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
# 'DIRS': [],
'DIRS': ['frontend/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',
],
},
},
]
注æè¿éç frontend æ¯ vue.js 项ç®ç®å½ï¼dist åæ¯è¿è¡
npm run build
æ建åºç index.html ä¸éææ件夹 static çç¶çº§ç®å½ãè¿æ¶å¯å¨ django 项ç®ï¼è®¿é® / åå¯ä»¥è®¿é® index.htmlï¼ä½è¿æé®é¢ï¼éææ件é½æ¯404é误ï¼è¿éè¦é ç½®éææ件çæ索路å¾ï¼å¨
jk2/settings.py
æ件ä¸æ·»å ä¸é¢ä»£ç ï¼
import os
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "frontend/dist/static"), # æå¡å¨é
ç½®
]
è¿æ ·å¨cmdä¸ä½¿ç¨å½ä»¤
python manage.py runserver
è¿è¡ django ä¸ä» å¯ä»¥å° http://127.0.0.1:8000/ æ å°å° index.htmlï¼èä¸è¿å¯ä»¥é¡ºå©æ¾å°éææ件ãæ¤æ¶è®¿é® http://127.0.0.1:8000/ æ们å¯ä»¥çå°ä½¿ç¨ django ä½ä¸ºå端ç Vue.js ç hello world 页é¢ã
4ãå¼åç¯å¢é ç½®
å 为æ们使ç¨äº django ä½ä¸ºå端ï¼æ¯æ¬¡ä¿®æ¹äºå端ä¹åé½è¦ä½¿ç¨å½ä»¤
npm run build
éæ°æ建ï¼ä½ å¯ä»¥ç解为ä¸ç¼è¯ä¸è½è¿è¡ï¼ ï¼è¿æ ·ååå½±åå¼åç¯å¢çè°æµãç´æ¥ä½¿ç¨ vue.js çå¼åç¯å¢æ¥è°è¯ï¼è¿è¡
npm run dev
ï¼å¯ä»¥ç´æ¥è®¿é®å端ï¼ä½ä¼äº§çä¸ä¸ªæ°é®é¢ï¼ä½¿ç¨ vue.js çå¼åç¯å¢è±ç¦»äº Django ç¯å¢ï¼è®¿é® django åç APIï¼åºç°äºè·¨åé®é¢ï¼æ两ç§æ¹æ³è§£å³ï¼ä¸ç§æ¯å¨ vue.js å±ä¸å转åï¼proxyTableï¼ï¼å¦ä¸ç§æ¯å¨ django å±æ³¨å ¥ headerãåä¸ç§å¯åèå¦ä¹ èµæé¾æ¥ãè¿é详ç»è®²ä¸ä¸ç¬¬ä¸ç§çé ç½®ã
é¦å ï¼å°åé¢
jk2/urls.py
å
jk2/settings.py
ææåé¢æ³¨é为æå¡å¨é ç½®ç代ç 注éæï¼æ¹ä¸º django åå ç代ç ãè¿æ¶ï¼ä½ è¿è¡
python manage.py runserver
è¿å ¥çæ¯ django çæ示页é¢ã
ç¶åå¨
frontend/config
ç®å½æ°å»ºæ件
proxyConfig.js
ï¼ä»£ç å¦ä¸ï¼
module.exports = {
proxyList: {
'/': {
target: 'http://127.0.0.1:8000',
changeOrigin: true,
pathRewrite: {
'^/': ''
}
}
}
}
æåä¿®æ¹
frontend/config/index.js
æ件ç¸å ³é ç½®ï¼ä»£ç å¦ä¸ï¼
var proxyConfig = require('./proxyConfig')
module.exports = {
dev: {
proxyTable: proxyConfig.proxyList,
}
}
è¿æ ·ï¼å¼åè°è¯èµ·æ¥å°±å¾æ¹ä¾¿ï¼è¿è¡
npm run dev
ï¼ç´æ¥è®¿é®å端ï¼è¿è¡
python manage.py runserver
ï¼ç´æ¥è®¿é®å端ãå½è¦åå¸å°æå¡å¨æ¶ï¼åæ¹ååé¢çé ç½®ã
5ãåå§åæ°æ®
å建管çåç¨æ·ï¼ç¬¬ä¸æ¬¡é ç½®æ¶ï¼é¦å éè¦å建ä¸ä¸ªå¯ä»¥ç»å½ç®¡çåå°çè´¦å·ï¼å¨cmdä¸è¾å ¥ï¼
python manage.py createsuperuser
å¡«åç¨æ·åãé®ç®±åå¯ç ï¼è¿éæ们å建äºä¸ä¸ªadminè´¦å·ãè¿æ ·ï¼æ们éè¿ç½å http://127.0.0.1:8000/admin/ å¯ä»¥è®¿é®ç³»ç»åå°ï¼ç´æ¥ä¿®æ¹æ°æ®åºæ°æ®ã
åã项ç®ç®å½è¯´æ
- backendï¼å端åè½æ¨¡åï¼çææ¥å£ä¾å端è°ç¨ã
- docsï¼åæ¾é¡¹ç®ææ¡£ï¼èªå»ºï¼ã
- frontendï¼å端Webåºç¨ï¼è°ç¨å端æ¥å£æ¾ç¤ºæ°æ®ï¼å¹¶è¿è¡äº¤äºã
- servicesï¼å端æå¡æ¨¡åï¼å°è£ æ¹æ³ä¾å端åè½æ¨¡åè°ç¨ï¼èªå»ºï¼ã
- jk2ï¼åæ¾Djangoé ç½®æ件ã
äºãå端æ¥å£å°è£
å¾ ç»â¦
å ãæå¡å¨é¨ç½²
è§æå¡å¨/02-CentOSä¸é¨ç½²å管çDjango+vue项ç®ã
å¦ä¹ èµæ
æå¦ä½ä½¿ç¨ Django + Vue.js å¿«éæå»ºé¡¹ç® https://zhuanlan.zhihu.com/p/24893786
â By Mason-2021.4.30