Thực hành tốt nhất cho cấu trúc thư mục làm việc của dự án Django


173

Tôi biết thực sự không có cách duy nhất đúng. Tuy nhiên, tôi thấy rằng thật khó để tạo ra một cấu trúc thư mục hoạt động tốt và vẫn sạch sẽ cho mọi nhà phát triển và quản trị viên. Có một số cấu trúc tiêu chuẩn trong hầu hết các dự án trên github. Nhưng nó không chỉ ra cách tổ chức các tệp khác và tất cả các dự án trên pc.

Cách thuận tiện nhất để tổ chức tất cả các thư mục này trên máy phát triển là gì? Làm thế nào để bạn đặt tên cho chúng, và làm thế nào để bạn kết nối và triển khai nó với máy chủ?

  • dự án (tất cả các dự án mà bạn đang làm việc)
  • tập tin nguồn (chính ứng dụng)
  • bản sao làm việc của kho lưu trữ (tôi sử dụng git)
  • môi trường ảo (tôi thích đặt nó gần dự án)
  • root tĩnh (đối với các tệp tĩnh được biên dịch)
  • phương tiện truyền thông gốc (cho các tập tin phương tiện tải lên)
  • Sẵn sàng
  • GIẤY PHÉP
  • các tài liệu
  • phác thảo
  • ví dụ (một dự án ví dụ sử dụng ứng dụng được cung cấp bởi dự án này)
  • cơ sở dữ liệu (trong trường hợp sqlite được sử dụng)
  • bất cứ điều gì khác mà bạn thường cần cho công việc thành công trong dự án

Những vấn đề mà tôi muốn giải quyết:

  • Tên tốt của các thư mục để mục đích của họ là rõ ràng.
  • Giữ tất cả các tệp dự án (bao gồm virtualenv) ở một nơi, vì vậy tôi có thể dễ dàng sao chép, di chuyển, lưu trữ, xóa toàn bộ dự án hoặc ước tính mức sử dụng dung lượng đĩa.
  • Tạo nhiều bản sao của một số bộ tệp đã chọn, chẳng hạn như toàn bộ ứng dụng, kho lưu trữ hoặc virtualenv, trong khi vẫn giữ một bản sao của một tệp khác mà tôi không muốn sao chép.
  • Triển khai tập hợp đúng tập tin vào máy chủ chỉ bằng cách rsyncing chọn một dir.

Câu trả lời:


257

Có hai loại "dự án" Django mà tôi có trong ~/projects/thư mục của mình , cả hai đều có cấu trúc hơi khác nhau.:

  • Trang web độc lập
  • Ứng dụng cắm

Trang web độc lập

Chủ yếu là các dự án tư nhân, nhưng không phải. Nó thường trông như thế này:

~/projects/project_name/

docs/               # documentation
scripts/
  manage.py         # installed to PATH via setup.py
project_name/       # project dir (the one which django-admin.py creates)
  apps/             # project-specific applications
    accounts/       # most frequent app, with custom user model
    __init__.py
    ...
  settings/         # settings for different environments, see below
    __init__.py
    production.py
    development.py
    ...

  __init__.py       # contains project version
  urls.py
  wsgi.py
static/             # site-specific static files
templates/          # site-specific templates
tests/              # site-specific tests (mostly in-browser ones)
tmp/                # excluded from git
setup.py
requirements.txt
requirements_dev.txt
pytest.ini
...

Cài đặt

Các thiết lập chính là sản xuất. Các file khác (ví dụ. staging.py, development.py) Tất cả mọi thứ chỉ đơn giản là nhập khẩu từ production.pyvà ghi đè lên các biến chỉ cần thiết.

Đối với mỗi môi trường, có các tệp cài đặt riêng, ví dụ: sản xuất, phát triển. Tôi một số dự án tôi cũng đã thử nghiệm (cho người chạy thử), dàn dựng (như một kiểm tra trước khi triển khai cuối cùng) và cài đặt heroku (để triển khai lên heroku).

Yêu cầu

Tôi thay vì chỉ định các yêu cầu trong setup.py trực tiếp. Chỉ những thứ cần thiết cho môi trường phát triển / thử nghiệm mà tôi có requirements_dev.txt.

Một số dịch vụ (ví dụ: heroku) yêu cầu phải có requirements.txttrong thư mục gốc.

setup.py

Hữu ích khi triển khai dự án bằng cách sử dụng setuptools. Nó thêm manage.pyvào PATH, vì vậy tôi có thể chạy manage.pytrực tiếp (bất cứ nơi nào).

