Django sys.path.append for project *and* app neede

2019-04-08 06:15发布

Could somebody give me a pointer on why I need to add my project root path to the python path as well as the application itself in my WSGI file?

Project base is called 'djapp', the application is called 'myapp'.

sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/..')
sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../djapp')

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

If I omit the line with "/../djapp/" the log tells my that 'myapp' can not be imported, even though 'djapp.settings' is. (validating 'djapp' was imported)

It al runs properly with the ./manage.py command. there's a __init__ in the project folder.

For testings sake, I see the same issue using addsitedir:

site.addsitedir('/home/user/web/project/')
site.addsitedir('/home/user/web/project/djapp')

2条回答
何必那么认真
2楼-- · 2019-04-08 06:50

Since djapp (the django project folder) is in a parent folder that also belongs to the deployment I renamed the djapp folder simply to project. Then this code is always correct:

sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/..' )
sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../project')

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

The complete folder layout being:

host.example.com\
    etc\
    bin\
    project\
    logs\

And what have you. This way project can always be called project :)

Hope that helps.

GrtzG

查看更多
虎瘦雄心在
3楼-- · 2019-04-08 06:50

Presumably you've got code within your project which is doing from myapp import foo.

Two options:

  • change that to from djapp.myapp import foo, which is not recommended as it prevents portability;
  • only add djapp in your WSGI, and set the DJANGO_SETTINGS_MODULE to just 'settings'.
查看更多
登录 后发表回答