2017-02-25 15 views
6

Hôm qua, tôi đã tạo ra bài đăng này: DjangoRestFramework browsable api looks different locally vs when deployed on server?Cách phân phối tệp tĩnh tới AWS khi triển khai ứng dụng Django (`python manage.py collectstatic` không hoạt động)?

Về cơ bản, khi tôi đã làm python manage.py runserver, điều này xuất hiện: local

Nhưng sau khi tôi triển khai nó để AWS (eb deploy), đây là những gì tôi thấy khi truy cập site: on deploy

Câu trả lời cho bài đăng ở trên đã đề cập rằng đó là do các tệp tĩnh của tôi bị thiếu. Vì vậy, tôi đã tìm kiếm cách triển khai các tệp tĩnh trên AWS và xem qua hướng dẫn này: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create-deploy-python-django.html#python-django-update-app

phần "Tạo quản trị viên trang web", nó đề cập đến để phân phối tệp tĩnh, trước tiên tôi phải xác định STATIC_ROOT trong settings.py (Tôi đã làm: STATIC_ROOT = os.path.join(BASE_DIR, "ebdjangoapp/static/")) và sau đó tôi đã làm eb deploy. Tuy nhiên, trang web vẫn trông giống như hình ảnh thứ 2 (không có tệp tĩnh). Sau đó tôi đã thử thực hiện python manage.py collectstatic (điều này đã tạo thư mục tĩnh với thư mục rest_framework bên trong nó, chứa các tệp css v.v.) và sau đó đã làm lại eb deploy nhưng stil của trang trông giống như hình ảnh thứ 2.

Cách các tệp tĩnh vẫn không hiển thị?

Lưu ý, tôi đã tìm kiếm xung quanh và đi qua bài viết này: Django app deployment not loading static files và câu trả lời nói:

"Sau đó, bạn cần để phục vụ settings.STATIC_ROOT tại settings.STATIC_URL qua máy chủ web của bạn lựa chọn, rất thường nginx như một reverse proxy đằng sau của bạn Máy chủ ứng dụng Apache-mod_wsgi. "

Nhưng tôi không biết các máy chủ web (nginx, proxy ngược, Apache-mod_wsgi) hoạt động như thế nào. Tôi có một ứng dụng Django tôi chạy cục bộ với python manage.py runserver, và tôi có AWS beanstalk đàn hồi. Tôi triển khai ứng dụng Django của mình lên AWS bằng cách thực hiện eb deploy. Tôi cần thực hiện các bước nào để các tệp tĩnh xuất hiện khi triển khai (giả sử tôi không biết cấu hình nginx, proxy ngược, v.v.).

+0

Bạn có đang chạy '' python manage.py collectstatic'' bất kỳ lúc nào không? –

+0

@GrahamDumpleton Vâng, tôi đã làm điều đó ngay trước khi tôi thực hiện 'eb deploy'. (Về cơ bản, tôi đã làm nó ở địa phương, và tất cả các tập tin đã được đặt trong thư mục tĩnh, sau đó tôi triển khai nó). – user2719875

Trả lời

9

Có hướng dẫn dứt khoát về việc triển khai ứng dụng django cho AWS Cây đậu đàn hồi từ RealPython - here it is. Nó có toàn bộ phần về các tệp tĩnh và cách cấu hình nó với eb và bạn không cần biết bất kỳ điều gì về nginx/apache, v.v.

Về cơ bản bạn nên xác định container_commands trong cấu hình eb của mình, các lệnh này sẽ được thực hiện sau triển khai ứng dụng đã hoàn tất. Ví dụ migratecollectstatic, vì vậy đây là một ví dụ về phần như vậy trong tập tin cấu hình eb:

container_commands: 
    01_migrate: 
    command: "source /opt/python/run/venv/bin/activate && python iotd/manage.py migrate --noinput" 
    leader_only: true 
    02_collectstatic: 
    command: "source /opt/python/run/venv/bin/activate && python iotd/manage.py collectstatic --noinput" 

