黑马Python教程实战项目--美多商城(五)

一.用户基本信息
  首先需要为用户模型类,也就是用户数据表,补充一个邮箱验证状态字段,用来记录用户的邮箱是否验证成功。然后新建用户中心视图类,继承LoginRequiredMixin和View类,在子路由中添加路由。定义get方法,在request中获取登陆的用户对象,构造响应体,将用户的基本信息渲染在用户中心html文件,并响应给前端。
二.添加和验证邮箱
  当用户在用户中心页点击了添加邮箱时,前端会发送一个ajax的put请求,并携带一个邮箱参数。在user子应用中的views文件里,定义一个添加邮箱视图类,在子路由中添加路由,定义put方法。然后接受参数,校验邮箱地址是否合法。不合法就中断请求,返回错误信息,合法就将邮箱保存进数据库中,并响应结果。
  因为添加邮箱这个视图也是必须登录用户才能进,所以我们也要进行判断,但是添加邮箱这个请求是ajax请求,需要返回json类型的数据,而Django所提供的LoginRequiredMixin返回的不是json类型的数据。所以我们要自定义一个可以返回json类型的判断登录的类。我们在utils中定义一个LoginRequiredJSONMixin可以返回json的类,继承自LoginRequiredMixin类,重写handle_no_permission()方法,在这个方法中,返回JsonResponse响应。
  接下来,用户在保存邮箱之后,我们需要给用户的邮箱发送验证邮件,Django提供了一个发送邮件的方法send_mail(),要给方法传邮件标题、邮件正文、发件人、收件人列表等参数。这时,我们虽然有了发邮件的方法,但是我们还要准备一个发邮件的服务器,也就是163、QQ等邮箱帮我们发邮件。在这些邮箱里面都有一个SMTP/POP3服务,我们要把这个服务开启,会有一个授权码。接着在项目开发配置文件中,配置邮件服务器的参数:EMAIL_BACKEND(指定邮件后端,我们使用Django提供的django.core.mail.backends.smtp.EmailBackend)、EMAIL_HOST(发邮件主机)、EMAIL_PORT(发邮件端口)、EMAIL_HOST_USER(授权的邮箱)、EMAIL_HOST_PASSWORD(授权码)、EMAIL_FROM (发件人抬头)
  与发送短信验证码一样,发送验证邮件同意不能阻塞返回响应,要使用Celery异步方案。在Celery包中新建email包,新增tasks.py文件,在tasks.py文件中定义发送邮件方法,并在Celery包中的main文件中注册任务。发送验证邮件方法做好之后,我们要关注一下邮件内容了,因为是要验证邮件,所以邮件内容正文应为美多商城的验证链接,所以我们要定义一个生成验证链接的方法。我们在utils中定义生成验证链接的方法,然后在这个方法中我们使用itsdangerous模块中的TimedJSONWebSignatureSerializer类,来序列化用户id和email,将序列化的结果作为我们的验证链接。首先创建TimedJSONWebSignatureSerializer的实例化对象,创建对象要传入两个参数,一个就是序列化key,也就是按照key进行序列化,key越复杂序列化之后就越复杂,另一个参数是序列化有效期。创建过对象之后,使用对象调用dumps()方法,然后将用户id和email传入,就可以得到序列化结果,然后将序列化结果拼接到查询字符串参数中,得到验证邮箱链接。
  用户在接收到验证邮件,点击验证链接时,会向服务器发送一个get请求,定义一个邮箱验证视图,在子路由中添加路由,定义一个get方法。首先接受查询字符串参数,然后就要根据查询字符串参数进行查找对应用户。在utils中定义一个反序列化并返回用户对象的方法,在这个方法中,首先我们应该实例化TimedJSONWebSignatureSerializer对象,传入的两个参数必须要和序列化的时候传入的一致,然后使用对象调用loads()方法,将序列化的字符串传入,就会得到我们之前的原始数据。在调用loads()方法时,要try一下,因为有可能token已经过期了。所以如果出现BadData异常,就返回None,反之就将查询出来的user_id和email作为条件进行查询用户,然后将用户对象返回。get方法中,调用反序列化方法后,判断返回的是否是None,如果是None就响应错误信息,如果是用户对象,就将该用户对象的email_active的值修改为True,然后重定向到首页。
