实现注册的基本逻辑:

1,注册页面

  • 注意:注册页面需要静态文件的支持,另外注册页面是基础基类的,
  • 1,url,路由系统,
  • 2,views,视图系统,还是使用类视图,里面有很多的函数,

2,views.py文件

  • get函数,返回浏览器注册页面,
  • post函数,
  • 这个函数处理四个事情:#web开发的通用的一个流程就是这样的,
  • 1,接收数据
  • 2,进行数据校验:用户已存在的时候要做异常处理,注册失败的时候要做异常处理,
  • 3,进行业务处理,进行用户注册,创建一条用户记录,可以使用django的认证系统,提供了一个创建用户的方法,
  • user = User.objects.create_user(username, email, password)
  • 4,返回应答,使用反向解析返回首页,valid:有效的  pattern:模式

######################################################################

激活邮件的设计思路

  • 需求背景:
  • 用户注册之后,给用户发送一个激活邮件,提示用户去打开邮件,
  • 然后用户点击这个激活邮件之后激活账户,点击激活连接要跳转到登陆页面
  • 如果链接过期了之后,实际应该返回一个页面,然后点击一个地方,可以再发一个激活连接,
  • 代码设计,
  • 发送激活邮件,包含激活链接,每一个人的都应该是不一样的,包含用户的身份信息,如何设计??
  • 设计成这样一个连接,127.0.0.1:8000/user/active/1(id)
  • 这样发了这个邮件,我就可以获取到最后的id,我收到了邮件,就知道你在激活,我就可以去修改数据库了,
  • 但是有些人会捣乱,不停的修改id去访问,所以怎么办?就要id加密
  • 加密:
  • 引入一个包:from itsdangerous import TimedJSONWebSignatureSerializer as Serializer,这个这个包加密,
  • 除了加密之外,还可以设置过期时间,时间过了连接失效,就不能激活了,
  • 发送邮件的配置:
  • 加密是在注册的函数,解密的时候是一个单独的函数,解密函数,

问题:

  • 发邮件的流程需要优化,因为这是一个阻塞型的,因为邮件没发完就要等待,用户体验不好,怎么解决?
  • 异步执行任务,python中有一个celery的包,可以执行异步的执行任务,比如发送邮件,上传文件,下载文件,这种耗时的操作都可以使用celery

##################################################################

好了,task启动成功了,

哈哈,我现在已经把邮件发出去了,哈哈!!!!

总结:

这一个问题,我太痛苦了,专门系统学习了Linux,git,redis,还有各种坑,装了很多的东西,包括完整的开发环境,花费了我4天的时间,

不过总的来讲还是非常值得的,

######################################################################################################

用户登录:

login类里面,继续写post函数,

  • 要做四个事情,
  • 接受数据
  • 校验数据
  • 业务处理,登陆校验,使用django的认证系统,user = authenticate(username=username, password=password)
  • 返回应答,

配置redis,作为django缓存和session存储后端,

  • 如果你不做配置,session是放在数据库中,
  • 但是每次都到数据库中读写,速度是比较慢的,所以不能使用默认的保存session的方式,我们要有redis数据库,
  • 我们需要用到一个包,django-redis,
  • 怎么使用?
  • 要配置,
  • # Django的缓存配置,默认缓存是在本机内存中
    CACHES = {
    "default": {
    "BACKEND": "django_redis.cache.RedisCache",
    'LOCATION': 'redis://:###@192.168.80.129:6379/5',
    "OPTIONS": {
    "CLIENT_CLASS": "django_redis.client.DefaultClient",
    }
    }
    } # 配置session存储,默认的登录状态是保存在django数据库中的session表中
    SESSION_ENGINE = "django.contrib.sessions.backends.cache"
    SESSION_CACHE_ALIAS = "default"
  • 我配置到了redis的5号数据库,
  • redis-cli -h 192.168.80.129
  • SELECT 5
  • keys *  (empty list or set)
  • 然后登陆,
  • 再去查看keys * 你就发现是有一个记录了,就是session记录,

抽象父模板

  • 一个base.html
  • 一个base_no_cart.html,
  • 这两个就可以另外的页面继承了,
  • 一个base_use_center.html,这个继承base.html
  • 一个base_detail_list.html,这个继承base_no_cart.html,
  • 然后就可以使用这四个父模板来改造我们的网页了,
  • 首先改造注册和登陆的页面,改造成功,

