2012-05-30 14 views
16

Jestem nowy w heroku i wypróbowałem prostą aplikację django bez css.Django heroku static dir

Ale ja po prostu dodany plik css w mojej aplikacji i kiedy to zrobić:

git push heroku master 

Statyczny kolekcja plik nie powiedzie:

[...] 
-----> Collecting static files 
Traceback (most recent call last): 
    File "manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
    File "/tmp/build_2unndirli15s7/.heroku/venv/lib/python2.7/site-packages/django/core/management/__init__.py", line 443, in execute_from_command_line 
    utility.execute() 
    File "/tmp/build_2unndirli15s7/.heroku/venv/lib/python2.7/site-packages/django/core/management/__init__.py", line 382, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/tmp/build_2unndirli15s7/.heroku/venv/lib/python2.7/site-packages/django/core/management/base.py", line 196, in run_from_argv 
    self.execute(*args, **options.__dict__) 
    File "/tmp/build_2unndirli15s7/.heroku/venv/lib/python2.7/site-packages/django/core/management/base.py", line 232, in execute 
    output = self.handle(*args, **options) 
    File "/tmp/build_2unndirli15s7/.heroku/venv/lib/python2.7/site-packages/django/core/management/base.py", line 371, in handle 
    return self.handle_noargs(**options) 
    File "/tmp/build_2unndirli15s7/.heroku/venv/lib/python2.7/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 163, in handle_noargs 
    collected = self.collect() 
    File "/tmp/build_2unndirli15s7/.heroku/venv/lib/python2.7/site-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 104, in collect 
    for path, storage in finder.list(self.ignore_patterns): 
    File "/tmp/build_2unndirli15s7/.heroku/venv/lib/python2.7/site-packages/django/contrib/staticfiles/finders.py", line 105, in list 
    for path in utils.get_files(storage, ignore_patterns): 
    File "/tmp/build_2unndirli15s7/.heroku/venv/lib/python2.7/site-packages/django/contrib/staticfiles/utils.py", line 25, in get_files 
    directories, files = storage.listdir(location) 
    File "/tmp/build_2unndirli15s7/.heroku/venv/lib/python2.7/site-packages/django/core/files/storage.py", line 235, in listdir 
    for entry in os.listdir(path): 
OSError: [Errno 2] No such file or directory: '/home/kevin/web/django/appheroku/blogapp/static' 
!  Heroku push rejected, failed to compile Python/django app 

To [email protected]:[...] 
! [remote rejected] master -> master (pre-receive hook declined) 
error: failed to push some refs to '[email protected]:[...]' 

Oto moja settings.py:

[...] 
STATIC_ROOT = '/home/kevin/web/django/appheroku/staticfiles' 

STATIC_URL = '/static/' 

STATICFILES_DIRS = (
    '/home/kevin/web/django/appheroku/blogapp/static', 
) 
[...] 

Url.py:

[...] 
if settings.DEBUG: 
    urlpatterns += staticfiles_urlpatterns() 

Procfile:

web: python appheroku/manage.py collectstatic --noinput; bin/gunicorn_django --workers=4 --bind=0.0.0.0:$PORT appheroku/monblog/settings.py 

Wydaje się nawet '/ home/Kevin/web/django/appheroku/blogapp/static' istnieje katalog, nie jest wykrywany i nie mogę zrozumieć, dlaczego. :(

Proszę mi pomóc ^^

EDIT:

Teraz moja settings.py wygląda następująco:

import os 
PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__)) 
PROJECT_DIR = os.path.join(PROJECT_ROOT,'../blogapp') 
[...] 
STATIC_ROOT = os.path.join(PROJECT_ROOT,'staticfiles/') 
STATIC_URL = '/static/' 
STATICFILES_DIRS = (
    os.path.join(PROJECT_DIR,'static/'), 
) 
[...] 

a teraz statyczne krok kolekcja plik wydaje się działać dobrze:

-----> Collecting static files 
     74 static files copied. 

Wystąpił kolejny problem: w moim procfile, 'appherok u/manage.py "," bin/gunicorn_django "i" appheroku/monblog/settings.py "nie zostały znalezione. Naprawiłem go i teraz mój procfile wygląda następująco:

web: python manage.py collectstatic --noinput; gunicorn_django --workers=4 --bind=0.0.0.0:$PORT monblog.settings 

Aplikacja nie psuje już jednak nadal nie ma css. Oto log:

'2012-05-31T17:35:16+00:00 heroku[router]: GET xxxx-xxxx-number.herokuapp.com/ dyno=web.1 queue=0 wait=0ms service=85ms status=200 bytes=1054 
2012-05-31T17:35:17+00:00 heroku[router]: GET xxxx-xxxx-number.herokuapp.com/static/css/style.css dyno=web.1 queue=0 wait=0ms service=5ms status=404 bytes=2088 
2012-05-31T17:35:17+00:00 heroku[router]: GET xxxx-xxxx-number.herokuapp.com/static/js/jquery-1.7.2.min.js dyno=web.1 queue=0 wait=0ms service=5ms status=404 bytes=2115' 

Edit3:

Tak! działa^^ Problem był w moim urls.py. Napisałem:

[...] 
if not settings.DEBUG: 
    urlpatterns += staticfiles_urlpatterns() 

zamiast

[...] 
if settings.DEBUG: 
    urlpatterns += staticfiles_urlpatterns() 

Błąd nie był w moim wiadomości .. Tak, to było naprawdę trudne, aby mi pomóc. (Przepraszam) Czuję się tak głupio^^ '

Odpowiedz

12

Problem jest bezwzględną ścieżką, której używasz, aby STATIC_ROOT nie znaleziono na serwerze Heroku.

Aby rozwiązać ten problem, należy rozważyć następujące podejście.

W Twojej settings.py:

PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__)) 
STATIC_ROOT= os.path.join(PROJECT_DIR,'staticfiles/') 
STATICFILES_DIRS = (
    os.path.join(PROJECT_ROOT,'static/'), 
) 
+0

Teraz używam tego podejścia z pewnymi modyfikacjami, jak wyjaśniono w mojej edycji. (ponieważ mój statyczny katalog ("static /") znajduje się w katalogu mojej aplikacji ('blogapp /')). Rozwiązuje on mój problem (nawet teraz jestem z innym -_-) – heathen90

+0

Czy 'blogapp /' znajduje się w katalogu nadrzędnym tego pliku ustawień? Wydaje się bardziej prawdopodobne, że 'blogapp,' znajduje się w tym samym katalogu, co plik ustawień, co oznacza, że ​​powinieneś dołączyć do 'blogapp /' zamiast '../ blogapp'. –

+0

appheroku/zawiera katalog monblog /, katalog blogapp/oraz katalog statycznych plików. Katalog blogapp/zawiera plik models.py, plik views.py, admin.py, .. (etc) oraz statyczny/katalog. Katalog monblog/zawiera settings.py, urls.py, etc ... – heathen90

3

Jesteś na dobrej drodze. Co się dzieje, to że Heroku próbuje użyć twojego ustawienia STATICFILES_DIRS (/ home/kevin/web/django/appheroku/blogapp/static), które istnieje lokalnie na twoim komputerze, ale nie będzie istnieć na serwerze Heroku.

Prostym rozwiązaniem jest usunięcie tej linii ze zmiennej staticfiles_dir więc masz:

STATICFILES_DIRS =() 

Następnie domyślnego STATICFILES_FINDERS będzie kopać i powinno być dobrze iść, aby uruchomić aplikację, zarówno lokalnie, jak i wdrożone na Heroku.

+0

Dzięki, rozumiem teraz. Twoje rozwiązanie powoduje zniknięcie błędu "Brak takiego pliku lub katalogu", ale teraz wystąpił błąd podobny do tego: "Traceback (ostatnie ostatnie połączenie): OSError: [Errno 30] System plików tylko do odczytu: '/ home/kevin' – heathen90

+0

Ten nowy błąd powinien zostać naprawiony poleceniem Kay Zhu: jeśli nie ma pokazywanego CSS, jakie są błędy w logu heroku, kiedy próbujesz bezpośrednio przejść na stronę css? Możesz zakończyć rejestrowanie logami "heroku logs --tail" "w wierszu poleceń, aby uzyskać lepszą obsługę od tego, co się zawiesza: – eliotk

+0

GET xxx-xxx-number.herokuapp.com/static/css/style.css dyno = web.1 kolejka = 0 wait = 0ms service = 6ms status = 404 bajty = 2088 – heathen90

1

Dla każdego, kto idzie w jak ja:

Jak @eliotk wskazuje,

PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__)) 
STATIC_ROOT= os.path.join(PROJECT_DIR,'staticfiles/') 
STATICFILES_DIRS =() 

To config chcesz uniknąć FileNotFoundError: [Errno 2] No such file or directory: błędy lub błędy OSError: [Errno 30] Read-only file system:.

Powiązane problemy