Ứng dụng dành riêng cho dự án

Tôi đã từng đưa các ứng dụng này vào project_name/apps/thư mục và nhập chúng bằng cách nhập tương đối.

Các tệp mẫu / tĩnh / miền địa phương / thử nghiệm

Tôi đặt các mẫu và tệp tĩnh này vào các mẫu chung / thư mục tĩnh, không phải trong mỗi ứng dụng. Những tệp này thường được chỉnh sửa bởi những người không quan tâm đến cấu trúc mã dự án hoặc python. Nếu bạn là nhà phát triển toàn ngăn xếp làm việc một mình hoặc trong một nhóm nhỏ, bạn có thể tạo mẫu trên mỗi ứng dụng / thư mục tĩnh. Đó thực sự chỉ là vấn đề của hương vị.

Điều tương tự cũng áp dụng cho miền địa phương, mặc dù đôi khi thuận tiện để tạo thư mục miền địa phương riêng biệt.

Các thử nghiệm thường tốt hơn để đặt bên trong mỗi ứng dụng, nhưng thường có nhiều thử nghiệm tích hợp / chức năng kiểm tra nhiều ứng dụng hoạt động cùng nhau, vì vậy thư mục thử nghiệm toàn cầu có ý nghĩa.

Thư mục Tmp

Có thư mục tạm thời trong root dự án, loại trừ khỏi VCS. Nó được sử dụng để lưu trữ phương tiện / tệp tĩnh và cơ sở dữ liệu sqlite trong quá trình phát triển. Mọi thứ trong tmp có thể bị xóa bất cứ lúc nào mà không có vấn đề gì.

Virtualenv

Tôi thích virtualenvwrappervà đặt tất cả các venvs vào ~/.venvsthư mục, nhưng bạn có thể đặt nó bên trong tmp/để giữ nó cùng nhau.

Mẫu dự án

Tôi đã tạo mẫu dự án cho thiết lập này, django-start-template

Triển khai

Triển khai dự án này như sau:

source $VENV/bin/activate
export DJANGO_SETTINGS_MODULE=project_name.settings.production
git pull
pip install -r requirements.txt

# Update database, static files, locales
manage.py syncdb  --noinput
manage.py migrate
manage.py collectstatic --noinput
manage.py makemessages -a
manage.py compilemessages

# restart wsgi
touch project_name/wsgi.py

Bạn có thể sử dụng rsyncthay vì git, nhưng bạn vẫn cần chạy hàng loạt lệnh để cập nhật môi trường của mình.

Gần đây, tôi đã tạo một [django-deploy][2]ứng dụng, cho phép tôi chạy một lệnh quản lý duy nhất để cập nhật môi trường, nhưng tôi chỉ sử dụng nó cho một dự án và tôi vẫn đang thử nghiệm nó.

Phác thảo và bản nháp

Dự thảo mẫu tôi đặt trong templates/thư mục toàn cầu . Tôi đoán người ta có thể tạo thư mục sketches/trong root dự án, nhưng chưa sử dụng nó.

Ứng dụng cắm

Các ứng dụng này thường được chuẩn bị để xuất bản dưới dạng nguồn mở. Tôi đã lấy ví dụ dưới đây từ django-forme

~/projects/django-app/

docs/
app/
tests/
example_project/
LICENCE
MANIFEST.in
README.md
setup.py
pytest.ini
tox.ini
.travis.yml
...

Tên của các thư mục là rõ ràng (tôi hy vọng). Tôi đặt các tệp kiểm tra bên ngoài thư mục ứng dụng, nhưng nó thực sự không quan trọng. Điều quan trọng là cung cấp READMEsetup.py, vì vậy gói dễ dàng được cài đặt thông qua pip.


Cảm ơn bạn! Tôi thích cấu trúc của bạn. Nó đã cho tôi những ý tưởng hữu ích. Những điểm hay về việc sử dụng setup.py cho các yêu cầu và cài đặt Manage.txt vào PATH. Bạn có thể vui lòng chỉ ra cách bạn làm điều cuối cùng? Cũng là điểm tốt về thư mục 'tmp'. Tôi muốn đặt tên nó là 'địa phương', sau đó tôi có thể có 'env', 'tmp' và bất cứ thứ gì bên trong. Điều này giải quyết vấn đề có quá nhiều giao dịch với gitignore. Một vấn đề mới là tên này quá gần với 'địa phương'. Có lẽ sẽ rất hợp lý khi chuyển 'ngôn ngữ' sang ứng dụng cốt lõi 'project_name', không chắc chắn. Chỉ không muốn thay đổi cấu trúc vì tên xấu. Bất kỳ đề xuất?
raacer