用户中心页面显示,

  • 先让用户信息的3个页面显示出来,
  • 页面,url,views,三个有了, 就可以显示了,

登陆装饰器和登陆后页面跳转

  • 户信息的3个页面,没有登陆是不能看到的,所以要判断,
  • 使用django带的认证系统给的登陆装饰器,LoginRequired
  • 目前看来,django的认证系统需要系统的学习,
  • from django.contrib.auth.decorators import login_required
  • 总体的实现效果:
  • 如果用户没有登陆访问一个用户中心页面,会跳出去到登陆页面,后面会加上url,
  • 登陆之后,会直接到用户中心页面,
  • 如果直接登陆,就是到首页
  • 这就是使用的django内置的登陆装饰器实现的, 所以这个要学习,

LoginRequiredMixin类的使用:

  • 如果你有很多的视图都要使用登陆装饰器,可以封装一个类
  • 在项目里面,一些通用的东西,我们会新建一个文件夹,utils,工具,
  • 我们新建一个文件,Mixin,在这个里面新建一个类方法,LoginRequiredMixin
  • 关于封装,继承,父类,这些概念的理解还不到位,
  • 原理:
  • 输入用户中心的地方,它调用的是url里面的对应关系,
  • 然后调用的as_view,不再是原来的了,而是我们封装的,LoginRequiredMixin的as_view,做了一个包装,这个原理有时间要理清楚,

登陆后欢迎信息

  • 登陆了之后,就不能再显示登陆和注册的按钮了,
  • 怎么做?
  • 还是django的认证系统,user.is_authenticated
  • 登陆的话,request.user返回的是一个真实的user对象,否则返回的是一个anonymousUser对象
  • # # 真实对象的is_authenticated方法返回的是true,匿名对象的这个方法返回的是false
  • # # django自动会吧request.user对象返回给模板中,不需要手动传递,只需要在模板中调用user即可

退出用户登陆

  • 页面要显示退出按钮,
  • 点击退出要调用退出函数,清除session,退出,跳转到登录页,
  • 使用的也是使用的django的认证系统提供的logout,
  • from django.contrib.auth import authenticate, login, logout
  • 退出的时候返回登陆页面,还是使用了反向解析,

###########################################

上面就是一连串的操作,

  • 1,登陆判断,这是使用的内置的认证系统,
  • 2,欢迎信息,这是使用的内置的认证系统,
  • 3,退出登陆,这是使用的内置的认证系统,

##################################################

用户中心-个人信息页面完善,

  • 需要获取用户的个人信息,
  • 展示默认的收获地址,
  • 获取用户最近的浏览记录,
  • 需求:
  • 1,什么时候添加浏览记录?肯定是访问商品的详情页面的时候(在商品详情对应的视图中,),需要添加历史浏览记录,
  • 2,什么时候获取浏览记录?访问用户个人中心的时候,获取历史浏览记录,
  • 3,历史浏览记录存储在哪里?如果放在数据库,每次客户浏览都要操作数据库,数据库会压力很大,所以怎么存?我们就可以使用redis数据库,
  • 4,怎么存储到redis中?存储历史浏览记录的格式是什么样子的?这个就要分析,redis中有五种数据类型,你存储就是这五种,
  • 分析:
  • 存储用户的历史浏览记录时是所有用户用一条保存,还是每一个用户的浏览记录使用一条数据保存,
  • 如果所有用户用一条保存,可以使用hash,属性标记用户,user_用户id:商品ID,但是我们讲过hash的值只能是字符串,但是商品id可以有很多个,可以使用字符串,然后使用逗号隔开,又浏览商品了,还需要往字符串添加值,这就是使用hash,需要不停的操作字符串,
  • 格式:history: user_用户id:‘1,2,3’
  • 每一个用户的浏览记录使用一条数据保存,我们选择什么数据类型,
  • 格式:history: user_用户id:[1,2,3],
  • 我们可以把最新的插入到最左侧,所以浏览记录就是从左往右操作,所以无论加数据还是取数据,都比上一个好,
  • 结论:对比之后,我们使用list才存储浏览记录,
  • 整个设计思路,以及操作思路都非常的清晰,对我非常的有用,
  • 我们进行图片的存储是使用fastDFS文件系统的,后面我就研究一下,

