2017-02-25 41 views
6

Wczoraj stworzył ten wpis: DjangoRestFramework browsable api looks different locally vs when deployed on server?Jak wyświetlać pliki statyczne w AWS podczas wdrażania aplikacji Django (`python manage.py collectstatic` nie działa)?

Zasadniczo, kiedy zrobiłem python manage.py runserver, to pokazał się: local

Ale po wdrożeniu go do AWS (eb deploy), to jest to, co widzę, kiedy dostęp do site: on deploy

Odpowiedź na wyżej wymieniony post jest taka, że ​​brakowało moich statycznych plików. Więc szukałem sposobu wdrażania pliki statyczne na AWS i natknąłem się na tym kursie: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create-deploy-python-django.html#python-django-update-app

W sekcji „Tworzenie administratora strony”, wspomina, że ​​w celu obsługi plików statycznych, muszę najpierw zdefiniować STATIC_ROOT w settings.py (tak Zrobiłem: STATIC_ROOT = os.path.join(BASE_DIR, "ebdjangoapp/static/")), a następnie zrobiłem eb deploy. Jednak strona wciąż wygląda tak samo jak drugi obraz (bez plików statycznych). Następnie próbowałem wykonać python manage.py collectstatic (w ten sposób utworzyłem katalog statyczny z katalogiem rest_framework w środku, zawierający pliki css itd.), A następnie ponownie zrobiłem eb deploy, ale stilowanie witryny wygląda tak samo jak drugie zdjęcie.

Dlaczego statyczne pliki nadal się nie wyświetlają?

Uwaga, szukałem wokół i natknąłem się na to stanowisko: Django app deployment not loading static files a odpowiedź mówi:

„Następnie trzeba służyć settings.STATIC_ROOT na settings.STATIC_URL poprzez serwer WWW z wyboru, bardzo często nginx jako reverse proxy za swoje Serwer aplikacji Apache-mod_wsgi. "

Ale nie mam pojęcia, jak działają serwery WWW (nginx, reverse proxy, Apache-mod_wsgi). Mam aplikację Django, którą uruchamiam lokalnie z python manage.py runserver, i mam elastyczną fasolkę AWS. Wdrażam moją aplikację Django do AWS, wykonując eb deploy. Jakie kroki muszę podjąć, aby pliki statyczne pojawiły się przy wdrażaniu (zakładając, że nie wiem, jak skonfigurować Nginx, Reverse Proxy itp.).?

+0

Czy używasz '' python manage.py collectstatic'' w dowolnym momencie? –

+0

@GrahamDumpleton Tak, zrobiłem to zanim zrobiłem 'eb deploy'. (Zasadniczo zrobiłem to lokalnie, a wszystkie pliki zostały umieszczone w folderze statycznym, a następnie wdrożyłem go). – user2719875

Odpowiedz

9

Istnieje ostateczny przewodnik na temat wdrażania aplikacji django do AWS Elastic Beanstalk z RealPython - here it is. Ma całą sekcję o plikach statycznych i jak skonfigurować go z EB i nie trzeba nic wiedzieć o nginx/apache itp

Zasadniczo należy zdefiniować container_commands w config eb, polecenia te będą realizowane po wdrożenie aplikacji zostało zakończone. Na przykład migrate i collectstatic, więc jest to przykład takiej sekcji w pliku konfiguracyjnym 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/" 

zwrócić uwagę na aws:elasticbeanstalk:container:python:staticfiles część. A także należy zdefiniować tę część w ustawieniach django file:

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

skopiowałem ten przykład niemal w całości z artykułu powyżej, naprawdę powinieneś to sprawdzić, to niesamowite.

UPD: jak debugować brakujące pliki statyczne. zwykle zrobić to (wiąże sshing z wystąpieniem EB):

  1. Upewnij się, że django.contrib.staticfiles jest wliczone w moim INSTALLED_APPS.
  2. Sprawdź w adresie URL przeglądarki do brakującego pliku, np. /static/js/somefile.js
  3. Upewnij się, że w moich ustawieniach django STATIC_URL jest taki sam, np. /static/.
  4. Sprawdź aktualną wartość w STATIC_ROOT i sprawdź, czy ten folder rzeczywiście zawiera twoje pliki statyczne na serwerze produkcyjnym.
  5. Sprawdź, czy mój eb config jest skierowany do odpowiedniego folderu (w ramach sekcji option_settings w config)

Ponadto można spróbować zebrać statyczny do /static katalogu na serwerze produkcyjnym (to gdzie eb wygląda dla nich domyślnie). Jeśli nagle zaczyna działać, oznacza to, że twoje ustawienie nie zastąpiło domyślnego i powinieneś sprawdzić, gdzie jeszcze został zdefiniowany.

Mam nadzieję, że te kroki pomogą ci znaleźć właściwy kierunek.

+0

Dzięki za link. Tak więc edytowałem 'settings.py', aby wspomnieć o' STATIC_ROOT' i 'STATIC_URL'. Następnie utworzyłem plik o nazwie '02_python.config' w folderze' .ebextensions' i skopiowałem dokładnie to, co napisałeś tutaj. Zmieniam 'iotd' na' ebdjango' (nazwa mojego projektu .. moja nazwa aplikacji to 'ebdjangoapp'). Następnie zmieniłem 'python ebjango/manage.py collectstatic --noinput' na' python manage.py collectstatic --noinput' (ponieważ ścieżka python prowadzi już do 'ebdjango'). Ale nadal nie działa (serwer nadal wygląda jak drugi obraz, który napisałem). Masz pomysł, jak rozwiązać ten problem? – user2719875

+0

Odpowiedź zaktualizowana z możliwymi krokami debugowania, mam nadzieję, że to pomoże. – valignatev

+0

Aktualizacja bardzo pomogła! Teraz, kiedy wpuściłem 'STATIC_ROOT = os.path.join (BASE_DIR," static ")' i nie wspominam 'staticfiles' w moim pliku konfiguracyjnym' options_settings', działa (domyślna lokalizacja, jak wspomniałeś)! Kiedy podaję absolutną lub względną ścieżkę do '" aws: elasticbeanstalk: container: python: staticfiles "' in 'option_settings', to również działa. Ale gdy zmienię 'STATIC_ROOT' na' os.path.join (BASE_DIR, "..", "www", "static") 'i zrobię' "/ static /": "www/static /" 'in my' option_settings', daje 404 dla plików statycznych. Kiedy pozwolę mu równać '"/static/":" ../ www/static/"', daje 403 dla statycznego. – user2719875