2017-04-27 55 views
1

我正在创建一个API,我的应用程序没有将用户信息保存到POSTGRES数据库。有人可以看看我的代码,并告诉我什么是错的?DJANGO/Heroku没有保存到数据库POSTGRES

SECRET_KEY = os.environ['SECRET_KEY'] 
ALLOWED_HOSTS = ['salty-sands-40947.herokuapp.com','.herokuapp.com'] 
DEBUG = True 

# Application definition 

INSTALLED_APPS = [ 
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'aroomieapp', 
    'oauth2_provider', 
    'social_django', 
    'social.apps.django_app.default', 
    'rest_framework_social_oauth2', 
    "push_notifications" 
] 

MIDDLEWARE = [ 
    'django.middleware.security.SecurityMiddleware', 
    '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 = 'aroomie.urls' 

TEMPLATES = [ 
    { 
     'BACKEND': 'django.template.backends.django.DjangoTemplates', 
     'DIRS': [], 
     '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.template.context_processors.media', 
            'social_django.context_processors.backends', 
            'social_django.context_processors.login_redirect', 
      ], 
     }, 
    }, 
] 

WSGI_APPLICATION = 'aroomie.wsgi.application' 


# Database 

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.sqlite3', 
     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 
    } 
} 


# Password validation 

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.10/topics/i18n/ 

LANGUAGE_CODE = 'en-us' 

TIME_ZONE = 'UTC' 

USE_I18N = True 

USE_L10N = True 

USE_TZ = True 


LOGIN_REDIRECT_URL = '/' 

# Setting the image path in server 
MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 
MEDIA_URL = '/media/' 

# This package help us to replace our database with Postgresql 
import dj_database_url 
db_from_env = dj_database_url.config() 
DATABASES['default'].update(db_from_env) 

AUTHENTICATION_BACKENDS = (
    # Others auth providers (e.g. Google, OpenId, etc) 

    # Facebook OAuth2 
    'social_core.backends.facebook.FacebookOAuth2', 

    # django-rest-framework-social-oauth2 
    'rest_framework_social_oauth2.backends.DjangoOAuth2', 

    # Django 
    'django.contrib.auth.backends.ModelBackend', 
) 

# Facebook configuration 
SOCIAL_AUTH_FACEBOOK_KEY = os.environ['FACEBOOK_KEY'] 
SOCIAL_AUTH_FACEBOOK_SECRET = os.environ['FACEBOOK_SECRET'] 

# Define SOCIAL_AUTH_FACEBOOK_SCOPE to get extra permissions from facebook. Email is not sent by default, to get it, you must request the email permission: 
SOCIAL_AUTH_FACEBOOK_SCOPE = [ 
    'email', 
    # 'user_birthday', 
] 
SOCIAL_AUTH_FACEBOOK_PROFILE_EXTRA_PARAMS = { 
    'fields': 'id, name, email, age_range, gender' 
} 

# Login process customization purpose 
SOCIAL_AUTH_PIPELINE = (
    'social_core.pipeline.social_auth.social_details', 
    'social_core.pipeline.social_auth.social_uid', 
    'social_core.pipeline.social_auth.auth_allowed', 
    'social_core.pipeline.social_auth.social_user', 
    'social_core.pipeline.user.get_username', 
    'social_core.pipeline.user.create_user', 
    'aroomieapp.social_auth_pipeline.extend_user_profile', # <--- set the path to the function 
    'social_core.pipeline.social_auth.associate_user', 
    'social_core.pipeline.social_auth.load_extra_data', 
    'social_core.pipeline.user.user_details', 
) 

UPDATE(TRACEBACK)

2017-04-28T00:02:32.455554+00:00 app[web.1]: Internal Server Error: /api/user/profile/ 
2017-04-28T00:02:32.455575+00:00 app[web.1]: Traceback (most recent call last): 
2017-04-28T00:02:32.455577+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.5/site-packages/django/core/handlers/exception.py", line 39, in inner 
2017-04-28T00:02:32.455578+00:00 app[web.1]:  response = get_response(request) 
2017-04-28T00:02:32.455579+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.5/site-packages/django/core/handlers/base.py", line 187, in _get_response 
2017-04-28T00:02:32.455581+00:00 app[web.1]:  response = self.process_exception_by_middleware(e, request) 
2017-04-28T00:02:32.455582+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.5/site-packages/django/core/handlers/base.py", line 185, in _get_response 
2017-04-28T00:02:32.455583+00:00 app[web.1]:  response = wrapped_callback(request, *callback_args, **callback_kwargs) 
2017-04-28T00:02:32.455584+00:00 app[web.1]: File "/app/aroomieapp/apis.py", line 60, in user_get_profile 
2017-04-28T00:02:32.455584+00:00 app[web.1]:  expires__gt = timezone.now()) 
2017-04-28T00:02:32.455585+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.5/site-packages/django/db/models/manager.py", line 85, in manager_method 
2017-04-28T00:02:32.455585+00:00 app[web.1]:  return getattr(self.get_queryset(), name)(*args, **kwargs) 
2017-04-28T00:02:32.455586+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.5/site-packages/django/db/models/query.py", line 385, in get 
2017-04-28T00:02:32.455586+00:00 app[web.1]:  self.model._meta.object_name 
2017-04-28T00:02:32.455587+00:00 app[web.1]: oauth2_provider.models.DoesNotExist: AccessToken matching query does not exist. 
2017-04-28T00:02:32.511548+00:00 heroku[router]: at=info method=GET path="/api/user/profile/?access_token=" host=salty-sands-40947.herokuapp.com request_id=c9c65c38-9617-4616-906f-78cd06dca05c fwd="69.203.1.36" dyno=web.1 connect=1ms service=97ms status=500 bytes=70045 protocol=https 