三.收货地址
  创建一个areas子应用用来操作收货地址,并在项目配置文件中注册子应用,在总路由中添加路由,然后新建一个自关联的数据表用来存储省市区信息。用户在选择地区时,前端会发送ajax的get请求,可能会携带area_id参数,也可能不携带,如果携带参数则表示要获取市/区的信息,反之则表示要获取省的信息。首先定义一个get方法,然后接受参数,然后判断参数是否存在。如果area_id不存在,就获取省份信息,将parent is None作为条件查询出来所有的省份,然后将省份模型列表转化为字典列表,响应给前端。如果area_id存在,就将area_id作为条件先查询出对应的省份对象,然后使用一查多的语法查询出对应的市/区模型列表,然后将模型列表转化为字典列表,响应给前端。因为省市区数据基本上变化不大,但是用户每次选择地址都要查询数据库,极大的降低了效率,所以我们可以将查询出来的省市区数据进行缓存。使用Django提供的cache模块进行缓存,在前端发过来请求时,首先判断缓存中是否存在,如果缓存中没有,再查询数据库,然后查询出来之后再保存进缓存。
  地址数据弄好之后,我们就要进行用户地址的增删改查了,首先在User子应用中的model中新建一个用户地址模型类,并在User模型类中新增一个默认地址字段。在views中定义新增用户收货地址的视图类,并在子路由中新增路由。用户在新增收货地址时,前端会向服务器发送ajax的POST请求,在请求体中携带六个必传参数:receiver(收货人),province_id(省id),city_id(市id),district_id(区id),place(详细地址),mobile(手机号),以及两个可选参数tel(固定电话),email(邮箱)。在视图类中定义post方法,在post方法中接受参数,然后校验必传参数的完整性和手机号的合法性。校验之后,将用户传入的数据保存到数据库中,保存之后,判断用户是否有默认地址,如果没有的话,就将新增的这个地址设置为默认地址,然后返回响应。
  在views中定义查询用户收货地址的视图类,在子路由中新增路由,在该视图类中定义get方法,然后在get方法中,从request中获取登陆用户,然后将用户作为条件查询收货地址列表,然后将模型列表转换为字典列表,将字典列表和html文件响应给前端。
  用户在修改地址时,前端会发送ajax的PUT请求,修改地址的请求与新增地址的请求一样,只是多了一个路径参数address_id。新建一个修改地址的视图类,在子路由中新增路由,然后定义put方法,在put方法中与新增地址逻辑类似,首先接受参数,校验参数,然后再将用户传入的数据覆盖保存到数据库中,保存之后,返回响应。
  删除地址与修改地址的请求路径一样,只不过请求方法和参数不同,删除地址时是DELETE请求,只携带了一个路径参数address_id。定义一个delete方法,在delete方法中,先接受参数,然后将address_id作为条件进行查询地址对象,然后将查询出来的地址对象的is_delete属性值修改为True,实现逻辑删除,删除之后,返回响应。
  用户可以在收货地址展示页,将不是默认地址的收货地址,设置为默认地址,在用户设置默认地址时,会向服务器发送一个ajax的PUT请求,并携带一个路径参数address_id。定义一个设置默认地址的视图类,在子路由中新增路由,然后定义put方法,在put方法中将address_id作为条件查询出地址对象,然后从request中获取用户对象,然后将用户对象的default_address属性修改为查询出来的地址对象,然后返回响应。
  因为地址标题在新增地址时默认为收货人,所以用户可以在收货地址展示页修改地址标题,用户修改地址标题时,会向服务器发送一个携带路径参数address_id和一个请求体参数title的ajax的PUT请求。定义修改地址标题的视图类,并在子路由中新增路由,然后定义put方法,在put方法中,首先接受参数title,然后将address_id作为条件查询出地址对象,然后修改地址对象的title属性为参数title。修改完成后,返回响应。
四.修改密码
  首先定义修改密码的视图类,并在子路由中添加路由,然后定义get方法,返回修改密码界面。用户在修改密码时,前端会向服务器发送一个POST请求,并携带三个表单参数old_password、new_password、new_password2。定义一个post方法,在post方法中首先接受这三个参数,然后校验参数的完整性和合法性,以及两个新密码是否一致。校验之后,从request中获取登陆用户对象,通过用户对象调用Django自带的用户验证系统check_password(),判断密码是否正确,不正确就返回错误信息,正确的话就通过用户对象调用set_password()方法,将用户要修改的密码保存进数据库。修改密码成功之后,清除状态保持,并重定向到登陆页面。
黑马Python教程实战项目--美多商城(五)_第1张图片
黑马Python教程实战项目--美多商城(五)_第2张图片
黑马Python教程实战项目--美多商城(五)_第3张图片
黑马Python教程实战项目--美多商城(五)_第4张图片
黑马Python教程实战项目--美多商城(五)_第5张图片

你可能感兴趣的:(美多商城,django,python)