2012-05-30 10 views
16

Soy nuevo en heroku y probé una aplicación django simple sin CSS.Django heroku dir estático

Pero me acaba de agregar un archivo css en mi aplicación y cuando hago esto:

git push heroku master 

La colección de archivos estáticos falla:

[...] 
-----> 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]:[...]' 

Aquí es mi settings.py:

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

STATIC_URL = '/static/' 

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

Las urls.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 

Parece incluso el '/ home/Kevin/web/django/appheroku/blogapp/estática' existe el directorio, no se detecta y no puedo entender por qué. :(

por favor me ayude ^^

EDIT:

Ahora mi settings.py se parece a esto:

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/'), 
) 
[...] 

Y ahora la etapa de recogida de archivo estático parece funcionar bien:

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

Hubo otro problema: en mi archivo, 'appherok u/manage.py ',' bin/gunicorn_django 'y' appheroku/monblog/settings.py 'no se encontraron. lo arreglé y ahora mi procfile se ve así:

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

La aplicación no se bloquea más, pero todavía no hay css. Aquí está el registro:

'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:

Sí! funciona ^^ El problema estaba en mi urls.py. Escribí:

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

en lugar de

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

El error fue no en mi mensaje .. Sí, fue muy difícil para que me ayude. (Lo siento) Me siento tan estúpido ^^ '

Respuesta

12

El problema es que la ruta absoluta que está utilizando para STATIC_ROOT no se encuentra en el servidor Heroku.

Para resolverlo, considere el siguiente enfoque.

En su 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

Ahora uso este enfoque con algunas modificaciones como se explica en mi edición. (porque mi dir estático ('static /') está dentro de mi aplicación dir ('blogapp /')). Resuelve mi problema (incluso ahora estoy con otro -_-) – heathen90

+0

¿'blogapp /' está en el directorio principal de este archivo de configuración? Parece más probable que 'blogapp,' esté en el mismo directorio que el archivo de configuración, lo que significa que debes unirte 'blogapp /' en lugar de '../ blogapp'. –

+0

appheroku/contiene el directorio monblog /, el directorio blogapp/y el directorio staticfiles. El directorio blogapp/contiene el archivo models.py, el archivo views.py, el admin.py, .. (etc) y el static/dir. El directorio monblog contiene el settings.py, el urls.py, etc ... – heathen90

3

Estás en camino. Lo que sucede es que Heroku está intentando usar tu configuración de STATICFILES_DIRS (/ home/kevin/web/django/appheroku/blogapp/static) que existe localmente en tu máquina pero que no existirá en el servidor de Heroku.

Una solución sencilla es eliminar esa frase de la variable staticfiles_dir por lo que tiene:

STATICFILES_DIRS =() 

A continuación, sus STATICFILES_FINDERS defecto entrará en funcionamiento y que debe ser bueno para ir a ejecutar su aplicación tanto a nivel local, así como desplegado en Heroku.

+0

Gracias, ahora entiendo. Su solución hace desaparecer el error "No existe ese archivo o directorio", pero ahora hay un error como este: "Traza (última llamada más reciente): OSError: [Errno 30] Sistema de archivos de solo lectura: '/ home/kevin' – heathen90

+0

Para que se corrija el nuevo error con la recomendación de Kay Zhu. En cuanto a que no se muestre CSS, ¿cuáles son los errores en el registro heroku cuando intenta ir a una página CSS directamente? Puede alinear el registro con "registros heroku --tail "en la línea de comandos para obtener un mejor manejo de lo que cuelga es – eliotk

+0

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

1

Para cualquier persona que está entrando como yo:

Como @eliotk implica,

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

Esta es la configuración que desea evitar FileNotFoundError: [Errno 2] No such file or directory: errores o OSError: [Errno 30] Read-only file system: errores.

Cuestiones relacionadas