【问题标题】:Django cannot read session under subdomain but working under IP AddressDjango 无法读取子域下的会话,但在 IP 地址下工作
【发布时间】:2015-05-27 09:21:24
【问题描述】:

我使用 django 1.7 和 python 2.73。我在 Windows Server 2008 上设置了 django。

就是这样的代码,没什么特别的,输入用户名并保存会话,然后跳转到另一个视图。

def login_user(request):
    error = None
    if request.POST:
        form = LoginForm(request.POST)
        username = request.POST.get('username')
        password = request.POST.get('password')
        try:
            user = authenticate(username=username, password=password)
            print user
        except:
            raise Http404("Authenticate faile")
        if user is not None:
            login(request, user)
            try:
                app_user = ApplicaitionUser.objects.using('xxx').filter(user_name=username).exclude(app_name='XXXX')
                app_user_list = list(app_user.values('user_name', 'app_name'))
                request.session['app_user_list'] = app_user_list
            except ApplicaitionUser.DoesNotExist:
                raise Http404("user does not exist")

            user_info = UserInfo.objects.filter(user_name=username)
            user_info_list = list(user_info.values('user_name', 'user_full_name', 'user_budget_centre', 'user_email'))
            request.session['user_info_list'] = user_info_list
            return HttpResponseRedirect('/index/')
        else:
            error = 'User name or password is wrong'
    else:
        user_info_list = request.session.get('user_info_list', None)
        if user_info_list is not None:
            return HttpResponseRedirect('/index/')
        else:
            form = LoginForm()
    tmp = loader.get_template("auth.html")
    cont = RequestContext(request, {'form': form, 'error': error})
    return HttpResponse(tmp.render(cont))


def index(request):
    try:
        app_user_list = request.session.get('app_user_list', None)
        user_info_list = request.session.get('user_info_list')
    except:
        raise Http404('Database is down')
    else:
        if user_info_list is not None:
            user_name = user_info_list[0]['user_name']
        else:
            return HttpResponseRedirect("/")


===================================Rest of Code==========================

如果我使用 IP 地址 (127.0.0.1:8000),一切正常。 (浏览器是最新版本的 Chrome 和 FireFox。)

但是当我使用子域(sub.domain.com)时,有些东西真的很奇怪。

在Chrome中,request.session['user_info_list']存储数据成功,我在数据库中查了一下,然后跳转到index视图,user_info_list = request.session.get('user_info_list')无法获取数据,然后回到login_user视图,但是user_info_list = request.session.get('user_info_list')在这个视图可以获取数据。并再次跳转到索引视图并request.session['user_info_list'] 获取数据。

在 FireFox 中,不同的是 user_info_list = request.session.get('user_info_list') 无法在 login_user 视图中获取数据

它允许任何网址。

ALLOWED_HOSTS = ['*']

url是从sub.domain.com.au跳转到sub.domain.com.au/index

我也试过SESSION_COOKIE_DOMAIN = '.domain.com.au'SESSION_COOKIE_DOMAIN = 'sub.domain.com.au'SESSION_COOKIE_DOMAIN = 'domain.com.au'。它们都不起作用。

我搜索了类似的问题,例如 Django authentication works on Chrome, but not on FirefoxDjango session doesn't work in Firefox,但没有用。

我不太确定这是代码问题还是互联网问题。因为如果我使用 IP 地址,一切正常。有什么想法吗?

谢谢

【问题讨论】:

    标签: django session firefox


    【解决方案1】:

    您应该将此行添加到您的settings.py

    SESSION_COOKIE_DOMAIN = ".yourdomain.com"
    

    用于会话 cookie 的域。将此设置为字符串,例如 “.example.com”(注意前导点!)用于跨域 cookie,或 对标准域 cookie 使用 None。

    Django docs

    【讨论】:

    • 谢谢回复,我试过了,加了IP地址下也不能用了。
    • 就像从 sub.domain.com 到 sub.domain.com/index/。它是标准域 cookie 还是跨域 cookie。因为用户只在 sub.domain.com 中。谢谢
    【解决方案2】:

    问题是网络问题,我们使用的是 Sophos,在他们将 url 更改为 https 后,一切正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-02
      • 1970-01-01
      • 2012-12-25
      • 2016-09-10
      • 2017-08-01
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      相关资源
      最近更新 更多