xeor
xeor

Reputation: 5455

global/app lib folders import in Django

I have a Django structure like this (only showing libs):

project/lib/ # Global libraries that will be used cross apps
project/lib/global_stuff.py
project/apps/app1/lib/special_for_app1.py
project/apps/app2/lib/special_for_app2.py

Some apps don't have a lib folder.

from apps.app1.lib import special_for_app1 works fine. But how can I import from the global lib folder when I am inside a folder already containing a local lib folder?

From inside the apps views.py file on one of the apps:


from lib import global_stuff

Gives me ImportError: cannot import name global_stuff


from .lib import global_stuff

Gives me ImportError: cannot import name global_stuff


from ..lib import global_stuff

Gives me ImportError: No module named lib


from ...lib import global_stuff

Gives me ValueError: Attempted relative import beyond toplevel package


from project.lib import global_stuff

Works, but I really dont want to be stuck with using the project name itself in the import.


Is there any way to solve this, not using the project name in the import, or changing the whole lib idea.

Or is there any other good practice to store the main part of the code?

Upvotes: 2

Views: 3080

Answers (2)

rantanplan
rantanplan

Reputation: 7450

You are correct for not wanting to associate the project name with the imports, so there is a common pattern for this:

project/
  |__/source/
  |     |__/lib/
  |     |__/app/
  |__/deployment/  # code for your production deployment maybe
  |
  |__/docs/   
  |__/tests/
  |__README
  |__requirements.txt

and put /path/to/project inside your paths on your virtualenv(you use virtualenv right?).

Then you can do inside your code

from source.lib.blah import foo
from source.app.baz import bar

EDIT: This is only optimal if you don't release your code as open source of course. Only when you have an internal project where the management keeps changing the name of the project :D

Upvotes: 5

DrTyrsa
DrTyrsa

Reputation: 31951

I really dont want to be stuck with using the project name itself in the import

Why not? It's the best way. Note that 'relative imports for intra-package imports are highly discouraged', - as said in PEP-8.

Upvotes: 3

Related Questions