0

アプリケーション用のデータベースルーターをmyappファイルで作成しました/myproject/myapp/routers.py

class ShardingRouter(object):

    def db_for_read(self, model, **hints):
        return 'default'

    def db_for_write(self, model, **hints):
        return 'default'

    def allow_relation(self, obj1, obj2, **hints):
        return None

    def allow_syncdb(self, db, model):
        return None 

settings.pyが持っている:

from django.db import connections
DATABASE_ROUTERS = ['myproject.myapp.routers.ShardingRouter',]

これは、wsgiを介して実行される通常のアプリケーションではうまく機能しますが/myproject/parser_jobs.py、cronで開始するかCLIから手動で開始するCLIスクリプトが1つあります。

import os, sys
if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
...
...
if __name__ == "__main__":
    do_some_long_boring_work()

このスクリプトを実行すると、インポートエラーが発生します。

Traceback (most recent call last):
  File "/hosting/myproject/myproject/parser_jobs.py", line 20, in <module>
    import settings
  File "/hosting/myproject/myproject/settings.py", line 46, in <module>
    from django.db import connections
  File "/usr/local/lib/python2.7/dist-packages/django/db/__init__.py", line 11, in <module>
    if DEFAULT_DB_ALIAS not in settings.DATABASES:
  File "/usr/local/lib/python2.7/dist-packages/django/utils/functional.py", line 184, in inner
    self._setup()
  File "/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py", line 42, in _setup
    self._wrapped = Settings(settings_module)
  File "/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py", line 95, in __init__
    raise ImportError("Could not import settings '%s' (Is it on sys.path?): %s" % (self.SETTINGS_MODULE, e))
ImportError: Could not import settings 'myproject.myproject' (Is it on sys.path?): cannot import name connections

settings.pyが見つかったようですが、インポート中に失敗しfrom django.db import connectionsます。この文字列にコメントすると、機能しますが、dbルーターがなくても:(using()どこにでも追加できますが、かっこいいとは言えません。

したがって、Webサイトは正常に機能しますが、CLIスクリプトは失敗します。助けてください!


更新:/hosting/myproject/myproject/parser_jobs.py DBルーターを追加する前は、CLIから正常に機能しました

pprintsys.pathこのスクリプトのの:

['/hosting/myproject/myproject',
 '/hosting/myproject',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-linux2',
 '/usr/lib/python2.7/lib-tk',
 '/usr/lib/python2.7/lib-old',
 '/usr/lib/python2.7/lib-dynload',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages/PIL',
 '/usr/lib/python2.7/dist-packages/gst-0.10',
 '/usr/lib/python2.7/dist-packages/gtk-2.0',
 '/usr/lib/python2.7/dist-packages/ubuntu-sso-client',
 '/usr/lib/pymodules/python2.7']

更新:wsgiスクリプト、Webサイトはそれでうまく機能します:

import os
import sys

path = '/hosting/myproject'
if path not in sys.path:
    sys.path.insert(0, path)

os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
4

1 に答える 1

1

私のスクリプトは、settings.py 移動したときと同じフォルダーにありまし/hosting/myproject/myproject/parser_jobs.py/hosting/myproject/parser_jobs.py (django1.4のmanage.pyのどこにあるべきか)、正しく機能するようになりました。

また、私はに変更os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")しましたos.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")

そして今、それは機能します!

以前の場所parser_jobs.pyでは、db ルーターなしでのみ機能します

于 2012-07-30T21:08:05.193 に答える