第2回-在Django中集成react項(xiàng)目

創(chuàng)建時(shí)間:20161223

本章小目標(biāo)

  • 創(chuàng)建django項(xiàng)目
  • 在django中使用react頁面
  • 實(shí)現(xiàn)django和react的開發(fā),編譯,提交自動(dòng)化對(duì)接

1 創(chuàng)建django項(xiàng)目

django的項(xiàng)目創(chuàng)建,網(wǎng)上有很多基礎(chǔ)教程,此處不再贅述。創(chuàng)建完成后,項(xiàng)目目錄結(jié)構(gòu)如下,我是用pycharm IDE直接操作的:

image.png

此時(shí)可以運(yùn)行django服務(wù),應(yīng)該可以看到一個(gè)標(biāo)準(zhǔn)網(wǎng)頁頁面。

2 在django中使用react頁面

2.1 首先做一個(gè)訪問url入口

在./hi_weui/urls.py中修改代碼如下:

from django.conf.urls import url
from django.contrib import admin
from weui_app.views import render_html   #新增模板渲染方法

urlpatterns = [
    url(r'^admin/', admin.site.urls),   
    url(r'^$', render_html),  #默認(rèn)訪問地址入口
]

2.2 增加模板渲染方法

代碼文件:./weui_app/views.py

from django.shortcuts import render
# Create your views here.
def render_html(request):
    return render(request, 'index.html')  #很簡(jiǎn)單,返回一個(gè)html頁面

2.3 安置react編譯好的html,js等文件

第1回中,已經(jīng)編譯生成好了4個(gè)文件,再回顧一下:

$ tree dist_hi_weui
dist_hi_weui
├── bundle.js
├── index.html
├── vendor.bundle.js
└── weui.min.css

0 directories, 4 files

2.3.1 html安置

django的html頁面默認(rèn)是去templates下尋找的,所以把html頁面直接拷貝到./templates

2.3.2 靜態(tài)資源js,css安置

django的靜態(tài)文件路徑,是通過settings文件來配置的。
編輯文件:./hi_weui/settings.py

STATIC_URL = '/static/'  #在html頁面中可以用這個(gè)前綴找到靜態(tài)文件
STATIC_ROOT = os.path.join(BASE_DIR, 'collected_static')  #可搜集到一個(gè)目錄下,方便后續(xù)部署
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "common_static"),    #公共靜態(tài)文件目錄,可以被搜集到上面的STATIC_ROOT下
)

將4個(gè)文件中剩下的js,css都拷貝到./common_static 目錄下。

2.3.3 讓html找到對(duì)應(yīng)的js,css

編輯html文件,修改文件路徑為/static/*,如下:

<link href="/static/weui.min.css" rel="stylesheet"></head>
<script type="text/javascript" src="/static/vendor.bundle.js"></script>
<script type="text/javascript" src="/static/bundle.js"></script></body>

現(xiàn)在目錄結(jié)構(gòu)變成這樣了:

image.png

運(yùn)行一下django服務(wù),訪問:http://127.0.0.1:8000/
可以看到和第1回一樣的頁面。

3. 實(shí)現(xiàn)django下react的開發(fā),編譯,運(yùn)行自動(dòng)化

前面只是把react的編譯結(jié)果文件手工拿過來,并實(shí)現(xiàn)了用django的方式訪問。這就說明,用react來做前端,并享有django強(qiáng)大的后臺(tái)能力是可行的。
接下來的內(nèi)容主要是為了讓django的開發(fā)更便捷一點(diǎn)。

3.1 在django項(xiàng)目中編寫react代碼

這個(gè)需求是顯而易見,哪怕是前后端分離,但還都是屬于同一個(gè)項(xiàng)目,所以放到一起,統(tǒng)一管理是必要的。
所以在項(xiàng)目根目錄下創(chuàng)建一個(gè)react目錄,并把hi_weui的react源碼挪進(jìn)來。

image.png

3.2 編譯與提交自動(dòng)化

思路如下:
Django項(xiàng)目中編輯代碼-》在react腳手架下完成編譯-》編譯結(jié)果派發(fā)到Django項(xiàng)目目錄-》啟動(dòng)運(yùn)行Django
這里說的自動(dòng)化其實(shí)就是針對(duì)上面這個(gè)過程,避免每次重復(fù)手工操作,通過執(zhí)行腳本來完成。

3.2.1 創(chuàng)建./react/build2django.sh 如下:

$ cat react/build2django.sh 
########################
react_kit_dir=/home/bit/git_app/react-weui
django_pro_dir=/home/bit/coding_app/hi_weui
pro_name=hi_weui


dist_dir=dist_$pro_name

########################
cp -rf $django_pro_dir/react/* $react_kit_dir/

cd $react_kit_dir/
cnpm run build:$pro_name

cp -f $dist_dir/*html  $django_pro_dir/templates
cp -f $dist_dir/static/*  $django_pro_dir/common_static

于是就可以在django項(xiàng)目下寫react代碼,寫完后執(zhí)行腳本就可以進(jìn)行編譯了。

3.2.2 修改腳手架中的webpack.config.hi_weui.js配置文件

默認(rèn)情況下,打包的html文件中js和css路徑都是當(dāng)前路徑,需要按照django的靜態(tài)資源路徑要求進(jìn)行修改:

<         filename: '/static/hi_weui.js'
<         new ExtractTextPlugin('/static/weui.min.css'),
<         new webpack.optimize.CommonsChunkPlugin('vendor', '/static/vendor.bundle.js'),

3.2.3 進(jìn)一步簡(jiǎn)化為“啟”和“?!?/h3>

更符合習(xí)慣的方式應(yīng)該是:寫代碼-》啟動(dòng)運(yùn)行。中間不應(yīng)該過多的人工操作。
所以再寫一個(gè)啟動(dòng)腳本start.sh,把中間所有的細(xì)節(jié)都屏蔽掉

啟動(dòng)腳本:

$ cat start.sh 
build_flag=$1

base_dir=`pwd`
today=`date +"%Y%m%d"`

echo ">>>stop if is running..."
bash ./stop.sh

if [ $build_flag = "react" ] ;then
    echo ">>>build react codes..."
    bash ./react/build2django.sh
fi

echo ">>>start django..."
python ./manage.py makemigrations
python ./manage.py migrate
python manage.py collectstatic --noinput
#python manage.py check_permissions
python ./manage.py runserver localhost:8088 >> ./server_${today}.log 2>&1 &


停止腳本:

$ cat stop.sh 
user=`whoami`
echo `ps -fu ${user}| grep "manage.py runserver" | grep 8088 `
kill -9 `ps -fu ${user} | grep "manage.py runserver" | grep 8088 | awk '{print $2}'`

4 測(cè)試一下效果

4.1 在django項(xiàng)目中修改代碼

image.png

修改按鈕顯示的內(nèi)容

4.2 執(zhí)行啟動(dòng)腳本啟動(dòng)服務(wù)

$ bash start.sh react

4.3 瀏覽器打開頁面訪問

訪問地址:http://127.0.0.1:8088/

image.png

可以看到react已經(jīng)集成到django中了,并且開發(fā)-》編譯-》運(yùn)行非常簡(jiǎn)單。

下一回預(yù)告:

在nginx中部署這個(gè)項(xiàng)目

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容