第2回-在Django中集成react项目

创建时间:20161223

本章小目标

  • 创建django项目
  • 在django中使用react页面
  • 实现django和react的开发,编译,提交自动化对接

1 创建django项目

django的项目创建,网上有很多基础教程,此处不再赘述。创建完成后,项目目录结构如下,我是用pycharm IDE直接操作的:

image.png

此时可以运行django服务,应该可以看到一个标准网页页面。

2 在django中使用react页面

2.1 首先做一个访问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),  #默认访问地址入口
]

2.2 增加模板渲染方法

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

from django.shortcuts import render
# Create your views here.
def render_html(request):
    return render(request, 'index.html')  #很简单,返回一个html页面

2.3 安置react编译好的html,js等文件

第1回中,已经编译生成好了4个文件,再回顾一下:

$ 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页面默认是去templates下寻找的,所以把html页面直接拷贝到./templates

2.3.2 静态资源js,css安置

django的静态文件路径,是通过settings文件来配置的。
编辑文件:./hi_weui/settings.py

STATIC_URL = '/static/'  #在html页面中可以用这个前缀找到静态文件
STATIC_ROOT = os.path.join(BASE_DIR, 'collected_static')  #可搜集到一个目录下,方便后续部署
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "common_static"),    #公共静态文件目录,可以被搜集到上面的STATIC_ROOT下
)

将4个文件中剩下的js,css都拷贝到./common_static 目录下。

2.3.3 让html找到对应的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>

现在目录结构变成这样了:

image.png

运行一下django服务,访问:http://127.0.0.1:8000/
可以看到和第1回一样的页面。

3. 实现django下react的开发,编译,运行自动化

前面只是把react的编译结果文件手工拿过来,并实现了用django的方式访问。这就说明,用react来做前端,并享有django强大的后台能力是可行的。
接下来的内容主要是为了让django的开发更便捷一点。

3.1 在django项目中编写react代码

这个需求是显而易见,哪怕是前后端分离,但还都是属于同一个项目,所以放到一起,统一管理是必要的。
所以在项目根目录下创建一个react目录,并把hi_weui的react源码挪进来。

image.png

3.2 编译与提交自动化

思路如下:
Django项目中编辑代码-》在react脚手架下完成编译-》编译结果派发到Django项目目录-》启动运行Django
这里说的自动化其实就是针对上面这个过程,避免每次重复手工操作,通过执行脚本来完成。

3.2.1 创建./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项目下写react代码,写完后执行脚本就可以进行编译了。

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

默认情况下,打包的html文件中js和css路径都是当前路径,需要按照django的静态资源路径要求进行修改:

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

3.2.3 进一步简化为“启”和“停”

更符合习惯的方式应该是:写代码-》启动运行。中间不应该过多的人工操作。
所以再写一个启动脚本start.sh,把中间所有的细节都屏蔽掉

启动脚本:

$ 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 测试一下效果

4.1 在django项目中修改代码

image.png

修改按钮显示的内容

4.2 执行启动脚本启动服务

$ bash start.sh react

4.3 浏览器打开页面访问

访问地址:http://127.0.0.1:8088/

image.png

可以看到react已经集成到django中了,并且开发-》编译-》运行非常简单。

下一回预告:

在nginx中部署这个项目

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容