option_settings: 
    "aws:elasticbeanstalk:application:environment": 
    DJANGO_SETTINGS_MODULE: "iotd.settings" 
    "PYTHONPATH": "/opt/python/current/app/iotd:$PYTHONPATH" 
    "ALLOWED_HOSTS": ".elasticbeanstalk.com" 
    "aws:elasticbeanstalk:container:python": 
    WSGIPath: iotd/iotd/wsgi.py 
    NumProcesses: 3 
    NumThreads: 20 
    "aws:elasticbeanstalk:container:python:staticfiles": 
    "/static/": "www/static/" 

Chú ý đến aws:elasticbeanstalk:container:python:staticfiles phần. Và bạn cũng nên xác định phần này trong cài đặt django bạn file:

STATIC_ROOT = os.path.join(BASE_DIR, "..", "www", "static") 
STATIC_URL = '/static/' 

tôi sao chép ví dụ này gần như hoàn toàn từ bài viết ở trên, bạn thực sự nên kiểm tra nó, nó là tuyệt vời.

UPD: cách gỡ lỗi các tệp tĩnh bị thiếu. Tôi thường làm điều này (nó liên quan đến sshing để dụ eb của bạn):

  1. Hãy chắc chắn rằng django.contrib.staticfiles được bao gồm trong INSTALLED_APPS tôi.
  2. Kiểm tra url trình điều khiển trình duyệt để thiếu tệp, ví dụ: /static/js/somefile.js
  3. Đảm bảo trong cài đặt django của tôi STATIC_URL giống nhau, ví dụ: /static/.
  4. Kiểm tra giá trị thực tế trong STATIC_ROOT và kiểm tra xem thư mục này có chứa các tệp tĩnh của bạn trong máy chủ sản xuất hay không.
  5. Kiểm tra xem cấu hình eb của tôi là chỉ để sửa thư mục (dưới phần option_settings của bạn trong cấu hình)

Ngoài ra bạn có thể cố gắng thu thập tĩnh vào /static dir trên máy chủ sản xuất của bạn (đó là nơi eb trông cho họ theo mặc định). Nếu đột nhiên nó bắt đầu hoạt động - điều đó có nghĩa là thiết lập của bạn không thể ghi đè cài đặt mặc định và bạn nên kiểm tra xem nơi nào khác nó đã được xác định.

Tôi hy vọng các bước này sẽ giúp bạn tìm đúng hướng.

+0

Cảm ơn bạn đã liên kết. Vì vậy, tôi đã chỉnh sửa 'settings.py' để' STATIC_ROOT' và 'STATIC_URL' là những gì bạn đã đề cập. Sau đó tôi đã tạo một tệp có tên '02_python.config' bên trong thư mục' .ebextensions' và sao chép được dán chính xác những gì bạn đã đăng ở đây. Tôi thay đổi 'iotd' thành' ebdjango' (tên dự án của tôi .. tên ứng dụng của tôi là 'ebdjangoapp'). Sau đó tôi đã thay đổi 'python ebjango/manage.py collectstatic --noinput' thành' python manage.py collectstatic --noinput' (vì đường dẫn python dẫn đến 'ebdjango' rồi). Nhưng nó vẫn không hoạt động (máy chủ vẫn trông giống như hình ảnh thứ 2 tôi đăng). Bất kỳ ý tưởng làm thế nào để gỡ lỗi vấn đề này? – user2719875

+0

Trả lời được cập nhật với các bước gỡ lỗi có thể, hy vọng nó sẽ giúp ích. – valignatev

+0

Bản cập nhật đã giúp ích rất nhiều! Bây giờ, khi tôi để 'STATIC_ROOT = os.path.join (BASE_DIR," static ")' và không đề cập đến 'staticfiles' trong tập tin cấu hình' option_settings', nó hoạt động (vị trí mặc định, như bạn đã đề cập)! Khi tôi đưa ra một đường dẫn tuyệt đối hoặc tương đối đến "aws: elasticbeanstalk: container: python: staticfiles" 'in' option_settings', nó cũng hoạt động. Nhưng khi tôi thay đổi 'STATIC_ROOT' thành' os.path.join (BASE_DIR, "..", "www", "static") 'và làm' "/ static /": "www/static /" 'trong my' option_settings', nó cung cấp một 404 cho các tệp tĩnh. Khi tôi để nó bằng '"/static/":" ../ www/static/"', nó cho một 403 cho tĩnh. – user2719875

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