Django request.user在重定向后变为匿名。使用自定义用户模型和身份验证

Django request.user在重定向后变为匿名。使用自定义用户模型和身份验证,django,python-3.x,Django,Python 3.x,我正在使用django 2.1.7和python 3.6.5版本,使用“AbstractUser”扩展django用户模型,并覆盖django身份验证方法。在登录之前,一切似乎都正常工作,但当页面重定向到home request.user时变为null 我尝试过渲染而不是重定向,这似乎可以工作,但当我在不同的选项卡中打开相同的页面或刷新页面时,我得到403禁止错误(CSRF验证失败。请求中止) 尝试了以下设置,但似乎仍然不起作用 CSRF\u COOKIE\u SECURE=False 会话\u

我正在使用django 2.1.7和python 3.6.5版本,使用“AbstractUser”扩展django用户模型,并覆盖django身份验证方法。在登录之前,一切似乎都正常工作,但当页面重定向到home request.user时变为null

我尝试过渲染而不是重定向,这似乎可以工作,但当我在不同的选项卡中打开相同的页面或刷新页面时,我得到403禁止错误(CSRF验证失败。请求中止) 尝试了以下设置,但似乎仍然不起作用 CSRF\u COOKIE\u SECURE=False 会话\u COOKIE\u SECURE=False

设置.py

LOGIN\u URL='/'
登录\重定向\ URL='home'
AUTH_USER_MODEL='hygie_portal.CustomUser'
已安装的应用程序=[
“django.contrib.admin”,
“django.contrib.auth”,
“django.contrib.contenttypes”,
“django.contrib.sessions”,
“django.contrib.messages”,
“django.contrib.staticfiles”,
“卫生门户”,
“django_资产”,
]
中间件=[
'django.middleware.security.SecurityMiddleware',
“django.contrib.sessions.middleware.SessionMiddleware”,
'django.middleware.common.CommonMiddleware',
“django.middleware.csrf.CsrfViewMiddleware”,
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.xFrameOptions中间件',
]
身份验证\u后端=(
“hygie_portal.mybackend.mybackend”,
)
models.py

从django.contrib.auth.models导入AbstractUser
类CustomUser(AbstractUser):
is_admin=models.IntegerField(blank=True,null=True)
role=models.CharField(最大长度=256,空白=True,空=True)
def set_is_admin(self,is_admin):
self.is_admin=is_admin
def set_角色(自身、角色):
self.last_update=datetime.now()
self.role=角色
forms.py

从django.contrib.auth导入get\u user\u模型
从django.contrib.auth.forms导入UserCreationForm、UserChangeForm
从django.forms导入TextInput、EmailInput、PasswordInput
CustomUser=get\u user\u model()
类登录表单(forms.Form):
“”“登录表单。”“”
username=forms.CharField(label='username',max_length=100)
password=forms.CharField(widget=forms.PasswordInput())
类CustomUserCreationForm(UserCreationForm):
类元(UserCreationForm):
模型=自定义用户
字段=('username',)
类CustomUserChangeForm(UserChangeForm):
类元:
模型=自定义用户
字段=('username','email')
管理员

来自django.contrib导入管理
从django.contrib.auth导入get\u user\u模型
从django.contrib.auth.admin导入UserAdmin
从.forms导入CustomUserCreationForm、CustomUserChangeForm
CustomUser=get\u user\u model()
类CustomUserAdmin(UserAdmin):
add_form=CustomUserCreationForm
form=CustomUserChangeForm
模型=自定义用户
列表显示=['username',]
admin.site.register(CustomUser,CustomUserAdmin)
url.py

app\u name=“hygie\u门户”
URL模式=[
路径(“,views.login\u请求,name='login'),
路径(r'login/,RedirectView.as_视图(url='/login/),
路径('home/',views.home,name='home'),
]
view.py

从django.contrib.auth导入get\u user\u模型
CustomUser=get\u user\u model()
@保护
def登录请求(请求):
如果request.user.u经过身份验证:
返回渲染(请求“users/home\u public.html”)
如果request.method==“POST”:
form=LoginForm(request.POST)
如果form.is_有效():
username=form.cleaned\u data.get('username'))
password=form.cleaned_data.get('password'))
用户\ u info=MyBackEnd.authenticate(编码(用户名)、编码(密码)、请求=请求)
如果不是用户信息:
消息。错误(请求“无效的用户名或密码。请重试”。)
返回重定向('hygie_门户:login')
如果用户信息['role']中的'manager'为False,则\u admin=True
尝试:
user\u profile=CustomUser.objects.get(用户名=用户名)
除:
用户配置文件=“”
如果不是用户配置文件:
如果用户信息中的“名称”:
尝试:
fname=user_info['name'].split()[0]
除索引器外:
fname=''
尝试:
sname=user_info['name'].split()[1]
除索引器外:
sname=''
其他:
fname,sname='','
user\u profile=CustomUser(username=username,email=user\u info['email'],first\u name=fname,last\u name=sname,role=user\u info['role']))
用户_profile.save()
尝试:
用户配置文件。设置为管理员(为管理员)
用户配置文件。设置角色(用户信息['role'])
用户_profile.save()
例外情况除外,如e:
logger.error('更新用户****'%e时出现异常)
登录(请求、用户配置文件、backend='hygie\u portal.mybackend.mybackend')
#登录后,request.user.is\u authenticated返回true
#返回重定向('hygie_门户:home')#重定向到home request.user.is_authenticated时返回False
return render(请求'users/home_public.html')#工作正常,但在刷新页面或在其他选项卡中访问url时抛出403错误
form=LoginForm()
如果form.errors:
messages.error(form.errors,“danger”)
闪光(形式错误,“危险”)
#如果未经验证或未提交表单,则默认登录页面。
返回呈现(请求'public/login.html',{'form':form})
def home(请求):
如果request.user.u经过身份验证:
返回渲染(请求“users/home\u public.html”)
其他:
返回重定向('hygie_门户:login')
mybackend.py

类MyBackEnd(对象):
def身份验证(用户名、密码、请求)
request.session['username'] = username

request.session['email'] = email
def get_user(self, user_id):
    try:
        return CustomUser.objects.get(pk=user_id)
    except CustomUser.DoesNotExist:
        return None
login(request, user, backend='your.auth.backend')