2016-10-17 3 views
0

In meiner Django-Ansicht verwende ich self.request.user, um den Benutzer eines REST Framework-API-Aufrufs zu identifizieren. Das funktioniert gut, wenn das Django-Projekt auf einem Server auf meinem Laptop läuft, der Code den Benutzer korrekt aufnimmt.Django-Sitzung funktioniert auf dem lokalen Server, aber nicht auf dem AWS-Server

Ich versuche jetzt, mein Django-Projekt auf AWS EB zu starten und habe das Problem, dass der den Benutzer nicht mehr identifiziert. Der App-Code, der den API-Aufruf durchführt, ist genau der gleiche wie der Django-Servercode.

Muss ich meine Servereinstellungen irgendwie anpassen? Mein settings.py sieht wie folgt aus:

import os 

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

SECRET_KEY = '9-s0gj3$)(--+mgc^3qhy=iva#[email protected]=' 

DEBUG = True 

ALLOWED_HOSTS = [] 

INSTALLED_APPS = [ 
    'grappelli', 
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'django.contrib.sites', 
    'allauth', 
    'allauth.account', 
    'allauth.socialaccount', 
    'allauth.socialaccount.providers.facebook', 
    'allauth.socialaccount.providers.google', 
    'allauth.socialaccount.providers.linkedin', 
    'allauth.socialaccount.providers.twitter', 
    'corsheaders', 
    'rest_framework', 
    'rest_framework.authtoken', 
    'rest_auth', 
    'imagekit', 
    #'blog', 
    'storages', 
    'items', 
    'userprofile', 
    'dashboard', 
    'twip', 
    'django.contrib.gis' 
] 

SITE_ID = 1 

MIDDLEWARE_CLASSES = [ 
    'django.middleware.security.SecurityMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'corsheaders.middleware.CorsMiddleware', 
    '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 = 'mysite.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', 
       "django.core.context_processors.request", 
      ], 
     }, 
    }, 
] 

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend', 
    'allauth.account.auth_backends.AuthenticationBackend', 
    ) 

LOGIN_REDIRECT_URL = '/' 

SOCIALACCOUNT_QUERY_EMAIL = True 

SOCIALACCOUNT_PROVIDERS = { 
    'facebook': { 
     'SCOPE': ['email', 'publish_stream'], 
     'METHOD': 'js_sdk' # instead of 'oauth2' 
    } 
} 

# :TO DO: Remove this when we test proper email confirmation on the EB server. This sends confirmation email to the console 
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' 

WSGI_APPLICATION = 'mysite.wsgi.application' 

# Postgresql database on AWS server 
DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.postgresql_psycopg2', 
     'NAME': '', 
     'USER' : '', 
     'PASSWORD' : '', 
     'HOST': '', 
     'PORT': '5432', 
    } 
} 

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 
LANGUAGE_CODE = 'en-us' 

TIME_ZONE = 'Europe/Berlin' 

USE_I18N = True 

USE_L10N = True 

USE_TZ = True 


# STORE STATIC AND MEDIA FILES 
AWS_STORAGE_BUCKET_NAME = 'yhistory' 
AWS_ACCESS_KEY_ID = 'AKAAAA6AAAAYQ5JODCEA' 
AWS_SECRET_ACCESS_KEY = 'AAAATtVeCZLaAAAAQQxZ9g5biTJnAAAA7PP8YrlC' 
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME 

# Location of static files 
STATICFILES_LOCATION = 'static' 
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) 
STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static') 
STATIC_URL = '/static/' 
STATICFILES_DIRS = (os.path.join('static'),) 

# Location of media files (photos etc.) 
MEDIAFILES_LOCATION = 'media' 
MEDIA_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, MEDIAFILES_LOCATION) 
DEFAULT_FILE_STORAGE = 'custom_storages.MediaStorage' 


REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': ['rest_framework.authentication.TokenAuthentication'], 
    'DEFAULT_PERMISSION_CLASSES': [], 
    'PAGE_SIZE': 1000, # Max number of results returned from a list API call 
    'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend',), 
    # Use JSONRender so the Web API interface is not shown. This is needed when testing the app on the same server 
    'DEFAULT_RENDERER_CLASSES': (
     'rest_framework.renderers.JSONRenderer', 
    ) 
} 

CORS_ORIGIN_ALLOW_ALL = True # :PRODUCTION: Change this! If set to False the CORS whitelist is used 
CORS_ORIGIN_WHITELIST =() 
""" 
CORS_ORIGIN_WHITELIST = (
    'twip.co', 
    '127.0.0.1' 
) 
""" 
CORS_ORIGIN_REGEX_WHITELIST =() 
CORS_URLS_REGEX = '^.*$' 
CORS_ALLOW_METHODS = (
    'GET', 
    'POST', 
    'PUT', 
    'PATCH', 
    'DELETE', 
    'UPDATE', 
    'OPTIONS' 
) 
CORS_ALLOW_HEADERS = (
    'x-requested-with', 
    'content-type', 
    'accept', 
    'origin', 
    'authorization', 
    'x-csrftoken' 
) 
CORS_EXPOSE_HEADERS =() 
CORS_ALLOW_CREDENTIALS = False 

GRAPPELLI_ADMIN_TITLE = "The World Image Archive Admin Panel" 
+0

Was passiert, wenn Sie Sitzungscookies für loc löschen? Alhost? Scheint, als ob Sie den Benutzer lokal authentifiziert haben, aber nicht auf AWS –

+0

Die API-Aufrufe kommen von einer iOS-App. Ich habe die App gelöscht und neu installiert. –

+0

Ich bin nicht genug vertraut mit iOS. Sind Sie sicher, dass eine Neuinstallation der App den Cookie-Speicher löscht? Sie könnten versuchen, den HTTP-Verkehr zwischen der App und dem Server zu erfassen und sehen, was Sie in den HTTP-Headern sehen, die zwischen den beiden ausgetauscht werden. Oder starte die App im Entwickler-Emulator. –

Antwort

1

möglich Lösungsmöglichkeiten:

Rest mit dem folgenden Snippet-Code Framework Standard-Authentifizierung ersetzen

'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework.authentication.SessionAuthentication', 
     'rest_framework.authentication.TokenAuthentication', 
    ) 

diese Zeile in Ihrer settings.py Datei hinzufügen für Details click here

WSGIPassAuthorization On 
+0

Danke Amir. Meine App verwendet Token-Authentifizierung, die funktioniert, wenn der Django-Code auf meinem Laptop ausgeführt wird. Ich hatte zuvor die Einstellung für die Sitzungsauthentifizierung, musste diese jedoch entfernen, um sie zum Laufen zu bringen. Was ist WSGIPassAuthorization On? Wo soll ich das hinstellen? –

+0

Ich habe dir das gesagt, um "WSGIPassAuthorization On" in deine settings.py-Datei zu setzen und dir einen Detaillink zu geben. danke – Amir

+0

Danke Amir, das hat das Problem behoben. –

Verwandte Themen