我正在使用mod_wsgi在Apache服务器上托管的Django站点上工作。 该网站仅在https上,因为我们将Apache的任何http请求重定向到https。
我正在研究的项目名为Skittle。 我有一个名为SkittleUser的自定义用户模型,它继承自AbstractBaseUser,并在settings.py文件中设置为AUTH_USER_MODEL。
os.environ ['HTTPS'] =“on”在wsgi.py文件中设置。
SESSION_COOKIE_SECURE = True且CSRF_COOKIE_SECURE = True都在settings.py中设置
我们现在遇到的问题是以用户身份登录是不可靠的。 当你进入登录页面时,有时它会起作用,而有时却不起作用。 然后在浏览网站时,您将突然失去会话并被踢到匿名用户。
如果有人想看一下,我们目前正在这里运行我们的测试网站:
https://skittle.newlinetechnicalinnovations.com/discover/
我们的生产站点位于www.dnaskittle.com,但尚未合并用户登录,因为该功能不起作用。
测试用户: 电子邮件:test@dnaskittle.com 密码:asdf
如果登录不起作用,您将在右上角的“欢迎,登录”中看到,在这种情况下,只需尝试再次单击“登录”并使用相同的凭据。 在您真正登录之前,可能需要5-6次执行该过程。
当您看到“欢迎测试员,退出,我的基因组”
时,您会知道它有效登录后,它可能会坚持一段时间,但浏览其他页面最终会让您退缩。 在这种情况发生之前,您没有一致的页面数量,并且不会在任何特定页面上发生。
对此的任何见解将不胜感激。
另外值得注意的是,进入Django管理页面(这不是我们的代码,但是基础django代码)也存在同样的问题。
答案 0 :(得分:0)
SSL系统更长,更复杂。要使用https正确处理会话/登录,您可以使用session_cookies设置配置。
<强> settings.py:强>
ENABLE_SSL=False #in the debug mode in the production passed it to True
MIDDLEWARE_CLASSES = (
'commerce.SSLMiddleware.SSLRedirect', #)
# the session here is to use in your views when a user is connected
SESSION_COKIE_NAME='sessionid'
#the module to store sessions data
SESSION_ENGINE='django.contrib.sessions.backends.db'
#age of cookie in seconds (default: 2 weeks)
SESSION_COOKIE_AGE=7776000 # the number of seconds in 90 days
#whether a user's session cookie expires when the web browser is closed
SESSION_EXPIRE_AT_BROWSER_CLOSE=False
#whether the session cookie should be secure (https:// only)
SESSION_COOKIE_SECURE=False
SSLMiddleware是您要在项目中定义的文件,如。
<强> SSLMiddleware.py:强>
from django.conf import settings
from django.http import HttpResponseRedirect, HttpResponsePermanentRedirect
SSL='SSL'
class SSLRedirect:
def process_view(self,request,view_func,view_args,view_kwargs):
if SSL in view_kwargs:
secure =view_kwargs[SSL]
del view_kwargs[SSL]
else:
secure=False
if not secure == self._is_secure(request):
return self._redirect(request,secure)
def _is_secure(self,request):
if request.is_secure():
return True
if 'HTTP_X_FORWARD_SSL' in request.META:
return request.META['HTTP_X_FORWARD_SSL'] == 'on'
return False
def _redirect(self,request,secure):
protocol = secure and "https" or "http"
newurl ="%s://%s%s" % (protocol, request, request.get_full_path())
if settings.DEBUG and request.method=="POST":
raise RuntimeError, \
return HttpResponsePermanentRedirect(newurl)
现在在你的网址中应该处理你的登录或连接添加行
<强> urls.py:强>
from project import settings
urlpatterns += patterns('django.contrib.auth.views',
(r'^login/$','login',{'template_name':'registration/login.html','SSL':settings.ENABLE_SSL},'login'),
尝试将此修改为您的代码。并且不要忘记将ENABLE_SSL
转为True
答案 1 :(得分:0)
我已经解决了这个问题。 使用列出的设置时,用户无法使用HTTPS登录。
我做了什么:
在settings.py中添加:
SESSION_SAVE_EVERY_REQUEST = True
SESSION_COOKIE_NAME = 'DNASkittle'
我还擦除了当前的django_sessions数据库,以防导致旧的延迟数据出现问题。
我没有设置额外的中间件或SSLRedirect,而且一切都工作正常。
答案 2 :(得分:0)
好的。对于使用HTTPS登录的用户,您必须启用SSL并使用适合您案例的代码才能使用它。 对于用户会话,您也可以使用它:
首先检查你是否有settings.py: INSTALLED_APPS =('django.contrib.sessions',)
并在file.py中使用request.sessions: request.session ['id'] ='the_id_to_store_in_browser'或'other_thing' 在这里你使用request.session就像一个特殊的SessionStore类,类似于python字典。
并在views.py中,例如在呈现模板或使用代码重定向测试cookie之前: 如果: # 任何你想要的 if request.session.test_cookie_worked(): request.session.delete_test_cookie() 返回HttpResponseRedirect(最新的) 其他: # 任何你想要的 request.session.set_test_cookie() 回报你想要的东西
使用此代码,用户会话将会变宽,取决于您的SESSION_COOKIE_AGE期间。