Khi sử dụng setup.py, hãy thêm scriptsđối số từ khóa: github.com/elvard/django-start-template/blob/master/project/ nam Tôi thích tmpvì nó gợi ý "cái gì đó tạm thời" có thể được gỡ bỏ bất cứ lúc nào. Toplevel localedir không cần thiết, bạn có thể đặt nó ở bất cứ đâu. Tôi chỉ muốn nó phù hợp với các thư mục tĩnh / mẫu.
Tomáš Ehrlich

Yêu cầu của tôi về khả năng tạo một số bản sao của các tệp nguồn mà không sao chép các tệp khác không được giải quyết trực tiếp. Nhưng mục tiêu vẫn có thể được lưu trữ bằng cách sử dụng git checkouthoặc bằng cách loại trừ chỉ một thư mục 'tmp' khi nhân bản thư mục dự án. Vì vậy, có vẻ như cấu trúc của bạn đáp ứng tất cả các yêu cầu, và nó đủ rõ ràng để sử dụng thường xuyên mà không có nghi ngờ gì. Tôi đang chấp nhận câu trả lời của bạn. Cảm ơn bạn.
raacer

Cảm ơn bạn. Tôi vẫn không hiểu ý của bạn là "khả năng tạo một số bản sao của tệp nguồn mà không sao chép tệp khác". Lệnh rsync được tinh chỉnh sẽ làm được, nhưng đó không phải là ý của bạn ...
Tomáš Ehrlich

Tôi thường tạo dir srcbên trong root dự án. Đây là bản sao làm việc của các tệp nguồn và gốc kho git. Tôi có thể thực hiện một số bản sao của thư mục này - src, src.bak, src_tmpvà vân vân. Khác dirs phi repo như env, tmp, media, backupcư trú trên cùng cấp. Vì vậy, tôi có thể cp -r src src.bakbất cứ lúc nào tôi muốn thực hiện một số thử nghiệm với git hoặc so sánh các phiên bản với công cụ bên ngoài. Trong khi bạn có các tệp cục bộ bên trong kho lưu trữ của mình, tôi có kho lưu trữ bên trong thư mục tệp cục bộ của mình (ngược lại). Tên tốt hơn của srcdir của tôi là repo.
raacer

19

Câu trả lời của tôi được truyền cảm hứng từ kinh nghiệm làm việc của riêng tôi, và chủ yếu là trong cuốn sách Two Scoops of Django mà tôi rất khuyến khích, và nơi bạn có thể tìm thấy một lời giải thích chi tiết hơn về mọi thứ. Tôi sẽ chỉ trả lời một số điểm, và bất kỳ cải thiện hoặc điều chỉnh sẽ được hoan nghênh. Nhưng cũng có thể có cách cư xử đúng đắn hơn để đạt được cùng một mục đích.

Các dự án
Tôi có một thư mục chính trong thư mục cá nhân của tôi, nơi tôi duy trì tất cả các dự án nơi tôi đang làm việc.

Nguồn tập tin
cá nhân tôi sử dụng root dự án django làm kho lưu trữ gốc của các dự án của tôi. Nhưng trong cuốn sách được khuyến khích để tách cả hai thứ. Tôi nghĩ rằng đây là một cách tiếp cận tốt hơn, vì vậy tôi hy vọng sẽ bắt đầu thực hiện thay đổi dần dần trong các dự án của mình.

project_repository_folder/
    .gitignore
    Makefile
    LICENSE.rst
    docs/
    README.rst
    requirements.txt
    project_folder/
        manage.py
        media/
        app-1/
        app-2/
        ...
        app-n/
        static/
        templates/
        project/
            __init__.py
            settings/
                __init__.py
                base.py
                dev.py
                local.py
                test.py
                production.py
            ulrs.py
            wsgi.py

Kho lưu trữ
Git hoặc Mercurial dường như là các hệ thống kiểm soát phiên bản phổ biến nhất trong số các nhà phát triển Django. Và các dịch vụ lưu trữ phổ biến nhất để sao lưu GitHubBitbucket .

Môi trường ảo
Tôi sử dụng virtualenv và virtualenvwrapper. Sau khi cài đặt cái thứ hai, bạn cần thiết lập thư mục làm việc của bạn. Của tôi là trên thư mục / home / envs của tôi , vì nó được khuyến nghị trong hướng dẫn cài đặt virtualenvwrapper. Nhưng tôi không nghĩ rằng điều quan trọng nhất là nó được đặt ở đâu. Điều quan trọng nhất khi làm việc với môi trường ảo là luôn cập nhật tệp tests.txt.

