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 无法匹配会话
原来如此!
我使用自定义用户模型并正确配置设置文件。
这是常规视图
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 无法匹配会话 原来如此!