2012-04-25 60 views
5

我有一個關於將Django應用程序放入「apps」子目錄的問題。我在project_root中有名爲「faktura」的應用程序。我不喜歡它存在的事實,我想將我所有的應用程序存儲在「apps」子目錄下。將django應用程序移入子文件夾和url.py錯誤

因此,我發現我可以將python路徑擴展到「apps」子目錄,所以在查看互聯網後,我將這個字符串添加到了settings.py:sys.path.insert(0,os.path.join (PROJECT_PATH,「apps」))。然後,我將該應用添加到INSTALLED_APPS,如「faktura」。一切工作順利,直到我添加url(r'^ faktura /',包括('faktura.urls'))到urls.py在根目錄中。因此,Django會拋出錯誤消息「No module named faktura」full taceback is here:http://dpaste.com/737380/

這裏有什麼可能是錯的,爲什麼只有urls.py找不到該應用程序?如果我將它添加到PATH中,它不能找到這個應用程序嗎?我花了一個上午的時間想弄清楚什麼是錯,現在我需要你的幫助。

回答

1

要保持在一個子文件夾你的Django應用程序(如應用程序/),第一添加以下到您的settings.py:

import os

PROJECT_ROOT = os.path.dirname(__file__)

然後在manage.py:

右下#在/ usr /斌/包膜蟒蛇加:

import sys

from os.path import abspath, dirname, join

from site import addsitedir

如果權利之前__name__ == 「__main__」:補充:

sys.path.insert(0, join(settings.PROJECT_ROOT, "apps"))

+1

沒錯這工作......但如果你像我一樣使用uwsgi作爲應用服務器,那麼你也應該將插入應用到wsgi.py文件中。 – Paul 2012-07-18 20:58:53

+1

你真的需要未使用的導入(addsitedir,dirname,abspath)嗎?還是他們從此答案的以前版本中遺留下來? – 2013-02-16 08:47:36

+1

修改sys.path是個壞主意。 https://youtu.be/bAcfPzxB3dk?t=233 – 2016-09-21 09:26:25

9

我不從,也許知道爲什麼以前的答案了-1擱置一些可以糾正的冗餘行。無論如何,我發現一個稍微不同的方法,不涉及向python路徑添加任何東西。

這是我最後的目錄結構,我會在某一時刻解釋:

mysite 
├── mysite 
│ ├── __init__.py 
│ ├── settings.py 
│ ├── urls.py 
│ └── wsgi.py 
├── apps 
│ ├── __init__.py 
│ └── myfirstapp 
│  ├── __init__.py 
│  ├── admin.py 
│  ├── models.py 
│  ├── tests.py 
│  └── views.py 
└── manage.py 

沒有,如果你已經創建了項目,或者如果你想將你的應用程序,創建apps子目錄應包含物質你的應用。訣竅是將__init__.py添加到該目錄。

mkdir apps 
touch apps/__init__.py 

現在您可以將您現有的應用程序移動到apps子目錄中。如果你想創建一個新的,而不是這裏的命令:

python manage.py mysecondapp 
mv mysecondapp apps/ 

警告:不要試圖打電話給python manage.py ./apps/mysecondapp。由於某種原因,這會刪除該目錄中的所有其他應用程序。我這樣失去了一天的工作。

接下來,您將需要修復幾個導入。您settings.pyapps前綴:

INSTALLED_APPS = (
    ... 
    'apps.myfirstapp', 
    'apps.mysecondapp' 
) 

最後,修復項目的urls.py前綴apps

urlpatterns = patterns('', 
    url(r'^myfirstapp', include('apps.myfirstapp.urls')), 
    ... 
) 

取決於你如何寫他們,你可能還必須解決內部的一些進口的應用程序。要麼只使用from models import MyFirstModel,要麼使用from apps.myfirstapp.models import MyFirstModel作爲前綴。

簡而言之,如果您將apps目錄設置爲python包(通過添加__init__.py),則可以將其用作導入路徑的一部分。無論部署方法如何,無需額外配置,這都應該可以工作。

+0

我遇到了一個問題,在這個答案中沒有解決,因爲apps/myfirstapp中的urls.py需要模式的第一個參數(... )設置爲'apps.myfirstapp',就像我之前移動它,它只讀'myfirstapp'。 Django的調試輸出對此很有幫助。 – Ethereal 2014-06-04 15:29:50

+1

from apps.myfirstapp.models import MyFirstModel不能在第二個應用程序模型文件中工作..不知道爲什麼.. – tyan 2017-09-06 09:58:17

1

使用來自settings.pyBASE_DIR變量來源這個答案。應該已經定義:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 

寧在manage.pywsgi.py不使用__file__屬性,因爲它們位於不同的目錄中。

所以,只要添加以下manage.pywsgi.py(並向celery.py如果你使用芹菜):

from django.conf import settings 
    sys.path.append(os.path.join(settings.BASE_DIR, "apps")) 

您將結束與以下項目結構:

project 
├── project 
│ ├── __init__.py 
│ ├── celery.py 
│ ├── settings.py 
│ ├── urls.py 
│ └── wsgi.py 
├── apps 
│ ├── app1 
│ └── app2 
└── manage.py 
相關問題