2017-02-12 6 views
1

Ich versuche meine Hände auf dieses Beispiel für WebSockets in Django, https://github.com/jacobian/channels-example, da ich beabsichtige, es meine Produktion Anwendung auch zu verwenden, die in Heroku gehostet wird, und Whitenoise dort verwenden. Also, nach dem Klonen des oben genannten Beispiels, habe ich ein paar Verbesserungen mit Whitenoise, aber jetzt beim ersten Besuch der Anwendung durch einen Browser (Chrom oder FF) die statischen Dateien nicht geladen und wenn ich wieder auffrischen lädt statische Dateien, und in der dritten Ladung geht es wieder ab und so weiter. Hier ist meine Einstellungsdatei:Statische Dateien dienen Problem mit Django-Kanälen

import os 
import random 
import string 
import dj_database_url 

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) 

SECRET_KEY = os.environ.get("SECRET_KEY", "".join(random.choice(string.printable) for i in range(40))) 
DEBUG = os.environ.get("DEBUG", False) 

# Application definition 
INSTALLED_APPS = (
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'channels', 
    'chat', 
) 

MIDDLEWARE_CLASSES = (

    'django.middleware.security.SecurityMiddleware', 
    'whitenoise.middleware.WhiteNoiseMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 

) 

ROOT_URLCONF = 'chat.urls' 

TEMPLATES = (
    { 
     'BACKEND': 'django.template.backends.django.DjangoTemplates', 
     'DIRS': [os.path.join(BASE_DIR, 'templates')], 
     'APP_DIRS': True, 
     'OPTIONS': { 
      'context_processors': [ 
       'django.template.context_processors.debug', 
       'django.template.context_processors.request', 
       'django.contrib.auth.context_processors.auth', 
       'django.contrib.messages.context_processors.messages', 
      ], 
      'debug': DEBUG, 
     }, 
    }, 
) 

# Database 
# https://docs.djangoproject.com/en/1.9/ref/settings/#databases 

DATABASES = { 
    'default': dj_database_url.config(default="postgres:///channels-example", conn_max_age=500) 
} 

AUTH_PASSWORD_VALIDATORS = (
    { 
     'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 
    }, 
    { 
     'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 
    }, 
    { 
     'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 
    }, 
    { 
     'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 
    }, 
) 

# Internationalization 
# https://docs.djangoproject.com/en/1.9/topics/i18n/ 
LANGUAGE_CODE = 'en-us' 
TIME_ZONE = 'UTC' 
USE_I18N = True 
USE_L10N = True 
USE_TZ = True 

# Honor the 'X-Forwarded-Proto' header for request.is_secure() 
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') 

# Allow all host headers 
ALLOWED_HOSTS = ['*'] 

# Static files (CSS, JavaScript, Images) 
# https://docs.djangoproject.com/en/1.9/howto/static-files/ 

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

# Extra places for collectstatic to find static files. 
STATICFILES_DIRS = [ 
    os.path.join(BASE_DIR, 'static'), 
] 

# Channel settings 
CHANNEL_LAYERS = { 
    "default": { 
     "BACKEND": "asgi_redis.RedisChannelLayer", 
     "CONFIG": { 
      "hosts": [os.environ.get('REDIS_URL', 'redis://localhost:6379')], 
     }, 
     "ROUTING": "chat.routing.channel_routing", 
    }, 
} 

# Logging 
LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
    'handlers': { 
     'console': { 
      'class': 'logging.StreamHandler', 
     }, 
    }, 
    'loggers': { 
     'django': { 
      'handlers': ['console'], 
      'propagate': True, 
      'level': 'INFO' 
     }, 
     'chat': { 
      'handlers': ['console'], 
      'propagate': False, 
      'level': 'DEBUG', 
     }, 
    }, 
} 

STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage' 

Hier die andere Datei ist, die ich Änderungen an routing.py gemacht:

from channels.staticfiles import StaticFilesConsumer 
from . import consumers 

channel_routing = { 
    # This makes Django serve static files from settings.STATIC_URL, similar 
    # to django.views.static.serve. This isn't ideal (not exactly production 
    # quality) but it works for a minimal example. 
    # 'http.request': StaticFilesConsumer(), 

    # Wire up websocket channels to our consumers: 
    'websocket.connect': consumers.ws_connect, 
    'websocket.receive': consumers.ws_receive, 
    'websocket.disconnect': consumers.ws_disconnect, 
} 

procfile ist:

web: daphne chat.asgi:channel_layer --port $PORT --bind 0.0.0.0 -v2 
worker: python manage.py runworker -v2 

ich es nicht versucht haben, auf Heroku, als ob jetzt, nur auf localhost ich beobachtete dieses Verhalten so nicht sogar die Lösung mit der ursprünglichen Anwendung zu integrieren. Ich benutzte Heroku local, um die Anwendung lokal auszuführen.

Was mache ich falsch? Und ist der in Procfile-Produktion auf Heroku erwähnte Prozess?

Dank

Antwort

0

Versuchen Sie, Ihre Django Kanäle 1.0.3 und 3.3.0 Whitenoise das Beispiel, das Sie erwähnt verwenden eine veraltete Version und einige Fehlerbehebungen Upgrade wo hinzugefügt Daphne, damit statische Inhalte mit Whitenoise dienen. Alternativ können Sie auch s3 bucket nutzen, um Ihren statischen Inhalt zu bedienen. Dies ist der bevorzugte Ansatz, um statische Inhalte mit Django zu liefern.

https://github.com/django/channels/issues/87

Verwandte Themen