Django app初始化过程

时间:2015-07-19 22:06:57

标签: python django deployment development-environment

我需要在服务器启动时执行一系列功能。无论路径是“/”,“/ blog /,”/ blog / post“。出于开发目的,我希望每次运行for时都能运行此脚本,并且出于生产目的我会喜欢这个脚本在部署期间运行。任何人都知道如何做到这一点?

我的脚本正在抓取数据,并使用python及其一些库调用Facebook的Graph API。

2 个答案:

答案 0 :(得分:0)

听起来最快(如果不是最优雅)的解决方案是调用' python manage.py runserver'在脚本的最后。

答案 1 :(得分:0)

我建议您使用custom management commands

  1. 创建初始化命令:

    e.g。 app/management/commands/initialize_some_stuff.py

    from django.core.management.base import BaseCommand
    
    
    class Command(BaseCommand):
        help = 'Description of your command.'
    
        def handle(self, *args, **options):
            # Add your initialization here.
            print 'What should I initialize?'
    
  2. 创建在开发期间运行服务器的命令:

    e.g。 app/management/commands/rundevserver.py

    import os
    
    from django.core.management import call_command
    from django.core.management.base import BaseCommand
    
    
    class Command(BaseCommand):
        help = 'Description of your command.'
    
        def handle(self, *args, **options):
            if not os.environ.get('RUN_MAIN'):
                call_command('initialize_some_stuff', *args, **options)
            call_command('runserver', *args, **options)
    
  3. 在开发过程中致电./manage.py rundevserver而非./manage.py runserver

  4. ./manage.py initialize_some_stuff添加到部署脚本中。

  5. 作为第3条款的替代方案,您还可以override default runserver command并有条件地从中调用./manage.py initialize_some_stuff

    1. 添加其他导入:

      import os
      
      from django.conf import settings
      
    2. 覆盖handle方法:

      def handle(self, *args, **options):
          if os.environ.get('RUN_MAIN') and settings.DEBUG:
              call_command('initialize_some_stuff', *args, **options)
          super(Command, self).handle(*args, **options)