[英]Django admin asks for login after every click
我正在开发 Heroku 上托管的 Django 应用程序。 我可以使用我的用户名和密码登录到管理员。 但是在每次单击(或几秒钟后的每次单击)时,它都会再次将我重定向到登录页面,并将?next=/admin/model
添加到 URL。 事实上,有时它会在让我查看管理控制台之前多次要求登录。 此行为不会反映在本地部署中。 管理员在本地工作得很好。
我尝试了这里提到的建议: https : //docs.djangoproject.com/en/1.8/faq/admin/#i-can-t-log-in-when-i-enter-a-valid-username-and- password-it-just-brings-up-the-login-page-again-with-no-error-messages 。 但这无济于事。
任何线索我可能做错了什么?
这是我的settings.py:
# 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!
# 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',
'haystack',
'hash',
'smuggler',
)
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
)
ROOT_URLCONF = 'ssite.urls'
WSGI_APPLICATION = 'ssite.wsgi.application'
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
TEMPLATE_CONTEXT_PROCESSORS = ('django.contrib.auth.context_processors.auth',
'django.core.context_processors.debug',
'django.core.context_processors.i18n',
'django.core.context_processors.media',
'django.core.context_processors.static',
'django.core.context_processors.tz',
'django.contrib.messages.context_processors.messages',
'django.contrib.auth.context_processors.auth',
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'hash',
'USER': 'dc',
'PASSWORD': 'dc',
'HOST': '127.0.0.1',
'PORT': '5432',
}
}
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'Asia/Kolkata'
USE_I18N = True
USE_L10N = True
USE_TZ = True
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
SESSION_SAVE_EVERY_REQUEST = True
SESSION_COOKIE_AGE = 86400 # sec
SESSION_COOKIE_DOMAIN = None
SESSION_COOKIE_NAME = 'DSESSIONID'
SESSION_COOKIE_SECURE = False
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
'URL': 'http://127.0.0.1:9200/',
'INDEX_NAME': 'haystack',
},
}
# Parse database configuration from $DATABASE_URL
import dj_database_url
DATABASES['default'] = dj_database_url.config()
# 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 asset configuration
import os
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
STATIC_ROOT = 'static'
STATIC_URL = '/static/'
#STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'
FIXTURE_DIRS = (
os.path.join(BASE_DIR, 'fixtures'),
)
from urlparse import urlparse
es = urlparse(os.environ.get('SEARCHBOX_URL') or 'http://127.0.0.1:9200/')
port = es.port or 80
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
'URL': es.scheme + '://' + es.hostname + ':' + str(port),
'INDEX_NAME': 'documents',
},
}
if es.username:
HAYSTACK_CONNECTIONS['default']['KWARGS'] = {"http_auth": es.username + ':' + es.password}
try:
from local_settings import *
except ImportError as e:
pass
就我而言,这是因为我同时运行另一个 Django 开发服务器(相同域,不同端口)。 我不知道导致此问题的详细信息,但关闭其他服务器解决了该问题。
编辑
如果您错过了问题中链接的文档:如果您需要运行多个 django 服务器,您可以通过为每个服务器设置不同的SESSION_COOKIE_NAME
来解决此问题。
万一其他人发生这种情况,我遇到了完全相同的问题,并最终意识到如果密钥尚未设置为环境变量,我会在我的settings.py
文件中随机生成SECRET_KEY
值。 我完全忘记在 Heroku 上设置它,之后问题就解决了。
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
我的 Django & React 项目遇到了同样的问题,问题是我在应用程序的主页上无条件调用了经过身份验证的所需端点。
我通过在我的前端 (React) 提供所需的头文件来解决这个问题。
我的终点是这样的:
class CartView(APIView):
serializer_class = CartSerializer
permission_classes = [IsAuthenticated,]
def get(self, request, format=None):
user = request.user
items = Cart.objects.filter(username=user, ordered=False)
if items.exists():
return Response(CartViewSerializer(items, many=True).data, status=status.HTTP_200_OK)
return Response({'message' : 'No Items have been added'}, status=status.HTTP_204_NO_CONTENT)
用户应该通过身份验证才能访问此端点,而我的 React 应用程序就是这样,我确实访问了端点,而不关心用户是否经过身份验证。
React.useEffect(() => {
axios.get('/api/add-to-cart')
.then(res => {
dispatch(addToCartCount(res.data.length));
dispatch(showCartItems(res.data));
}, [])
所以我把它改成了这样:
React.useEffect(() => {
if (props.isAuthenticated) {
const token = localStorage.getItem('token')
let config = {
headers: {
'Authorization': `Token ${token}`
}
}
axios.get('/api/add-to-cart', config)
.then(res => {
dispatch(addToCartCount(res.data.length));
dispatch(showCartItems(res.data));
})
}
}, [])
如果用户通过身份验证,我提供了点击此端点,如果用户通过身份验证,我提供了一个正确的令牌来点击这个 URL。
注意:我将令牌存储在localStorage
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.