2015-07-02 9 views
9

Tôi có một ứng dụng web có API và cơ sở dữ liệu được liên kết.django triển khai các điểm cuối web & api riêng biệt trên heroku

Tôi muốn sử dụng cùng một mô hình Django trong API, nhưng có nó được phục vụ riêng biệt bởi các quy trình khác nhau để tôi có thể mở rộng quy mô một cách độc lập.

Tôi cũng không cần API để phân phát nội dung tĩnh hoặc bất kỳ chế độ xem nào khác.

Các biến chứng là các tuyến đường tôi đã xác định có API và chia sẻ tên miền gốc webapp:

http://domain.com/normal/application/stuff 
http://domain.com/api/different/stuff 

và bổ sung các ứng dụng Django của tôi phụ thuộc vào mô hình và các hằng số của nhau (vì vậy hai khác nhau settings.py file với khác nhau INSTALLED_APPS không hoàn toàn giải quyết nó).

Tôi đoán một cách là tôi có thể xác định các quy trình khác nhau trong Procfile của tôi, chỉ bắt đầu ứng dụng Django, nhưng trong một trong các quy trình có thể có các biến môi trường khác nhau? Tôi không nghĩ rằng tôi có thể thay đổi môi trường cho mỗi Proc với heroku:config, tôi nghĩ rằng nó thực sự sẽ là một chỉ thị trong Procfile.

Bất kỳ ai có kinh nghiệm hoặc thông tin chi tiết về điều này? Cảm ơn!

+1

FWIW, vấn đề lớn hơn với những gì bạn muốn làm là không làm thế nào để cấu hình Django, nó là một thực tế là bạn muốn làm cả hai dưới cùng một tên miền. Điều này có nghĩa là bạn không thể chia các ứng dụng được phân đoạn trên các dynos web riêng biệt nếu bạn muốn có thể chia tỷ lệ chúng một cách riêng biệt ở cấp độ của một dyno. Một số máy chủ WSGI cung cấp đủ khả năng cấu hình để phân đoạn một ứng dụng web trong một máy chủ và chỉ định số lượng quy trình/luồng khác nhau cho các phần khác nhau của ứng dụng, nhưng máy chủ gGorn WSGI mà Heroku khuyến cáo không phải là một trong số chúng. –

+0

Tôi vẫn có thể sử dụng một ứng dụng Django/ứng dụng Heroku đơn lẻ nhưng có một settings.py cho một tên miền và một cho một tên miền phụ? – lollercoaster

+0

Bạn có thể làm điều đó nếu bạn đang sử dụng Apache/mod_wsgi làm máy chủ WSGI, nhưng thiết lập Heroku không cho phép chạy với Python 2.7. Chỉ có thể sử dụng nó với Python 3.3+ và sau đó nó vẫn đòi hỏi một số thủ thuật trên một phần của mod_wsgi để cho phép nó được cài đặt trên Heroku. Thật không may không thể đảm bảo rằng Heroku sẽ không thay đổi mọi thứ vì vậy không hoạt động trên Python 3.3+. –

Trả lời

2

Vì Daniel cho biết bạn chỉ có thể sử dụng hai tệp cài đặt, với cơ sở dùng chung. Nếu bạn muốn phân phối một tập con của các url, bạn cũng nên tạo các định nghĩa url riêng biệt trong cài đặt ROOT_URLCONF.

Vì vậy, cấu trúc dự án của bạn sẽ là một cái gì đó như thế này:

project/ 
    project/ 
     settings/ 
      __init__.py 
      base.py 
      normal.py 
      api.py 
     urls/ 
      __init__.py 
      base.py 
      normal.py 
      api.py 
     wsgi/ 
      __init__.py 
      normal.py 
      api.py 

cài đặt/normal.py (analog cho api) sẽ là somthing như thế này:

from .base import * 
ROOT_URLCONF = 'project.urls.normal 
+0

Điều này có vẻ như nó sẽ giải quyết vấn đề.Có bất kỳ khó khăn để làm điều này hơn, nói, chia ứng dụng thành một (bình thường) phục vụ một tên miền và khác (api) phục vụ một tên miền phụ? – lollercoaster

+0

Không phải là tôi có thể nghĩ đến việc chờ đợi – jgadelange

+0

- nếu một yêu cầu đến bằng cách nào mà gunicorn biết được quy trình nào để phục vụ? cả hai quy trình sẽ kiểm tra 'urls.py' của họ? Tôi không nhìn thấy một cách nó có thể cho biết sự khác biệt. – lollercoaster

1

Tôi không nghĩ rằng bạn cần các biến môi trường khác nhau, chỉ cần một tệp WSGI riêng biệt trỏ đến một settings.py khác. Các tệp cài đặt đó có thể nhập cài đặt được chia sẻ từ một tệp chung, sau đó đặt các giá trị cụ thể của chúng cho INSTALLED_APPS. Sau đó, các Procfile có thể tham khảo các tập tin wsgi trong các quá trình riêng biệt.

+0

Hai tệp wsgi và hai tệp cài đặt sẽ hoạt động. Tuy nhiên, nếu có bất kỳ sự phụ thuộc nào giữa các ứng dụng (do đó, không thể xóa ứng dụng khỏi INSTALLED_APPS), nó vẫn sẽ phân phối qua urls.py tất cả các điểm cuối khác nhau, phải không? – lollercoaster

Các vấn đề liên quan