代码之家  ›  专栏  ›  技术社区  ›  Attila O.

Django启动代码放在哪里?

  •  50
  • Attila O.  · 技术社区  · 15 年前

    from django.core import management
    management.call_command('syncdb', interactive=False)
    

    把它放进去 settings.py

    将它们放在视图中并从外部访问该视图也不起作用,因为有些中间件使用数据库,这些中间件将失败,不允许我访问该视图。

    将它们放在中间件中是可行的,但每次访问我的应用程序时都会调用它。一个可能的解决方案可能是创建一个中间件来完成所有的工作,然后将自己从 MIDDLEWARE_CLASSES 所以不再叫了。我可以不用太多的猴子修补吗?

    6 回复  |  直到 15 年前
        1
  •  59
  •   Nick Merrill    11 年前

    编写在中执行此操作的中间件 __init__ django.core.exceptions.MiddlewareNotUsed __初始化__ __初始化__ 顺便说一下,在启动时调用,而不是在第一个请求时调用,因此它不会阻止您的第一个用户。

    有人说要添加一个启动信号,但这不会很快可用(例如,一个主要问题是何时应该发送这个信号)

    相关票证: https://code.djangoproject.com/ticket/13024

    更新: Django1.7包含对此的支持( Documentation

        2
  •  4
  •   Graham Dumpleton    15 年前

    如果您同时使用Apache/mod\u wsgi,请使用中描述的wsgi脚本文件:

    http://blog.dscpl.com.au/2010/03/improved-wsgi-script-for-use-with.html

    import sys
    
    sys.path.insert(0, '/usr/local/django/mysite')
    
    import settings
    
    import django.core.management
    django.core.management.setup_environ(settings)
    utility = django.core.management.ManagementUtility()
    command = utility.fetch_command('runserver')
    
    command.validate()
    
    import django.conf
    import django.utils
    
    django.utils.translation.activate(django.conf.settings.LANGUAGE_CODE)
    
    # Your line here.
    django.core.management.call_command('syncdb', interactive=False)
    
    import django.core.handlers.wsgi
    
    application = django.core.handlers.wsgi.WSGIHandler()
    
        3
  •  4
  •   Joseph Bani    6 年前

    1.避免在migrate、makemigrations、shell会话中运行它。。。

    解决办法是:

    文件: myapp/apps.py

    from django.apps import AppConfig
    
    def startup():
        # startup code goes here
    
    class MyAppConfig(AppConfig):
        name = 'myapp'
        verbose_name = "My Application"
        def ready(self):
            import os
            if os.environ.get('RUN_MAIN'):
                startup()
    

    myapp/__init__.py

    default_app_config = 'myapp.apps.MyAppConfig'
    

    这篇文章使用了@Pykler和@bdoering的建议

        4
  •  3
  •   Emam    13 年前

    https://docs.djangoproject.com/en/dev/howto/custom-management-commands/

    然后可以创建一个启动脚本,运行django服务器,然后执行新的自定义命令。

        5
  •  1
  •   alex    12 年前

    如果你使用的是mod\u wsgi,你可以把它放到wsgi启动应用程序中

        6
  •  0
  •   Luc Saffre    11 年前

    https://github.com/lsaffre/djangosite/blob/master/djangosite/models.py 在那里调用的代码是特定于我的djangosite项目的,但是通过编写一个特殊的应用程序(基于Ross McFarland的想法)来调用它的技巧应该适用于其他环境。