【问题标题】:Is it possible to configure Gulp Livereload for Django?是否可以为 Django 配置 Gulp Livereload?
【发布时间】:2014-09-28 13:31:12
【问题描述】:

我想在 Django 中使用 gulp-liveReload,可以吗?我读过 Grunt 有一个替代方案,但我更喜欢使用 Gulp,这对我来说更容易。

谢谢,

【问题讨论】:

    标签: python django gulp gulp-livereload


    【解决方案1】:

    我在最近的一篇博文中写了如何做到这一点:

    http://www.revsys.com/blog/2014/oct/21/ultimate-front-end-development-setup/

    基本上你只需要编写 gulp 任务来观察你想要触发 livereloads 的文件,所以对我来说这就是模板:

    /* Trigger a live reload on any Django template changes */
    gulp.watch('**/templates/**').on('change', livereload.changed);
    

    但您也可以在 models.py、views.py 或其他任何您真正想要的东西上触发它。

    【讨论】:

    • 我正在使用它,它适用于 CSS 文件更改等,但不适用于模板。它与模板一起工作的唯一方法是,如果我触摸或更改.py 文件,然后更改模板。您是否遇到了这个问题,或者它是否以某种方式为您工作?
    • 嗨迈克,很抱歉我在上面打错了应该是'/templates/'而不是我原来的'*/templates/'。希望有帮助!
    【解决方案2】:

    你试过这个django-livereload 吗?

    【讨论】:

    • 不,我没试过。最后我安装了 gulp-livereload 并且它可以工作;)。谢谢。
    【解决方案3】:

    我也一直在努力寻找如何启动 django 服务器并同时让浏览器实时重新加载工作的答案,但事实证明这很容易实现(即使在 windows 和 linux 上跨平台工作时) :

    //jshint node:true
    'use strict';
    
    var gulp          = require('gulp'),
        ....
        gutil         = require('gulp-util');
    
    var browserSync = require('browser-sync').create();
    
    var serverUrl = 'localhost:8000';
    
    var exec = require('child_process').exec;
    
    var isProd = gutil.env.type === 'prod';
    
    ....
    gulp.task('sass', function() {
      return sass(sources.sass, {
        compass: true,
        sourcemap: true,
        style: isProd ? 'compressed': 'expanded',
      })
      ....
      .pipe(sourcemaps.write('.'))
      .pipe(gulp.dest(targets.css))
      .pipe(browserSync.stream());
    });
    ....
    
    gulp.task('watch', function() {
      gulp.watch(sources.sass, ['sass']);
      gulp.watch(sources.pug, ['html'])
        .on('change', browserSync.reload);
      gulp.watch(sources.ts, ['typescript'])
        .on('change', browserSync.reload);
    
      // update browser on python change
      gulp.watch('website/**/*.py')
        .on('change', browserSync.reload);
    });
    
    
    // start django server
    gulp.task('webserver', function() {
      var isWin = /^win/.test(process.platform);
      var cmd =  '. venv/bin/activate && PYTHONUNBUFFERED=1 ';
    
      if (isWin) { //for Windows
        cmd = 'venv\\Scripts\\activate.bat && set PYTHONUNBUFFERED=1 && ';
      }
    
      var proc = exec(cmd + 'python manage.py runserver ' + serverUrl);
      proc.stderr.on('data', function(data) {
        process.stdout.write(data);
      });
    
      proc.stdout.on('data', function(data) {
        process.stdout.write(data);
      });
    });
    
    
    // start livereload
    gulp.task('browser-sync', ['typescript', 'html', 'sass', 'webserver'], function() {
        browserSync.init({
          proxy: serverUrl,
          port: 8080,
          reloadDelay: 300,
          reloadDebounce: 500
        });
    });
    

    【讨论】:

      【解决方案4】:

      我假设您在谈论您的 django 项目中的静态资产(static 下的内容)。

      关键步骤是让python manage.py runserver 服务的页面意识到livereload server 的变化(通常由tiny-lr 实现)

      一个简单的方法是将以下代码注入您的base.html(假设它是django项目中其余html模板的父模板)

      # views.py
      from django.conf import settings
      # other imports ...
      def index(request):
          ctx = {'debug': settings.DEBUG, }
          # other context setup...
          return render(request, 'index.html', ctx)
      
      # other views' definitions...
      
      <!-- base.html -->
      {% if debug %}
          <!-- 
               assuming your livereload server runs at localhost:35729 
                                               (default host:port for livereload )
          -->
          <script src="//localhost:35729/livereload.js"></script>
      {% endif %}
      
      // gulpfile.js
      var gulp = require('gulp'),
          gutil = require('gulp-util'),
          coffee = require('gulp-coffee'),
          livereload = require('gulp-livereload'),
          debug = require('gulp-debug'),
          watch = require('gulp-watch');
      
      // other tasks definitions...
      
      gulp.task('watch', function(){
          livereload.listen();    // starts a tiny-lr server, 
                                  // default livereload server port is 35729
          gulp.src('static/src/**/*.coffee')
              .pipe(watch('static/src/**/*.coffee'))
              .pipe(coffee())
              .pipe(gulp.dest('static/dist'))
              .pipe(livereload()); // send a signal to tiny-lr server 
                                   // to make the page with livereload.js 
                                   // to perform a reload action
      })    
      

      【讨论】:

        【解决方案5】:

        我试过Frank Wile's answer,但我遇到了问题。使用模板对我有用的唯一方法是,如果我保存了 .py 文件,然后对模板进行了更改。

        我扩展了 Frank 的方法,在调用 livereload.changed() 之前使用了一个基本上 touches 一个 .py 文件的函数:

        function touchPy() {
            gulp.src(appName + '/__init__.py')
                .pipe(gulp.dest(appName));
        }
        
        gulp.task('watch', function() {
            livereload.listen();
        
            // Changes to .css files works fine w/ Frank's approach
            gulp.watch(paths.static).on('change', livereload.changed);
        
            // Changes to .html files don't trigger a runserver refresh w/o touching a .py file 
            gulp.watch(paths.templates).on('change', function(file) {
                touchPy();
                livereload.changed(file);
            });
        });
        

        【讨论】:

          【解决方案6】:

          您必须包括:

          <script type="text/javascript" src="http://127.0.0.1:32700/livereload.js" />
          

          到 django 主模板。见http://argskwargs.io/blog/javascript/django-typescript-gulp-part-three/。这是 js 和 css 文件的示例:

          var gulp = require('gulp');
          var watch = require('gulp-watch');
          var livereload = require('gulp-livereload');
          
          var gzip_options = {
              threshold: '1kb',
              gzipOptions: {
                  level: 9
              }
          };
          
          gulp.task('css', function() {
              return gulp.src('static/css/*.css')
                  .pipe(livereload());
          });
          
          gulp.task('js', function() {
              return gulp.src('static/js/*.js')
                  .pipe(livereload());
          });
          
          /* Watch Files For Changes */
          gulp.task('watch', function() {
              livereload.listen(32700);
              gulp.watch('static/css/*.css', ['css']);
              gulp.watch('static/js/*.js', ['js']);
          
              gulp.watch('static/css/*', 'static/js/*').on('change', livereload.changed);
          });
          
          gulp.task('default', ['css', 'js', 'watch']);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-10-12
            • 2015-07-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多