用户中心-订单信息页面完善,

  • 订单信息

用户中心-地址信息页面完善

  • 有了页面,页面有一个表单,post的时候可以提交新的地址信息,
  • AddressView类,需要做两个事情,
  • get的时候,获取收获地址,
  • post的时候,接收表单信息,校验数据,保存到数据库,返回应答
  • 模型管理类方法的封装:
  • 根据条件查询一个默认收货地址,很多地方用到了,
  • 是否可以封装一下,
  • 这个封装的思想要好好理解一下,
  • 整体的地址页面还没有开发完整,
  • 地址列表的展示,
  • 地址的删除,修改,等等,这些后续的再去做,现在不做,

######################################################################

系统中的图片存储

  • 我们进行图片的存储是使用fastDFS文件系统的,后面我就研究一下,单独开一个博客

python和fastdfs的交互:

项目中上传和使用图片的流程:

  • 解决了文件的海量存储,存储空间的扩展方便,重复文件只存储一遍,
  • 通过admin后台管理页面,上传图片,默认保存在django服务器
  • 现在我们不保存在django中了,而是保存在fdfs文件存储服务器,
  • 最终会返回一个文件的id,这个id要保存在对应的表中,
  • 整个上传的流程就是这样的,
  • 现在浏览器要请求页面了,访问页面,要把图片的地址进行一个替换,
  • 所以图片地址前面需要写上Nginx的地址,渲染成这个内容,<img src='http://192.168.100.128:8888/文件id'>
  • 然后浏览器识别到图片路径,会根据路径请求Nginx,然后Nginx在fastdfs中取出图片,返回给浏览器,就可以显示页面图片了,会发现这个过程是没有经过django的,这样就会快了,
  • 整个流程关键是上传的点,我们需要修改django的上传行为,不让他上传到django服务器了,而且到fastdfs+Nginx,,,获取的流程只要配置fastdfs+Nginx好了就可以了,

自定义文件存储类:

  • 修改django的上传行为,我们要对django进行二次开发,这个技能非常的关键,这说明对django的原理已经非常的了解了,
  • django中有一个filesystemstorage类,是默认存储在media root中,但是我们不能改动django的源码,它有一个父类,我们只需要继承父类重写这个方法就可以了,就可以边界我们自定义的文件存储类了,
  • from django.core.files.storage import Storage
  • 配置文件fdfs-client:
  • base_path=D:\AI\fdfs-client-log
  • tracker_server=192.168.100.128:22122
  • 定义自定义文件存储类,

使用admin页面测试文件存储类:

  • http://127.0.0.1:8000/admin/login/,访问这个页面是需要做一些django的app模块里面做配置的,
  • 具体的django的admin内容还需要继续学习,
  • 需要创建一个admin用户,如何创建?
  • D:\AI\dailyfresh>python manage.py createsuperuser
    Username: admin
    Email address:
    Password:
    Password (again):
    Superuser created successfully.

  • 登陆就成功了
  • 增加一个商品分类的图片,点击保存,看看是否成功,
  • [-] Error: 10060 connect to 192.168.100.128:22122. 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。.
  • 换包的问题,我待会看看,借这个机会,我再次梳理一下,fastdfs+Nginx的安装配置过程,单独开一个博客
  • 继续已经解决问题了,
  • 已经可以成功保存数据了,

改进我们的自定义文件存储类:

  • 把配置文件的加载地址不要写死,ip也不要写死,要动态的使用,
  • 在init里面做,增加几个参数,
  • client_conf,这是配置文件的加载地址,
  • base_url,这是Nginx的地址,
  • 并且把地址都写到settings里面去,这样代码都不需要动,你只需要改动配置文件,
  • 这个文件的名字不是固定的,有意义就可以了,如果是django的配置文件就不能随便改动,一定要django的,

关于fastdfs的总结:

  • 为什么要使用fastdfs,容量扩张问题,文件重复问题,获取图片效率问题,
  • 上传和下载流程,
  • 自定义存储类的编写,

