django】【Python】Python如何使用django模块实现不同身份的注册登录

2020-12-22 09:46发布

1条回答
给你三个亿
2楼 · 2021-01-25 18:08





  1. 项目主要页面介绍

  2. 1.首页

2.注册


3.登录


2.项目开发模式

开发模式前后端不分离后端框架Django+Jinja2模板引擎前端框架Vue.js

3.准备项目代码仓库

  1. 源码托管网站

  2. 1、码云(https://gitee.com/)

  3. 2、创建源码远程仓库:website

  4. 3、克隆项目代码仓库新建文件夹下载githttps://git-scm.com/download/win

  5. 按默认方式安装。克隆项目:gitclonehttps://gitee.com/lgc1286191951/website.git

2.创建项目工程

  1. 进入本地项目仓库

  2. $cdwebsite2.创建美多商城虚拟环境,安装Django框架$mkvirtualenv-ppython3website$pipinstalldjango3.创建Django工程$django-adminstartprojectwebsite创建工程完成后:运行程序,测试结果。

  3. 4.配置MySQL数据库

  4. 1.新建MySQL数据库

  5. 1.新建MySQL数据库:test$createdatabasemeiduocharset=utf8;2.新建MySQL用户

  6. $createusertestidentifiedby‘123456’;

  7. 2.配置MySQL数据库

  8. DATABASES={‘default’:{‘ENGINE’:‘django.db.backends.mysql’,#数据库引擎‘HOST’:‘127.0.0.1’,#数据库主机‘PORT’:3306,#数据库端口‘USER’:‘root’,#数据库用户名root‘PASSWORD’:‘123456’,#数据库用户密码‘NAME’:‘test’#数据库名字},}可能出现的错误

  9. ErrorloadingMySQLdbmodule:Nomodulenamed‘MySQLdb’.出现错误的原因:

  10. Django中操作MySQL数据库需要驱动程序MySQLdb目前项目虚拟环境中没有驱动程序MySQLdb解决办法:

  11. 安装PyMySQL扩展包因为MySQLdb只适用于Python2.x的版本,Python3.x的版本中使用PyMySQL替代MySQLdb

  12. 3.安装PyMySQL扩展包

  13. 1.安装驱动程序在windows下安装Mysql$pipinstallPyMySQL2.在工程同名子目录的__init__.py文件中,添加如下代码:

  14. frompymysqlimportinstall_as_MySQLdb

  15. install_as_MySQLdb()配置完成后:运行程序,测试结果。

  16. 5.配置Redis数据库

  17. 1.安装django-redis扩展包

  18. 1.安装django-redis扩展包在windows下安装redis$pipinstalldjango-redis2.django-redis使用说明文档点击进入文档

  19. 2.配置Redis数据库

  20. CACHES={“default”:{#默认“BACKEND”:“django_redis.cache.RedisCache”,“LOCATION”:“redis://127.0.0.1:6379/0”,“OPTIONS”:{“CLIENT_CLASS”:“django_redis.client.DefaultClient”,}},“session”:{#session“BACKEND”:“django_redis.cache.RedisCache”,“LOCATION”:“redis://127.0.0.1:6379/1”,“OPTIONS”:{“CLIENT_CLASS”:“django_redis.client.DefaultClient”,}},“verify_code”:{#验证码“BACKEND”:“django_redis.cache.RedisCache”,“LOCATION”:“redis://127.0.0.1:6379/2”,“OPTIONS”:{“CLIENT_CLASS”:“django_redis.client.DefaultClient”,}},}SESSION_ENGINE=“django.contrib.sessions.backends.cache”SESSION_CACHE_ALIAS=“session”default:

  21. 默认的Redis配置项,采用0号Redis库。session:

  22. 状态保持的Redis配置项,采用1号Redis库。SESSION_ENGINE

  23. 验证码的Redis配置项,采用2号Redis库verify_code

  24. 修改session存储机制使用Redis保存。SESSION_CACHE_ALIAS:

  25. 使用名为"session"的Redis配置项存储session数据。配置完成后:运行程序,测试结果。

  26. 6.配置前端静态文件

  27. 1.准备静态文件

2.指定静态文件加载路径

STATIC_URL=‘/static/’配置静态文件加载路径STATICFILES_DIRS=[os.path.join(BASE_DIR,‘static’)]配置完成后:运行程序,测试结果。

http://127.0.0.1:8000/static/images/test.png

7.创建用户模块子应用

  1. 创建用户模块子应用

  2. 1.准备apps包,用于管理所有应用2.在apps包下创建应用users$cd~/projects/meiduo_project/meiduo_mall/meiduo_mall/apps$python…/…/manage.pystartappusers

  3. 2.查看项目导包路径

  4. 重要提示:

  5. 若要知道如何导入users应用并完成注册,需要知道项目导包路径已知导包路径

  6. website/website已知'users’应用所在目录website_project/website/website/apps/users得到导入’users’应用的导包路路径是website/apps/user

  7. 3.注册用户模块子应用

  8. 用Pycharm开发时,把apps设置为资源路径

  9. 8.展示用户注册页面

  10. 1.准备用户注册模板文件

  11. 加载页面静态文件

  12. 2.定义用户注册视图

  13. classRegisterView(View):“”“用户注册”""

  14. defget(self,request):

  15. """

  16. 提供注册界面

  17. :paramrequest:请求对象

  18. :return:注册界面

  19. """

  20. returnrender(request,'register.html')

定义用户注册路由1.总路由

urlpatterns=[#usersurl(r’^’,include(‘users.urls’,namespace=‘users’)),]2.子路由

urlpatterns=[#注册url(r’^register/$’,views.RegisterView.as_view(),name=‘register’),]

9.定义用户模型类

  1. Django默认用户认证系统

  2. Django自带用户认证系统它处理用户账号、组、权限以及基于cookie的用户会话。Django认证系统位置django.contrib.auth包含认证框架的核心和默认的模型。django.contrib.contenttypes是Django内容类型系统,它允许权限与你创建的模型关联。Django认证系统同时处理认证和授权认证:验证一个用户是否它声称的那个人,可用于账号登录。授权:授权决定一个通过了认证的用户被允许做什么。Django认证系统包含的内容用户:用户模型类、用户认证。权限:标识一个用户是否可以做一个特定的任务,MIS系统常用到。组:对多个具有相同权限的用户进行统一管理,MIS系统常用到。密码:一个可配置的密码哈希系统,设置密码、密码校验。

  3. 2.Django默认用户模型类

  4. Django认证系统中提供了用户模型类User保存用户的数据。User对象是认证系统的核心。Django认证系统用户模型类位置

  5. django.contrib.auth.models.User

  6. 父类AbstractUser介绍

  7. User对象基本属性创建用户(注册用户)必选:username、password创建用户(注册用户)可选:email、first_name、last_name、last_login、date_joined、is_active、is_staff、is_superuse判断用户是否通过认证(是否登录):is_authenticated创建用户(注册用户)的方法user=User.objects.create_user(username,email,password,**extra_fields)用户认证(用户登录)的方法fromdjango.contrib.authimportauthenticateuser=authenticate(username=username,password=password,**kwargs)处理密码的方法设置密码:set_password(raw_password)校验密码:check_password(raw_password)3.自定义用户模型类思考:为什么要自定义用户模型类?

  8. 但是Django默认用户模型类中没有mobile字段,所以要自定义用户模型类。如何自定义用户模型类?Django默认用户模型类的文档继承自AbstractUser(可通过阅读Django默认用户模型类的源码得知)。新增mobile字段。fromdjango.dbimportmodelsfromdjango.contrib.auth.modelsimportAbstractUser

  9. Createyourmodelshere.

  10. classUser(AbstractUser):“”“自定义用户模型类”""mobile=models.CharField(max_length=11,unique=True,verbose_name=‘手机号’)

  11. classMeta:

  12. db_table='tb_users'

  13. verbose_name='用户'

  14. verbose_name_plural=verbose_name

def__str__(self):

returnself.username


知识要点Django自带用户认证系统,核心就是User对象,并封装了一系列可用的方法和属性。Django用户认证系统包含了一系列对用户的操作,比如:模型类,认证,权限,分组,密码处理等。Django用户认证系统中的用户模型类可以自定义,继承自AbstractUser。

10.迁移用户模型类

  1. 指定用户模型类

  2. 思考:为什么Django默认用户模型类是User?

  3. 阅读源代码:‘django.conf.global_settings’AUTH_USER_MODEL=‘auth.User’结论:

  4. Django用户模型类是通过全局配置项AUTH_USER_MODEL决定的配置规则:在settings.py下进行配置AUTH_USER_MODEL=‘应用名.模型类名’指定本项目用户模型类AUTH_USER_MODEL=‘users.User’

  5. 2.迁移用户模型类

  6. 1.创建迁移文件

  7. pythonmanage.pymakemigrations

  8. 2.执行迁移文件

  9. pythonmanage.pymigrate

  10. 11.用户注册业务实现

  11. 1.设计接口基本思路

  12. 对于接口的设计,我们要根据具体的业务逻辑,设计出适合业务逻辑的接口。设计接口的思路:分析要实现的业务逻辑:明确在这个业务中涉及到几个相关子业务。将每个子业务当做一个接口来设计。分析接口的功能任务,明确接口的访问方式与返回数据:请求方法(如GET、POST、PUT、DELETE等)。请求地址。请求参数(如路径参数、查询字符串、表单、JSON等)。响应数据(如HTML、JSON等)。

  13. 2.用户注册接口设计

  14. 1.请求方式

  15. 选项方案请求方法POST请求地址/register/2.请求参数:表单参数

  16. 参数名类型是否必传说明usernamestring是用户名passwordstring是密码password2string是确认密码mobilestring是手机号allowstring是是否同意用户协议3.响应结果:HTML

  17. register.html响应结果响应内容注册失败响应错误提示注册成功重定向到首页

  18. 3.用户注册接口定义

  19. 1.注册视图

  20. classRegisterView(View):“”“用户注册”""

  21. defget(self,request):

  22. """

  23. 提供注册界面

  24. :paramrequest:请求对象

  25. :return:注册界面

  26. """

  27. returnrender(request,'register.html')

defpost(self,request):

"""

实现用户注册

:paramrequest:请求对象

:return:注册结果

"""

pass


2.总路由

urlpatterns=[#usersurl(r’^’,include(‘users.urls’,namespace=‘users’)),]3.子路由

urlpatterns=[#注册url(r’^register/$’,views.RegisterView.as_view(),name=‘register’),]

12.用户注册前端逻辑

为了学会使用Vue.js的双向绑定实现用户的交互和页面局部刷新效果。

  1. 用户注册页面绑定Vue数据

  2. 绑定内容:变量、事件、错误提示等

  3. 注册

  4. [removed][removed]

  5. [removed][removed]

  6. [removed][removed]


    

注册即是·巅峰

            

                

用户注册


                登录

            


                

{#{%csrf_token%}#}

{{csrf_input}}

                


                        


  •                         

                            

                            [[error_name_message]]

                        


  •                     


  •                         

                            

                            [[error_password_message]]

                        


  •                     


  •                         

                            

                            [[error_password2_message]]

                        


  •                     


  •                         

                            

                            [[error_phone_message]]

                        


  •                         

                            

    @blur="send_check_image_code">

    图形验证码

    [[error_image_code_message]]


                        


  •                     

                            

                            

    [[error_allow_message]]

    {%ifregister_errmsg%}

    {{register_errmsg}}

    {%endif%}

                        

                        

                            

                        

                    


                

            



        


[removed][removed]


varvm=newVue({

el:'#app',

//修改Vue变量的读取语法,避免和django模板语法冲突

delimiters:['[[',']]'],

data:{

host:"http://127.0.0.1:8000",

error_name:false,

error_password:false,

error_check_password:false,

error_phone:false,

error_image_code:false,

error_allow:false,

error_name_message:'请输入5-20个字符的用户',

error_password_message:'请输入8-20位的密码',

error_password2_message:'两次输入的密码不一致',

error_phone_message:'请输入正确的手机号码',

error_image_code_message:'请填写图形验证码',

error_allow_message:'请勾选用户协议',

uuid:'',

image_code_url:'',

sending_flag:false,

username:'',

password:'',

password2:'',

mobile:'',

image_code:'',

allow:true

},

mounted:function(){

//向服务器获取图片验证码

this.generate_image_code();

},

methods:{

generateUUID:function(){

vard=newDate().getTime();

if(window.performance&&typeofwindow.performance.now==="function"){

d+=performance.now();//usehigh-precisiontimerifavailable

}

varuuid='xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,function(c){

varr=(d+Math.random()*16)|0;

d=Math.floor(d/16);

return(c=='x'?r:(r&0x3|0x8)).toString(16);

});

returnuuid;

},

//生成一个图片验证码的编号,并设置页面中图片验证码img标签的src属性

generate_image_code:function(){

//生成一个编号:严格一点的使用uuid保证编号唯一,不是很严谨的情况下,也可以使用时间戳

this.uuid=this.generateUUID();

//设置页面中图片验证码img标签的src属性

this.image_code_url=this.host+"/image_codes/"+this.uuid+"/";

console.log(this.image_code_url);

},

//检查用户名

check_username:function(){

varre=/^[a-zA-Z0-9_-]{5,20}$/;

if(re.test(this.username)){

this.error_name=false;

}else{

this.error_name_message='请输入5-20个字符的用户名';

this.error_name=true;

}

//检查重名

if(this.error_name==false){

varurl=this.host+'/usernames/'+this.username+'/count/';

axios.get(url,{

responseType:'json'

})

.then(response=>{

if(response.data.count>0){

this.error_name_message='用户名已存在';

this.error_name=true;

}else{

this.error_name=false;

}

})

.catch(error=>{

console.log(error.response);



})

}

},

//检查密码

check_pwd:function(){

varre=/^[0-9A-Za-z]{8,20}$/;

if(re.test(this.password)){

this.error_password=false;

}else{

this.error_password=true;

}

},

//确认密码

check_cpwd:function(){

if(this.password!=this.password2){

this.error_check_password=true;

}else{

this.error_check_password=false;

}

},

//检查手机号

check_phone:function(){

varre=/^1[3-9]\d{9}$/;

if(re.test(this.mobile)){

this.error_phone=false;

}else{

this.error_phone_message='您输入的手机号格式不正确';

this.error_phone=true;

}

if(this.error_phone==false){

varurl=this.host+'/mobiles/'+this.mobile+'/count/';

axios.get(url,{

responseType:'json'

})

.then(response=>{

if(response.data.count>0){

this.error_phone_message='手机号已存在';

this.error_phone=true;

}else{

this.error_phone=false;

}

})

.catch(error=>{

console.log(error.response);

})

}

},

//检查图片验证码

check_image_code:function(){

if(!this.image_code){

this.error_image_code_message='请填写图片验证码';

this.error_image_code=true;


}else{

this.error_image_code=false;

}


},

//检查是否勾选协议

check_allow:function(){

if(!this.allow){

this.error_allow=true;

}else{

this.error_allow=false;

}

},

click_allow:function(){

this.allow=!this.allow

this.check_allow()

},

////发送手机短信验证码

send_check_image_code:function(){

this.check_image_code();

varurl=this.host+'/sms_code/'+this.mobile+'/?image_code='+this.image_code+'&uuid='+this.uuid;

axios.get(url,{

responseType:'json'

})

.then(response=>{

if(response.data.code=='0'){

this.error_image_code=false;

console.log("res_success");

}else{

if(response.data.code=='4001'){

this.error_image_code_message=response.data.errmsg;

this.error_image_code=true;

}else{//4002

this.error_image_code=true;

this.error_image_code_message=response.data.errmsg;

}

}


})

.catch(error=>{

console.log(error.response);

})

},

//表单提交

on_submit(){

this.check_username();

this.check_pwd();

this.check_cpwd();

this.check_allow();


if(this.error_name==true||this.error_password==true||this.error_check_password==true

||this.error_phone==true||this.error_allow==true||this.error_image_code==true){

//不满足注册条件:禁用表单

window.event.returnValue=false;

}

}

}

});




Vue绑定页面的套路导入Vue.js库和ajax请求的库准备js文件html页面绑定变量、事件等js文件定义变量、事件等错误提示如果错误提示信息是固定的,可以把错误提示信息写死,再通过v-show控制是否展示如果错误提示信息不是固定的,可以使用绑定的变量动态的展示错误提示信息,再通过v-show控制是否展示修改Vue变量的读取语法,避免和Django模板语法冲突delimiters:[’[[’,‘]]’]后续的页面中如果有类似的交互和刷新效果,也可按照此套路实现

13.状态保持

说明:

如果需求是注册成功后即表示用户登入成功,那么此时可以在注册成功后实现状态保持如果需求是注册成功后不表示用户登入成功,那么此时不用在注册成功后实现状态保持美多商城的需求是:注册成功后即表示用户登入成功

login()方法介绍用户登入本质:状态保持将通过认证的用户的唯一标识信息(比如:用户ID)写入到当前浏览器的cookie和服务端的session中。login()方法:Django用户认证系统提供了login()方法。封装了写入session的操作,帮助我们快速登入一个用户,并实现状态保持。login()位置:

django.contrib.auth.init.py文件中。

login(request,user,backend=None)状态保持session数据存储的位置:Redis数据库的1号库SESSION_ENGINE=“django.contrib.sessions.backends.cache”SESSION_CACHE_ALIAS=“session”2.login()方法登入用户#保存注册数据try:user=User.objects.create_user(username=username,password=password,mobile=mobile)exceptDatabaseError:returnrender(request,‘register.html’,{‘register_errmsg’:‘注册失败’})

#登入用户,实现状态保持login(request,user)

响应注册结果returnredirect(reverse(‘contents:index’))3.查看状态保持结果

14.用户名重复注册接口设计和定义

  1. 请求方式

  2. 选项方案请求方法GET请求地址/usernames/(?P[a-zA-Z0-9_-]{5,20})/count/2.请求参数:路径参数

  3. 参数名类型是否必传说明usernamestring是用户名3.响应结果:JSON

  4. 响应结果响应内容code状态码errmsg错误信息count记录该用户名的个数3.用户名重复注册后端逻辑classUsernameCountView(View):“”“判断用户名是否重复注册”""

  5. defget(self,request,username):

  6. """

  7. :paramrequest:请求对象

  8. :paramusername:用户名

  9. :return:JSON

  10. """

  11. count=User.objects.filter(username=username).count()

  12. returnhttp.JsonResponse({'code':RETCODE.OK,'errmsg':'OK','count':count})

用户名重复注册前端逻辑if(this.error_name==false){leturl=‘/usernames/’+this.username+‘/count/’;axios.get(url,{responseType:‘json’}).then(response=>{if(response.data.count==1){this.error_name_message=‘用户名已存在’;this.error_name=true;}else{this.error_name=false;}}).catch(error=>{console.log(error.response);})}判断用户名重复注册的核心思想:使用用户名查询该用户名对应的记录是否存在,如果存在,表示重复注册了,反之,没有重复注册。axios发送异步请求套路:处理用户交互收集请求参数准备请求地址发送异步请求得到服务器响应控制界面展示效果

15.手机号重复注册接口设计和定义

  1. 请求方式

  2. 选项方案请求方法GET请求地址/mobiles/(?P1[3-9]\d{9})/count/2.请求参数:路径参数

  3. 参数名类型是否必传说明mobilestring是手机号3.响应结果:JSON

  4. 响应结果响应内容code状态码errmsg错误信息count记录该用户名的个数3.手机号重复注册后端逻辑classMobileCountView(View):“”“判断手机号是否重复注册”""

  5. defget(self,request,mobile):

  6. """

  7. :paramrequest:请求对象

  8. :parammobile:手机号

  9. :return:JSON

  10. """

  11. count=User.objects.filter(mobile=mobile).count()

  12. returnhttp.JsonResponse({'code':RETCODE.OK,'errmsg':'OK','count':count})

手机号重复注册前端逻辑if(this.error_mobile==false){leturl=‘/mobiles/’+this.mobile+‘/count/’;axios.get(url,{responseType:‘json’}).then(response=>{if(response.data.count==1){this.error_mobile_message=‘手机号已存在’;this.error_mobile=true;}else{this.error_mobile=false;}}).catch(error=>{console.log(error.response);})}

16.图形验证码接口设计和定义

  1. 图形验证码接口设计

  2. 1.请求方式

  3. 选项方案请求方法GET请求地址image_codes/(?P[\w-]+)/2.请求参数:路径参数

  4. 参数名类型是否必传说明uuidstring是唯一编号3.响应结果:image/jpg

  5. 图形验证码接口定义1.图形验证码视图

  6. classImageCodeView(View):“”“图形验证码”""

  7. defget(self,request,uuid):

  8. """

  9. :paramrequest:请求对象

  10. :paramuuid:唯一标识图形验证码所属于的用户

  11. :return:image/jpg

  12. """

  13. pass

2.总路由

#verificationsurl(r’^’,include(‘verifications.urls’)),3.子路由

#图形验证码url(r’^image_codes/(?P[\w-]+)/$’,views.ImageCodeView.as_view()),

2.图形验证码后端逻辑

准备captcha扩展包提示:captcha扩展包用于后端生成图形验证码


可能出现的错误报错原因:环境中没有Python处理图片的库:PIL

解决办法

安装Python处理图片的库:pipinstallPillow2.准备Redis数据库准备Redis的2号库存储验证码数据

“verify_code”:{#验证码“BACKEND”:“django_redis.cache.RedisCache”,“LOCATION”:“redis://127.0.0.1:6379/2”,“OPTIONS”:{“CLIENT_CLASS”:“django_redis.client.DefaultClient”,}},3.图形验证码后端逻辑实现classImageCodeView(View):“”“图形验证码”""

defget(self,request,uuid):

"""

:paramrequest:请求对象

:paramuuid:唯一标识图形验证码所属于的用户

:return:image/jpg

"""

#生成图片验证码

name,text,image=captcha.generate_captcha()


#保存图片验证码

redis_conn=get_redis_connection('verify_code')

redis_conn.setex('img_%s'%uuid,constants.IMAGE_CODE_REDIS_EXPIRES,text)


#响应图片验证码

returnhttp.HttpResponse(image,content_type='image/jpg')


3.图形验证码前端逻辑

Vue实现图形验证码展示1.register.js

mounted(){//生成图形验证码this.generate_image_code();},methods:{//生成图形验证码generate_image_code(){//生成UUID。generateUUID():封装在common.js文件中,需要提前引入this.uuid=generateUUID();//拼接图形验证码请求地址this.image_code_url=“/image_codes/”+this.uuid+“/”;},…}2.register.html

java

  • 图形验证码

    请填写图形验证码


  • 3.图形验证码展示和存储效果

    Vue实现图形验证码校验1.register.html

  • 图形验证码

    [[error_image_code_message]]


  • 2.register.js

    check_image_code(){if(!this.image_code){this.error_image_code_message=‘请填写图片验证码’;this.error_image_code=true;}else{this.error_image_code=false;}},3.图形验证码校验效果

    17用户名登录

    1. 登录

    2. 1.请求方式

    3. 选项方案请求方法POST请求地址/login/2.请求参数:表单

    4. 参数名类型是否必传说明usernamestring是用户名passwordstring是密码rememberedstring是是否记住用户3.响应结果:HTML

    5. 字段说明登录失败响应错误提示登录成功重定向到首页3.用户名登录接口定义classLoginView(View):“”“用户名登录”""

    6. defget(self,request):

    7. """

    8. 提供登录界面

    9. :paramrequest:请求对象

    10. :return:登录界面

    11. """

    12. pass

    defpost(self,request):

    """

    实现登录逻辑

    :paramrequest:请求对象

    :return:登录结果

    """

    pass


    用户名登录后端逻辑classLoginView(View):“”“用户名登录”""defget(self,request):“”"提供登录界面:paramrequest:请求对象:return:登录界面“”"returnrender(request,‘login.html’)defpost(self,request):“”"实现登录逻辑“”"#接受参数username=request.POST.get(‘username’)password=request.POST.get(‘password’)remembered=request.POST.get(‘r’)#认证登录用户

    user=authenticate(username=username,password=password)

    ifuserisNone:

    returnrender(request,'login.html',{'account_errmsg':'用户名或密码错误'})


    #实现状态保持

    login(request,user)

    #设置状态保持的周期

    ifremembered!='on':

    #没有记住用户:浏览器会话结束就过期,默认是两周

    request.session.set_expiry(0)


    #响应登录结果

    returnredirect(reverse('contents:index'))


    登录的核心思想:认证和状态保持通过用户的认证,确定该登录用户是美多商场的注册用户。通过状态保持缓存用户的唯一标识信息,用于后续是否登录的判断。

    2.退出登录

    logout()方法介绍退出登录:

    回顾登录:将通过认证的用户的唯一标识信息,写入到当前session会话中退出登录:正好和登录相反(清理session会话信息)logout()方法:

    Django用户认证系统提供了logout()方法封装了清理session的操作,帮助我们快速实现登出一个用户logout()位置:

    django.contrib.auth.init.py文件中logout(request)2.logout()方法使用classLogoutView(View):“”“退出登录”""

    defget(self,request):

    """实现退出登录逻辑"""

    #清理session

    logout(request)

    #退出登录,重定向到登录页

    response=redirect(reverse('users:login'))

    #退出登录时清除cookie中的username

    response.delete_cookie('username')


    returnresponse


    退出登录的核心思想就是清理登录时缓存的状态保持信息。由于首页中用户名是从cookie中读取的。所以退出登录时,需要将cookie中用户名清除。

    3.首页展示

    Vue渲染首页用户名1.index.html

    欢迎您:[[username]]

    |

    退出

    登录

    |

    注册


    2.index.js

    mounted(){//获取cookie中的用户名this.username=getCookie(‘username’);},

    完成登录展示


    相关问题推荐

    没有解决我的问题,去提问