一.用户登录
首先在user子应用中的views文件中新建登陆视图类,定义一个get方法用于返回用户登录页面。然后定义post方法实现用户登录逻辑,并在子路由中添加路由。
前端在点击提交时,会携带三个表单参数:用户名、密码、是否记住用户。在post方法中,首先接受这三个参数,然后校验参数是否齐全,用户名和密码是否合法。Django提供了用户认证方法authenticate(),将用户名和密码作为参数传入,如果用户名和密码正确,则会返回一个用户对象,如果错误返回None。我们要判断一下返回的是否是None,如果是None,响应错误信息。如果账户密码正确,再判断用户是否记住登录,如果没有就将用户信息保存在session中的周期设置为0,表示会话框关闭时过期。如果用户记住登陆,就设置为None,表示两周后过期。因为我们在页面的上方要展示用户的用户名,所以我们在响应之前,要将用户名写入到cookie中,然后前端就可以使用vue获取到保存在cookie中的用户名,并展示在页面上方。
二.多账号登陆
接下来要实现的就是多账号登陆,也就是用户名和手机号都可以作为账号登陆,但是Django提供的authenticate()用户认证系统并不支持多账号登陆,只支持用户名登陆,所以我们要自定义一个用户认证系统。首先新建utils.py工具文件,在utils.py中新建一个用户认证类继承自Django的ModelBackend类,然后重写authenticate()方法。在重写authenticate()方法之前,我们要在类外面定义一个判断用户输入的是用户名还是手机号的方法get_user_by_account(),使用正则进行判断,然后在使用条件查询出对应的用户对象,如果查到了就返回用户对象,没查到返回None。然后在重写的authenticate()方法中,首先将用户传入的账号给get_user_by_account方法,然后判断返回值是否为None,密码是否对应正确,如果对应正确的话,就返回用户对象,如果返回值为None或者密码错误,就返回None。自定义用户认证类之后,我们还要在项目配置文件中找到Django指定的名为AUTHENTICATION_BACKENDS的列表,然后将Django指定的用户认证类删除,把我们定义的用户认证类的路径添加进去。
三.退出登录
接下来实现用户退出登录的操作,首先定义用户退出登录视图,然后定义get方法实现退出登录逻辑,并在子路由种添加路由。退出登录的业务逻辑只有三步,首先清除session中的状态保持信息,然后删除cookie,最后重定向到首页就完成了。
四.判断用户是否登录
由于我们的一些页面不可以让未登录的用户进入,比如用户中心。所以我们要在用户点击这些页面时,跳转到登陆页面。Django为我们提供了LoginRequiredMixin类,我们只需要让只有登录用户可以访问的页面视图类继承自LoginRequiredMixin类就可以实现了(注:必须放在其他父类前面),这样当未用户点击了该页面时,就会跳转到登陆页面。但是当用户跳转到登陆页面登录成功之后,我们就不应该再重定向到首页了,我们应该重定向到用户点击的那个页面。LoginRequiredMixin类在跳转到登陆页面时,会携带next查询字符串参数,next参数保存的就是用户点击的页面地址,所以我们在用户登录成功之后,要判断next是否存在,如果存在就重定向至next,如果不存在则重定向到首页。
黑马Python教程实战项目--美多商城(四)
最新推荐文章于 2022-06-08 14:50:54 发布