Django 应用程序初始化过程

Django app initialization process

我需要在服务器启动期间执行一组功能。不管路径是“/”、“/blog/”、“/blog/post”。出于开发目的,每次我 运行 [=10] 时,我都希望这个脚本 运行 =] 出于生产目的,我希望在部署期间将此脚本 运行。有人知道如何做到这一点吗?

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

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

我建议你使用 custom management commands:

  1. 创建初始化命令:

    例如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. 在开发期间为 运行 服务器创建命令:

    例如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 添加到您的部署脚本。

作为第 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)