代码与数据库中的信息:

# This package help us to replace our database with Postgresql 
import dj_database_url 
db_from_env = dj_database_url.config(conn_max_age=500) 
DATABASES['default'].update(db_from_env) 

AUTHENTICATION_BACKENDS = (
    # Others auth providers (e.g. Google, OpenId, etc) 

    # Facebook OAuth2 
    'social_core.backends.facebook.FacebookAppOAuth2', 
    'social_core.backends.facebook.FacebookOAuth2', 

    # django-rest-framework-social-oauth2 
    'rest_framework_social_oauth2.backends.DjangoOAuth2', 

    # Django 
    'django.contrib.auth.backends.ModelBackend', 
) 

# Facebook configuration 
SOCIAL_AUTH_FACEBOOK_KEY = os.environ['FACEBOOK_KEY'] 
SOCIAL_AUTH_FACEBOOK_SECRET = os.environ['FACEBOOK_SECRET'] 

# Define SOCIAL_AUTH_FACEBOOK_SCOPE to get extra permissions from facebook. Email is not sent by default, to get it, you must request the email permission: 
SOCIAL_AUTH_FACEBOOK_SCOPE = [ 
    'email', 
    # 'user_birthday', 
] 
SOCIAL_AUTH_FACEBOOK_PROFILE_EXTRA_PARAMS = { 
    'fields': 'id, name, email, age_range, gender' 
} 

# Login process customization purpose 
SOCIAL_AUTH_PIPELINE = (
    'social_core.pipeline.social_auth.social_details', 
    'social_core.pipeline.social_auth.social_uid', 
    'social_core.pipeline.social_auth.auth_allowed', 
    'social_core.pipeline.social_auth.social_user', 
    'social_core.pipeline.user.get_username', 
    'social_core.pipeline.user.create_user', 
    'aroomieapp.social_auth_pipeline.extend_user_profile', # <--- set the path to the function 
    'social_core.pipeline.social_auth.associate_user', 
    'social_core.pipeline.social_auth.load_extra_data', 
    'social_core.pipeline.user.user_details', 
) 

social_auth_pipeline:

from aroomieapp.models import Profile 

def extend_user_profile(backend, user, request, response, *args, **kwargs): 
    if backend.name == 'facebook': 
     avatar = 'https://graph.facebook.com/%s/picture?type=normal' % response['id'] 
     gender = response['gender'] 
     age_min = response['age_range']['min'] if response['age_range'].get('min') else 0 
     age_max = response['age_range']['max'] if response['age_range'].get('max') else 0 
     lifestyle_info = "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0" 

     if not Profile.objects.filter(user_id=user.id): 
      Profile.objects.create(user_id=user.id, age_min=age_min, age_max=age_max, gender=gender, avatar=avatar, lifestyle_info=lifestyle_info) 

尝试时,我也得到一个的accessToken错误信息去cr吃掉一个。我真的被困住了,我不知道该从哪里出发。

谢谢

+0

您的设置没有出现任何问题。你可以发布你的完整回溯吗? – ChidG

+0

@ChidG我已经用完整的回溯更新了这篇文章。 –

回答

0

所以我想通了。它与创建我的client_id和client_secret令牌有关。 Heroku生成的client_id和client_secret令牌有时不会生成。所以你需要做的就是进入你的django管理员并创建一个新的应用程序。使用以下设置: 客户类型:保密或公开 授权拨款类型:授权码 名称:服务的名称(在我的情况脸谱)

这会给你的CLIENT_ID和client_secret令牌,但他们将只如果工作你点击submit来创建应用程序。完成之后,您的API将能够与您的应用程序进行通信。

0

你的设置没有提到PostgresSQL。他们只指定一个sqlite3数据库。

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.sqlite3', 
     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 
    } 
} 

您应该遵循instructions并添加:

# Parse database configuration from $DATABASE_URL 
import dj_database_url 
... 
db_from_env = dj_database_url.config(conn_max_age=500) 
DATABASES['default'].update(db_from_env) 
+0

我已经在我的settings.py文件中有代码。 –

+0

没错。那么你可以包含更新数据库的实际代码吗? – kichik

+0

是的,我现在更新了它。另外,当我执行一个curl请求来撤销令牌时,它会一直告诉我,我的client_id参数是无效的。会是这样吗? –