web-dev-qa-db-fra.com

Django Rest Framework - Répertoire statique manquant

J'ai récemment démarré un serveur Digital Ocean avec une image Django préinstallée sur Ubuntu 14.04. Je voulais créer une API et ai opté pour Django Rest Framework. J'ai installé le Django Rest Framework exactement selon http://www.Django-rest-framework.org/ .

Voici à quoi ressemble le site du didacticiel lorsque j'y accède sur mon serveur.

enter image description here

Comme vous pouvez le constater, le site Web du tutoriel relatif à la structure restante ne ressemble pas à celui du site. Ceci est dû au fait que lorsque je visualise le code source de mon site, tous les fichiers /static/rest_framework/* me donnent une erreur 404.

Voici mon fichier settings.py dans le répertoire racine de Django 'Django_project'.

"""
Django settings for Django_project project.

For more information on this file, see
https://docs.djangoproject.com/en/1.6/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.6/ref/settings/
"""

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.6/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '7Vnib8zBUEV3LfacGKi2rT185N36A8svyq8azJLvNpv7BxxzMK'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

TEMPLATE_DEBUG = True

ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = (
    'Django.contrib.admin',
    'Django.contrib.auth',
    'Django.contrib.contenttypes',
    'Django.contrib.sessions',
    'Django.contrib.messages',
    'Django.contrib.staticfiles',
    'rest_framework',
)

REST_FRAMEWORK = {
    # Use hyperlinked styles by default.
    # Only used if the `serializer_class` attribute is not set on a view.
    'DEFAULT_MODEL_SERIALIZER_CLASS':
        'rest_framework.serializers.HyperlinkedModelSerializer',

    # Use Django's standard `Django.contrib.auth` permissions,
    # or allow read-only access for unauthenticated users.
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
    ]
}

MIDDLEWARE_CLASSES = (
    'Django.contrib.sessions.middleware.SessionMiddleware',
    'Django.middleware.common.CommonMiddleware',
    'Django.middleware.csrf.CsrfViewMiddleware',
    'Django.contrib.auth.middleware.AuthenticationMiddleware',
    'Django.contrib.messages.middleware.MessageMiddleware',
    'Django.middleware.clickjacking.XFrameOptionsMiddleware',
)

ROOT_URLCONF = 'Django_project.urls'

WSGI_APPLICATION = 'Django_project.wsgi.application'


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

DATABASES = {
    'default': {
        'ENGINE': 'Django.db.backends.postgresql_psycopg2',
        'NAME': 'Django',
        'USER': 'Django',
        'PASSWORD': 'yj4SM6qcP0',
        'Host': 'localhost',
        'PORT': '',
    }
}

# Internationalization
# https://docs.djangoproject.com/en/1.6/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


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

STATIC_URL = '/static/'

Quelqu'un peut-il m'aider à corriger cette erreur manquante/statique/rest_framework/location? Si je vais avoir une API pour mon application, j'aimerais qu'elle soit belle.

Faites-moi savoir si vous avez besoin de quelque chose d'autre pour vous aider à résoudre ce problème, et merci d'avance pour votre aide.

16
BigBerger

J'ai trouvé la solution à mon problème!

Après beaucoup de recherches ahurissantes, j'ai relu cette question de débordement de pile qui ne semblait pas m'aider la dernière fois que je l'ai regardée.

Mon nouveau fichier settings.py dans mon dossier Django_project ressemble maintenant à ceci.

"""
Django settings for Django_project project.

For more information on this file, see
https://docs.djangoproject.com/en/1.6/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.6/ref/settings/
"""

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.6/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'DwGCDqtcqzzGO2XK87u7bVSEUqHogZRFl4UdhkcCudSHxLUVvx'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

TEMPLATE_DEBUG = True

ALLOWED_HOSTS = ['*']


# Application definition

INSTALLED_APPS = (
    'Django.contrib.admin',
    'Django.contrib.auth',
    'Django.contrib.contenttypes',
    'Django.contrib.sessions',
    'Django.contrib.messages',
    'Django.contrib.staticfiles',
    'rest_framework',
)

REST_FRAMEWORK = {
    # Use hyperlinked styles by default.
    # Only used if the `serializer_class` attribute is not set on a view.
    'DEFAULT_MODEL_SERIALIZER_CLASS':
        'rest_framework.serializers.HyperlinkedModelSerializer',

    # Use Django's standard `Django.contrib.auth` permissions,
    # or allow read-only access for unauthenticated users.
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
    ]
}

MIDDLEWARE_CLASSES = (
    'Django.contrib.sessions.middleware.SessionMiddleware',
    'Django.middleware.common.CommonMiddleware',
    'Django.middleware.csrf.CsrfViewMiddleware',
    'Django.contrib.auth.middleware.AuthenticationMiddleware',
    'Django.contrib.messages.middleware.MessageMiddleware',
    'Django.middleware.clickjacking.XFrameOptionsMiddleware',
)

ROOT_URLCONF = 'Django_project.urls'

WSGI_APPLICATION = 'Django_project.wsgi.application'


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

DATABASES = {
    'default': {
        'ENGINE': 'Django.db.backends.postgresql_psycopg2',
        'NAME': 'Django',
        'USER': 'Django',
        'PASSWORD': 'mpOQzpYFci',
        'Host': 'localhost',
        'PORT': '',
    }
}

# Internationalization
# https://docs.djangoproject.com/en/1.6/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


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

STATIC_ROOT = '/home/Django/django_project/Django_project/static'
STATIC_URL = '/static/'

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

J'ai maintenant un dossier nommé 'statique' juste à côté de mon fichier settings.py dans mon dossier Django_project avec toutes les ressources nécessaires telles que 'rest_framework' et 'admin'. J'ai relancé gunicorn après ce changement et rechargé ma page Web et cela a fonctionné!

Merci à ceux d'entre vous qui ont essayé d'aider, vous m'avez conduit dans la bonne direction et avez probablement accéléré le processus.

14
BigBerger

Tout d'abord, vous devez définir une URL statique et une racine statique dans Django settings.py

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

Puis collectez tous les fichiers statiques

python manage.py collectstatic
1
Rajiv Sharma

Je ne parvenais pas à utiliser l'une des solutions ci-dessus sur notre application Web, mais j'ai découvert que si l'application peut se connecter à un compartiment S3 où elle peut accéder à des fichiers statiques déployés, Django rest_framework fonctionne assez facilement (comme expliqué ci-après ici ). . Voici le code approprié pour notre settings.py:

    aws = pcfenv.get_service(label='aws-s3') # or however you are accessing your s3 bucket & credentials

    if aws is not None:
        keys = aws.credentials
        AWS_ACCESS_KEY_ID = keys["access_key_id"]
        AWS_SECRET_ACCESS_KEY = keys["secret_access_key"]
        AWS_STORAGE_BUCKET_NAME = keys["bucket"]
        AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
        AWS_S3_OBJECT_PARAMETERS = {
            'CacheControl': 'max-age=86400',
        }
        AWS_LOCATION = 'static'
        STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
        STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION)
        DEFAULT_FILE_STORAGE = 'mysite.storage_backends.MediaStorage'

    # static files
    STATIC_URL = '/static/'
    STATIC_ROOT = 'static/'

    # local storage
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
    MEDIA_URL = '/media/uploads/'

Vous aurez besoin d'installer les dépendances boto3 et Django-storages pour que tout fonctionne.

0
k80oshea