pip freeze -l > requirements.txt 


Thư mục dự án Root tĩnh


Thư mục Media Root Project


Root kho lưu trữ README

GIẤY PHÉP
gốc

Tài liệu
gốc Kho lưu trữ. Gói python này có thể giúp bạn thực hiện dễ dàng hơn tài liệu của bạn:

Phác thảo

Ví dụ

Cơ sở dữ liệu


Cảm ơn vì đã chia sẻ kinh nghiệm của bạn. Có rất nhiều thư mục 'dự án *' trong cấu trúc của bạn. Bạn có thể không sử dụng tên như vậy trong cuộc sống thực, phải không? Hãy nói rằng chúng tôi có một dự án 'việc cần làm'. Làm thế nào để bạn đặt tên cho các dir trong trường hợp như vậy? Vấn đề mà tôi thấy trong cấu trúc hiện tại của bạn là trộn kho lưu trữ với các tệp không phải kho lưu trữ (như bạn đã lưu ý ở trên). Có thể khó chịu khi thêm bất kỳ thùng rác nào vào .gitignore, phải không? Một điều đáng ngờ khác là giữ cho env dir cách xa dự án. Liệu nó có ý nghĩa? Tại sao không tạo ~ / docs, ~ / statics và như vậy? Ngay cả git thích ngồi gần các tập tin nguồn.
raacer

Tôi sẽ đặt tên cho chúng: "todo_project" -> todo -> todo (hoặc có thể là todoapp). Tôi nghĩ rằng điều quan trọng là nuôi ong thư mục kho lưu trữ trong thư mục gốc của hệ thống phân cấp direcectory. Nhưng, chỉ là ý kiến ​​của tôi. Về thư mục môi trường, khi bạn cần thiết lập môi trường sản xuất, bạn đã hoàn thành chỉ bằng cách gõ: pip install -U -r tests.txt. Nhưng, như tôi đã nói, không có một giải pháp nào cho mọi thứ.
cor

Vì vậy, đường dẫn đến ứng dụng chính là "dự án / todo_project / todo / todo". Từ "dự án" lặp lại hai lần và từ "việc cần làm" lặp lại ba lần. Điều này có vẻ như "dự án / dự án / my_project / project_dir / dự án / dự án". Những cái tên rất không rõ ràng. Đây là một trong những vấn đề lớn mà tôi đang cố gắng giải quyết trong cấu trúc thư mục của mình. Tôi muốn đặt tên cho các thư mục để dễ hiểu hệ thống phân cấp. Những gì về root kho, bạn có thể giải thích tại sao nó quan trọng? Ngoài ra bạn có thể vui lòng giải thích những gì là tốt về việc giữ envs bên ngoài dir dự án chính?
raacer

13

Tôi không muốn tạo một settings/thư mục mới . Tôi chỉ cần thêm các tệp có tên settings_dev.pysettings_production.pyvì vậy tôi không phải chỉnh sửa BASE_DIR. Cách tiếp cận dưới đây tăng cấu trúc mặc định thay vì thay đổi nó.

mysite/                   # Project
    conf/
        locale/
            en_US/
            fr_FR/
            it_IT/
    mysite/
        __init__.py
        settings.py
        settings_dev.py
        settings_production.py
        urls.py
        wsgi.py
    static/
        admin/
            css/           # Custom back end styles
        css/               # Project front end styles
        fonts/
        images/
        js/
        sass/
    staticfiles/
    templates/             # Project templates
        includes/
            footer.html
            header.html
        index.html
    myapp/                 # Application
        core/
        migrations/
            __init__.py
        templates/         # Application templates
            myapp/
                index.html
        static/
            myapp/
                js/  
                css/
                images/
        __init__.py
        admin.py
        apps.py
        forms.py
        models.py
        models_foo.py
        models_bar.py
        views.py
    templatetags/          # Application with custom context processors and template tags
        __init__.py
        context_processors.py
        templatetags/
            __init__.py
            templatetag_extras.py
    gulpfile.js
    manage.py
    requirements.txt

Tôi nghĩ rằng đây:

    settings.py
    settings_dev.py
    settings_production.py

tốt hơn thế này:

    settings/__init__.py
    settings/base.py
    settings/dev.py
    settings/production.py

Khái niệm này cũng áp dụng cho các tập tin khác.


