Django,注册登录后无法在页面间传输用户登录状态

Django, can't transmit user login status among pages after register and login

我使用自定义用户模型并正确配置设置文件。

这是常规视图

def user_reg(request):
if request.method == 'POST':
    form = forms.RegForm(request.POST)
    if form.is_valid():
        data = form.cleaned_data
        name = data['name']
        password = data['password']
        MyUser.objects.create_user(name,password)
        user = authenticate(username=name, password=password)
        login(request, user)
        return render_to_response('common/success.html',{'config':config}, context_instance=RequestContext(request))

else:
    form = forms.RegForm()
return render_to_response('common/reg.html', {'config': config,'form':form}, context_instance=RequestContext(request))

在common/reg.html这里是

{% if user.is_authenticated %}
{{ user.name }}
{% else %}
not user
{% endif %}
<a href="index">index page link</a>

并且网页显示了新用户的名称。没关系。 但是当我直接访问网页索引页面时,或者通过 link。 这是索引视图,它被装饰

@login_required
def index(request):
    show something...

现在我看不到索引页面,而是重定向到登录页面。 我刚刚登录,为什么要到这里登录?????

数据库迁移正常

应用程序和中间件

INSTALLED_APPS = (
'account',
'forum',
'uuidfield',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'debug_toolbar',)

MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
#'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',)

这里是自定义用户模型,就像 django 文档一样:https://docs.djangoproject.com/en/1.7/topics/auth/customizing/#a-full-example

class MyUserManager(BaseUserManager):

def create_user(self, name, password=None,nick_name=None,gender=None):
    """
    Creates and saves a User with the given email, date of
    birth and password.
    """
    if not name:
        raise ValueError(u'name error')

    user = self.model(name=name)
    if nick_name:
        user.nick_name = nick_name
    else:
        user.nick_name = name
    user.set_password(password)
    user.save(using=self._db)
    return user

def create_superuser(self, name, password):
    """
    Creates and saves a superuser with the given email, date of
    birth and password.
    """
    user = self.create_user(name=name)
    user.is_admin = True
    user.save(using=self._db)
    return user


class MyUser(AbstractBaseUser):

uuid = UUIDField(auto=True, hyphenate=True, primary_key=True)
name = models.CharField(max_length=16, unique=True)  
nick_name = models.CharField(max_length=16)
email = models.EmailField(max_length=255, blank=True)
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
gender = models.NullBooleanField(choices=GENDER, default=None)

objects = MyUserManager()

USERNAME_FIELD = 'name'
REQUIRED_FIELDS = []

class Meta:
    db_table = 'account_user'

def get_full_name(self):
    # The user is identified by their email address
    return self.name

def get_short_name(self):
    # The user is identified by their email address
    return self.name

def __unicode__(self):  # __unicode__ on Python 2
    return self.name

def has_perm(self, perm, obj=None):
    "Does the user have a specific permission?"
    # Simplest possible answer: Yes, always
    return True

def has_module_perms(self, app_label):
    "Does the user have permissions to view the app `app_label`?"
    # Simplest possible answer: Yes, always
    return True

@property
def is_staff(self):
    "Is the user a member of staff?"
    # Simplest possible answer: All admins are staff
    return self.is_admin

第二个视图应该return:

render_to_response('common/success.html',{'config':config,'next':next_url}, context_instance=RequestContext(request))    

(你错过了context_instance)。

我的天啊!!!!!! django-uuid 有一个错误 当字段的属性 'hyphenate' 为 true 时。 uuid 是 36 长度,但从会话中获取的值仍然是 32 长度。所以 cookie 无法匹配会话 原来如此!