python-django框架-电商项目-用户模块开发_20191117的更多相关文章

  1. python-django框架-电商项目-订单模块开发_20191125

    python-django框架-电商项目-订单模块开发 提交订单页面: 在购物车中点击提交订单,就应该到达提交订单页面了, 显示: 1,收获地址, 2,支付方式 3,用户购买的商品信息,数量,小计, ...

  2. python-django框架-电商项目-购物车模块开发_20191125

    python-django框架-电商项目-购物车模块开发 商品详情页js代码: 在商品详情页,有加入购物车按钮, 点击加减号可以增加减少,手动输入也可以, 点击加入购物车,就要加过去, 先实现加减的操 ...

  3. python-django框架-电商项目-商品模块开发_20191124

    用户浏览记录的添加 什么时候添加历史浏览记录? 在商品详情的视图里面添加浏览记录, 之前使用的list来存储浏览记录, 注意:如果good_id之前已经浏览过了,那就要移除,conn.lrem(his ...

  4. Python Django(WEB电商项目构建)

    (坚持每一天,就是成功) Python Django Web框架,Django是一个开放源代码的Web应用框架,由Python写成.采用了MTV的框架模式,即模型M,模板T和视图V组成. 安装Pyth ...

  5. python-django框架-电商项目-项目部署_20191127

    python-django框架-电商项目-项目部署: uwsgi作为web服务器: 在pycharm中启动项目:使用python manage.py runserver 这个runserver是dja ...

  6. python-django框架-电商项目-首页开发_20191122

    python-django框架-电商项目-首页开发 业务背景: 用户浏览网站一定是先到首页, 没有登陆的话首页内容完全一样,而且是不经常变化的, 一段时间内,有100用户访问,就要有几个用户就要查询多 ...

  7. 小D课堂 - 新版本微服务springcloud+Docker教程_2_04微服务下电商项目基础模块设计

    笔记 4.微服务下电商项目基础模块设计     简介:微服务下电商项目基础模块设计 分离几个模块,课程围绕这个基础项目进行学习             小而精的方式学习微服务 1.用户服务       ...

  8. 常见电商项目的数据库表设计(MySQL版)

    转自:https://cloud.tencent.com/developer/article/1164332 简介: 目的: 电商常用功能模块的数据库设计 常见问题的数据库解决方案 环境: MySQL ...

  9. web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 ☝☝☝

    web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程    web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 学习 ...

随机推荐

  1. python clickZan

    import pyautogui,time,random pyautogui.PAUSE = 3 pyautogui.FAILSAFE = True width, height = pyautogui ...

  2. Windbg 实践之符号篇

    How to display the size value 1)一开始不会加载,chksym 了一下就加载了. 2) 新版本已经可以显示size的大小了 3)?? 显示变量的类型 4)x std::v ...

  3. ThinkCMF后台地址加密忘记了无法打开后台怎么办?

    ThinkCMF后台地址加密忘记了无法打开后台怎么办?笔者为了网站安全把ThinkCMF后台的安全模式打开后忘了保存加密地址,导致无法登陆后台,找了些网上的资料,不太靠谱,只好从代码入手,找到/app ...

  4. php中const和define的区别

    define部分:宏不仅可以用来代替常数值,还可以用来代替表达式,甚至是代码段.(宏的功能很强大,但也容易出错,所以其利弊大小颇有争议.)宏的语法为:#define 宏名称 宏值作为一种建议和一种广大 ...

  5. win10查看显卡算力

    1.查看笔记本自带算力 运行C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2\extras\demo_suite目录下的deviceQue ...

  6. Linxu--导出oracle数据

    配置导出的表:(configure.sh) #!/bin/bash function get_config() { tables=( BLOG WF_PROCESS WF_TASK WF_TASK_A ...

  7. Python笔记_第四篇_高阶编程_检测_2.文档检测

    1. 文档检测: 我们观察官方的函数编写的时候会在函数或者类当中有些类的备注,这些备注叫做文档.当我们在编写函数的时候,可以去显示这些文档.因此我们可以用这个文档来进行检测.另外我们还需要导入doct ...

  8. python 删除文件

    import os 删除文件: os.remove() 删除空目录: os.rmdir() 递归删除空目录: os.removedirs() 递归删除目录和文件(类似DOS命令DeleteTree): ...

  9. 吴裕雄--天生自然Linux操作系统:Linux 简介

    Linux 内核最初只是由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的. Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 PO ...

  10. ssh登录脚本

    #!/usr/bin/expect set timeout 100 set passwd "your password" spawn shell expect "key& ...