Tôi thường đặt node_modules/bower_components/trong static/thư mục dự án trong thư mục mặc định .

Thỉnh thoảng một vendor/thư mục cho Gm Submodules nhưng thường thì tôi đặt chúng vào static/thư mục.


4

Đây là những gì tôi làm theo trên hệ thống của tôi.

  1. Tất cả các dự án : Có một thư mục dự án trong thư mục nhà của tôi tức là ~/projects. Tất cả các dự án còn lại bên trong nó.

  2. Dự án cá nhân : Tôi theo một mẫu cấu trúc tiêu chuẩn được sử dụng bởi nhiều nhà phát triển được gọi là django-skel cho các dự án riêng lẻ. Về cơ bản, nó sẽ chăm sóc tất cả các tệp tĩnh và tệp phương tiện và tất cả.

  3. Môi trường ảo : Tôi có một thư mục virtualenvs trong nhà để lưu trữ tất cả các môi trường ảo trong hệ thống tức là ~/virtualenvs. Điều này mang lại cho tôi sự linh hoạt mà tôi biết tất cả những môi trường ảo tôi có và có thể dễ dàng sử dụng

3 ở trên là các phân vùng chính của môi trường làm việc của tôi.

Tất cả các phần khác mà bạn đề cập chủ yếu phụ thuộc vào dự án dựa trên cơ sở dự án (tức là bạn có thể sử dụng các cơ sở dữ liệu khác nhau cho các dự án khác nhau). Vì vậy, họ nên cư trú trong các dự án cá nhân của họ.


Cảm ơn bạn. Có thể khó chịu khi thêm bất kỳ thùng rác nào vào .gitignore khi trộn kho lưu trữ với các tệp không phải kho lưu trữ. Không phải nó? Một số dự án của tôi có tới mười và nhiều tệp và thư mục như vậy, vì vậy điều này thực sự gây ra vấn đề cho tôi. Một điều đáng ngờ khác là giữ cho env dir cách xa dự án. Sự linh hoạt trong giải pháp như vậy là gì? Tại sao không tạo ~ / docs, ~ / statics và như vậy? Ngay cả git thích ngồi gần các tập tin nguồn. Tôi nghĩ tính linh hoạt là khi tôi có thể sao chép / di chuyển / lưu trữ / xóa toàn bộ thư mục dự án bao gồm virtualenv và có thể duy trì nhiều env trong một dự án một cách dễ dàng
raacer

4

Theo Django Project Skeleton, cấu trúc thư mục phù hợp có thể được theo sau là:

[projectname]/                  <- project root
├── [projectname]/              <- Django root
   ├── __init__.py
   ├── settings/
      ├── common.py
      ├── development.py
      ├── i18n.py
      ├── __init__.py
      └── production.py
   ├── urls.py
   └── wsgi.py
├── apps/
   └── __init__.py
├── configs/
   ├── apache2_vhost.sample
   └── README
├── doc/
   ├── Makefile
   └── source/
       └── *snap*
├── manage.py
├── README.rst
├── run/
   ├── media/
      └── README
   ├── README
   └── static/
       └── README
├── static/
   └── README
└── templates/
    ├── base.html
    ├── core
       └── login.html
    └── README

Tham khảo https:// django-project-sk MP.readthedocs.io/en/latest/structure.html để biết cấu trúc thư mục mới nhất.


7
Tôi ghét cách tiếp cận [tên dự án] / [tên dự án]!)
raacer

1
django-project-skeleton không phải là "Tài liệu Django". Sẽ chính xác hơn khi nói "Theo django-project-skeleton, ...".
David Winiecki

0

Bạn có thể sử dụng https://github.com/Mischback/django-project-skotte kho lưu trữ.

Chạy bên dưới lệnh:

$ django-admin startproject --template=https://github.com/Mischback/django-project-skeleton/archive/development.zip [projectname]

Cấu trúc là một cái gì đó như thế này:

[projectname]/                  <- project root
├── [projectname]/              <- Django root
   ├── __init__.py
   ├── settings/
      ├── common.py
      ├── development.py
      ├── i18n.py
      ├── __init__.py
      └── production.py
   ├── urls.py
   └── wsgi.py
├── apps/
   └── __init__.py
├── configs/
   ├── apache2_vhost.sample
   └── README
├── doc/
   ├── Makefile
   └── source/
       └── *snap*
├── manage.py
├── README.rst
├── run/
   ├── media/
      └── README
   ├── README
   └── static/
       └── README
├── static/
   └── README
└── templates/
    ├── base.html
    ├── core
       └── login.html
    └── README
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.