Skip to content

Commit e7f5023

Browse files
author
SB
committed
first release
1 parent a918d9a commit e7f5023

File tree

17 files changed

+239
-0
lines changed

17 files changed

+239
-0
lines changed

MANIFEST.in

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
global-exclude __pycache__ *.pyc
2+
recursive-exclude * __pycache__
3+
recursive-exclude * *.py[co]
4+
recursive-exclude * .*.sw*
5+
recursive-include *.md *.py
6+
7+
recursive-include django_webpack_integration *

README.md

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
#Django Webpack Integration
2+
3+
### Описание
4+
5+
Итак у вас есть проект на django куда прикручен django-rest и еще 100500
6+
модулей с которых вы собирает статику collectstatic на production
7+
и у вас есть куча компилируемого js для фронтэнеда который на es7 и его
8+
надо собирать. Смысл этого чтоб джанга была отдельно а webpack и js отдельно:
9+
но управлять конечно из джанги и небыло проблем со static из приложений django
10+
11+
### Установка
12+
13+
14+
### Настройка
15+
16+
1. Добавляем в INSTALLED_APPS ( settings.py ) 'django_webpack_integration'
17+
18+
2. В settings.py добавляем FRONTEND_DIR - где указываем путь до вашего
19+
проект на js
20+
21+
3. Теперь в массив scripts который в package.json который в свою очередь где-то
22+
в директории которая прописана в FRONTEND_DIR добавлем "webpack-dev-server":"./node_modules/.bin/webpack-dev-server"
23+
предварительно установие npm install --save-dev webpack-dev-server
24+
25+
4. В webpack.config.js webpack-dev-server настраиваем примерно так:
26+
4.1 в начале добавлем
27+
```
28+
const fs = require('fs');
29+
var rawdata = fs.readFileSync('django.json');
30+
var django = JSON.parse(rawdata);
31+
```
32+
не волнуйтесь за django.json - он будет создан автоматическии
33+
4.2 в основном конфиге webpack добавляем примерно такое:
34+
```
35+
devServer: {
36+
contentBase: [path.join(__dirname, 'dist')].concat(django['static_dirs']),
37+
compress: true,
38+
clientLogLevel: 'info',
39+
port: 9000,
40+
before: function (app, server) {}
41+
}
42+
```
43+
44+
4. settings.py STATIC_URL меняем на 'http://localhost:9000/' ( webpack-dev-server
45+
запускается на 9000 по конфигу выше )
46+
47+
5. В директории с проектом django запускаем ./manage.py npm webpack-dev-server
48+
49+
6. Добавить django.json в .gitignore

django_webpack_integration/__init__.py

Whitespace-only changes.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from django.contrib import admin
2+
3+
# Register your models here.

django_webpack_integration/apps.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from django.apps import AppConfig
2+
3+
4+
class DjangoWebpackIntegrationConfig(AppConfig):
5+
name = 'django_webpack_integration'

django_webpack_integration/conf.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
__author__ = 'sb'
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
__author__ = 'sb'
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
__author__ = 'sb'
2+
3+
from django.core.management.base import BaseCommand
4+
from django.conf import settings
5+
import os
6+
import json
7+
8+
class NeedFrontEndDirCommand(BaseCommand):
9+
def __init__(self, stdout=None, stderr=None, no_color=False):
10+
super().__init__(stdout, stderr, no_color)
11+
if not settings.FRONTEND_DIR:
12+
self.stdout.write(self.style.ERROR('Please set FRONTEND_DIR in settings.py'))
13+
quit()
14+
if not os.path.isdir(settings.FRONTEND_DIR):
15+
self.stdout.write(self.style.ERROR('FRONTEND_DIR not found'))
16+
self.stdout.write(self.style.ERROR('FRONTEND_DIR is: {}'.format(settings.FRONTEND_DIR)))
17+
quit()
18+
19+
20+
class NeedPackageJsonCommand(NeedFrontEndDirCommand):
21+
package_json_filepath = ''
22+
package_json_obj = {}
23+
24+
def __init__(self, stdout=None, stderr=None, no_color=False):
25+
super().__init__(stdout, stderr, no_color)
26+
self.package_json_filepath = os.path.join(settings.FRONTEND_DIR,'package.json')
27+
if not os.path.exists(self.package_json_filepath):
28+
self.stdout.write(self.style.ERROR('File package.json not found in FRONTEND_DIR'))
29+
self.stdout.write(self.style.ERROR('May should run "npm init" ?'))
30+
self.stdout.write(self.style.ERROR('Full package.json path:{}'.format(self.package_json_filepath)))
31+
quit()
32+
try:
33+
fh = open(self.package_json_filepath)
34+
self.package_json_obj = json.load(fh)
35+
fh.close()
36+
except:
37+
self.stdout.write(self.style.ERROR('Can\'t decode json from package.json'))
38+
self.stdout.write(self.style.ERROR('May should run "npm init" ?'))
39+
self.stdout.write(self.style.ERROR('Full package.json path:{}'.format(self.package_json_filepath)))
40+
quit()
41+
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
__author__ = 'sb'
2+
3+
import json
4+
5+
from . import NeedFrontEndDirCommand
6+
from django.conf import settings
7+
import os
8+
from django.contrib.staticfiles.finders import get_finders
9+
import django
10+
11+
12+
class Command(NeedFrontEndDirCommand):
13+
help = 'create django.json in FRONTEND_DIR'
14+
15+
def handle(self, *args, **options):
16+
django_obj_for_json = {}
17+
django_obj_for_json['VERSION'] = django.VERSION
18+
django_obj_for_json['static_dirs'] = []
19+
for finder in get_finders():
20+
for key in list(finder.storages):
21+
django_obj_for_json['static_dirs'].append(finder.storages[key].location)
22+
django_json_file = os.path.join(settings.FRONTEND_DIR, 'django.json')
23+
fh = open(django_json_file, 'w')
24+
fh.write(json.dumps(django_obj_for_json))
25+
fh.close()
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
__author__ = 'sb'
2+
3+
from django.core.management.base import BaseCommand
4+
from django.conf import settings
5+
import os
6+
from django.core.management import call_command
7+
from . import NeedPackageJsonCommand
8+
9+
class Command(NeedPackageJsonCommand):
10+
help = 'run npm command'
11+
ignore_patterns = []
12+
13+
def create_parser(self, prog_name, subcommand):
14+
parser = super().create_parser(prog_name, subcommand)
15+
npm_scripts_allow_arr = []
16+
try:
17+
scripts = self.package_json_obj['scripts']
18+
for name, cmd in scripts.items():
19+
npm_scripts_allow_arr.append(name)
20+
except:
21+
self.stdout.write(self.style.ERROR('Can\'t find "scripts" section in json from package.json'))
22+
self.stdout.write(self.style.ERROR('Full package.json path:{}'.format(self.package_json_filepath)))
23+
quit()
24+
parser.add_argument('npm_script', nargs=1, type=str, default='',choices=npm_scripts_allow_arr)
25+
return parser
26+
27+
def handle(self, *args, **options):
28+
call_command('make_django_json')
29+
os.chdir(settings.FRONTEND_DIR)
30+
os.system('npm run ' + options['npm_script'][0])

0 commit comments

Comments
 (0)