2010-01-22 3 views
15

В Django у меня есть SESSION_COOKIE_DOMAIN, установленное для моего доменного имени. Но я действительно хотел бы запустить тот же сайт с двумя разными именами доменов.Django, SESSION_COOKIE_DOMAIN с несколькими доменами

С установленным SESSION_COOKIE_DOMAIN, только именованный домен позволяет пользователю войти в систему. Возможно ли разрешить оба домена войти в систему?

ответ

24

Если вы установили свой домен cookie сеанса, чтобы начать с "." символ, он позволит вам обрабатывать поддомены подстановочных знаков и совместно использовать cookie сеанса (сеанс входа) в несколько поддоменов.

 
In settings.py: 
SESSION_COOKIE_DOMAIN=".stackoverflow.com" 

выше позволит печенье для совместного использования по user1.stackoverflow.com и user2.stackoverflow.com.

Если вы действительно хотите, чтобы URL-адрес был другим для одного и того же сайта, вы хотите, чтобы тот же пользователь переключался между двумя сайтами в одном сеансе входа? Или вы просто хотите иметь двух разных пользователей для входа на сайт из двух разных URL-адресов (которые не являются поддоменами?)

+0

Я хочу второй. Не поддомены. В основном у меня есть клиент, у которого есть averylongdomainnamethatno-onewantstotype.net и quickname.net, и сайт должен работать для обоих. – interstar

+3

Как насчет добавления перенаправления с 'longname.net' на' shortname.net', чтобы все пользователи использовали только 'shortname.net'? –

+0

Будет работать между 'example.com' и' www.example.com'. –

4

Стандартный SessionMiddleware поддерживает только один SESSION_COOKIE_DOMAIN, который хорош только для одного домена и поддоменов его.

Вот вариант, который будет динамически устанавливать домен cookie на основе хоста запроса. Чтобы использовать его, просто обновите MIDDLEWARE_CLASSES, чтобы использовать этот SessionHostDomainMiddleware вместо SessionMiddleware. Это лучше, @jcdyer и @interstar?

import time 

from django.conf import settings 
from django.utils.cache import patch_vary_headers 
from django.utils.http import cookie_date 
from django.contrib.sessions.middleware import SessionMiddleware 

class SessionHostDomainMiddleware(SessionMiddleware): 
    def process_response(self, request, response): 
     """ 
     If request.session was modified, or if the configuration is to save the 
     session every time, save the changes and set a session cookie. 
     """ 
     try: 
      accessed = request.session.accessed 
      modified = request.session.modified 
     except AttributeError: 
      pass 
     else: 
      if accessed: 
       patch_vary_headers(response, ('Cookie',)) 
      if modified or settings.SESSION_SAVE_EVERY_REQUEST: 
       if request.session.get_expire_at_browser_close(): 
        max_age = None 
        expires = None 
       else: 
        max_age = request.session.get_expiry_age() 
        expires_time = time.time() + max_age 
        expires = cookie_date(expires_time) 
       # Save the session data and refresh the client cookie. 
       # Skip session save for 500 responses, refs #3881. 
       if response.status_code != 500: 
        request.session.save() 
        host = request.get_host().split(':')[0] 
        response.set_cookie(settings.SESSION_COOKIE_NAME, 
          request.session.session_key, max_age=max_age, 
          expires=expires, domain=host, 
          path=settings.SESSION_COOKIE_PATH, 
          secure=settings.SESSION_COOKIE_SECURE or None, 
          httponly=settings.SESSION_COOKIE_HTTPONLY or None) 
     return response 
+0

То, о чем он просит, - это в точности вариант использования рамок сайтов, предназначенных для размещения. Предлагая «не делай этого», это не помогает. – jcdyer

+0

Фактически нет @jcdyer, с установленным SESSION_COOKIE_DOMAIN, он не сможет использовать ванильную среду SessionMiddleware и sites. – s29

0

Вместо того, чтобы совершенно новый SessionMiddleware вы могли бы изменить куки ответа, как следующие:

class CrossDomainSessionMiddleware(object): 
    def process_response(self, request, response): 
     if response.cookies: 
      host = request.get_host() 
      # check if it's a different domain 
      if host not in settings.SESSION_COOKIE_DOMAIN: 
       domain = ".{domain}".format(domain=host) 
       for cookie in response.cookies: 
        if 'domain' in response.cookies[cookie]: 
         response.cookies[cookie]['domain'] = domain 
     return response 

(Поместите это промежуточное программное обеспечение над промежуточным ПО вашей сессии). Вы можете ограничить это конкретными доменами, если хотите.

Смежные вопросы