python-django框架-电商项目-首页开发_20191122
python-django框架-电商项目-首页开发
业务背景:
- 用户浏览网站一定是先到首页,
- 没有登陆的话首页内容完全一样,而且是不经常变化的,
- 一段时间内,有100用户访问,就要有几个用户就要查询多少次数据库,
- 查出来的数据都是一样的,
- 怎么办?
- 我们把页面生成一个静态页面,
- 用户访问的时候,我给用户返回一个静态的页面,
- 可以使用我们之前讲到的celery,定义一个任务函数,生成一个静态页面,
- 什么时候首页的静态页面需要重新生成?
- 页面改动的时候就需要重新生成,
- 当管理员在后台修改了首页的信息,对应的表格中的数据的时候,需要重新生成我们的首页静态文件,
给celery定义个任务函数:
- generate_static_index_html函数
- 在虚拟机启动worker,
- 把项目代码复制到虚拟机中,可以放到桌面
- 进入项目路径,/home/andy/桌面/dailyfresh/,一定要在这个项目目录下面!!
- 进入虚拟机工作空间,workon lq_py3
- 启动这个任务,celery -A celery_tasks.tasks worker -l info
- 报错了,应该是有服务没有启动,借这个机会,我重新梳理一下celery,重新开一个博客,
- 启动成功了,继续,
发出celery任务
- 在django的console,
- 输入from celery_tasks.tasks import generate_static_index_html
- generate_static_index_html.delay()
- 现在这个页面已经生成了,但是这个文件是在Ubuntu生成的,那我们怎么访问这个页面?
配置Nginx提交静态页面,
- 我们启动了一个celery的task
- 我们只要一发送django的这个任务,就会生成静态页面,
- 但是这个页面是生成在celery这边的,
- 怎么访问?
- Nginx之前可以提供图片,同样的,用户可以直接访问Nginx,Nginx也可以返回静态页面,
- 所以用户只要访问浏览器,直接访问Nginx就可以返回对应的页面了,
- 需要配置一下,
- 打开配置文件,在usr/local/nginx
- 配置文件可以再加一个server,一个server就是一个Nginx服务器,
- 加两个地方的配置项,
- 重启Nginx,
- sudo sbin/nginx -s reload
- nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)
- 解决方法:
- [root@localhost nginx]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
- 这个时候实际启动了两个server,一个8888,一个80,
- 这个时候在虚拟机中输入http://127.0.0.1/,默认访问80端口,就可以看到我们的首页了,
- 在外部访问也是一样的,http://192.168.100.128/
更新首页内容时,重新生成静态页面,
- 后台admin修改了首页的内容,就需要再次生成静态页面,
- 如何操作?
- 每一个后台管理页面,都可以定义一个模型管理类,继承modeladmin,
- 这里面有两个方法, 一个savemodel,一个deletemodel,
- 后台管理员更新数据的时候,就会执行savemodel,如果删除数据就是deletemodel,
- 我们需要在这两个方法中加附加的操作,修改的时候重新生成静态页面
- 我们不能改他的源代码,我们可以重写这个方法,
- 生成静态页面的代码,我们采用异步,就是因为生成的代码需要时间,如果生成比较就页面就会比较卡,
静态页面和indexview的调度说明:
- 我们访问静态页面,是访问的Nginx,但是django和Nginx可能不在一台电脑上,
- 怎么让用户直接访问静态页面,
- 部署的时候,
- django网站,celery服务器,这可能在不同的电脑,
- django服务器上是indexviews,
- celery服务器上是一个静态页面,
- 搭建一个Nginx,用来调度,Nginx有自己的ip,浏览器用户访问整个网站的时候,我只暴露Nginx的ip,我只会告诉客户Nginx的服务器,先去请求Nginx,然后Nginx决定是要返回静态页面,还是调用django的视图,
- 怎么区分,需要对两个地址做设计,直接访问Nginx地址的ip的时候,直接把静态的页面找到,如果是访问的是一个ip后面还有地址,比如一个index,就要交给django服务器,这就是区分的方法,
- http://192.168.100.128/,访问celery服务器的静态页面,
- http://192.168.100.128/index,访问django服务器的indexviews视图,
- 所以我们队indexviews的对对应的地址做一个修改,加上index,
- 还有好几个页面没有写,后面需要自己写的,
页数数据的缓存:
- 什么是页面数据的缓存?
- 看首页,很多内容无论有没有登陆都是一样的,
- 有区别的地方是登陆之后有一部分不一样,
- 这样很多人访问首页,就要反复查数据库,所以可以把页面存放在缓存中,当再次使用这些数据时,先从缓存中获取,如果获取不到,再去查询数据库, 减少数据库查询的次数
- django中的缓存相关的知识:
- django提供了缓存的功能,使用缓存的目的就是可以方便拿,通过配置setting中的cash可以配置缓存,
- 有几种级别,
- 站点级别的缓存,这个是整个网站都缓存,这个占用的空间太大了,不合适,
- 单个view的缓存,django提供了一个方法,cash_page,这是一个装饰器,这种第一次访问视图的时候缓存起来,然后下一次从缓存中取,这种不合适,为什么?因为每一个用户的数据是不一样的,所以不能使用单个view的缓存,
- 模板片段的缓存,load_cache,这种业不合适,因为使用模板的时候最后使用模板, 但是前面都查完了所以不合适,
- 所以都不合适,
- 所以我们需要操作底层的缓存api,自己设计,
- 怎么设计?
- 我们缓存的时候只需要缓存一部分数据,拿到数据之后就可以设置缓存了,
- 用法:
- from django.core.cache import cache
- cache.set(key,value,过期时间timeout),这个timeout可选,不选就是永久,所以要设置,
- 设置成功了,从redis客户端可以查看到,
- context = cache.get('index_page_data')
什么时候更新缓存的数据?
- 管理员修改了首页的数据的时候,需要更改缓存的数据,
- 还是在admin里面,把之前缓存的数据清除,下一次就会再次生成这个数据的缓存,就相当于更新了,
- cache.delete('index_page_data')
- 为什么缓存要设置过期的时间?
- 数据改了还是会显示缓存的内容,所以要设置过期时间,防止一直都是查的缓存,
总结一下页面的静态化和缓存的设置:
- 其实不影响网站的功能,是对网站性能的优化,
- 你进行网站优化,一个关键点,就是减少数据库查询的次数,
- 面试问道就是页面的静态化,和数据的缓存,
- 还可以防止恶意的攻击,黑客同时对你的服务器发起访问,如果你没有使用页面静态化,你就要每次都要查,数量太大了,你的网站是处理不了的,会导致网站崩溃,
首页内容的获取和展示:
- 获取商品的种类信息,
- 获取首页的轮播商品信息,
- 获取促销活动信息,
- 获取首页分类商品展示信息,
- 获取用户购物车商品数量,
redis存储购物车记录分析:
- 1,什么时候添加购物车记录?
- 用户点击添加到购物车的时候添加,
- 在商品详情页面点击加入购物车,还有在商品列表页点击加入购物车,
- 两个地方都可以加入购物车,我们需要添加购物车记录,,
- 2,什么时候需要获取购物车记录,
- 页面的顶部需要,和购物车页面需要获取,
- 3,使用什么存储购物车记录,
- 这个和浏览记录一样,浏览比较快,添加购物车也是比较快,存在表里面会不停的访问数据库,所以我们使用redis存储购物车记录,
- 4,分析存储购物车记录的格式
- 一个用户的记录使用一条记录保存,
- 我应该保存什么内容,添加数量,skuid,用户id,我不需要把商品的价格名称都记下来,
- 我们使用什么格式保存?
- 上一次保存浏览记录使用的list,
- 分析:
- 使用列表:
- cart_用户id[“1,5”“2,3”]这是商品1,加了5件,商品2加了3件,可以做到,但是用户再次加了商品2两个,还需要操作这条数据,
- 使用hash,
- cart_用户id:{sku_id1:商品数目,sku_id2:商品数目},所以使用hash比较方便,
- 例子:
- cart_1:{1 : 2, 2 : 3 }
- HLEN这个命令,把购物车商品的条数,就知道了购物车的数量了,
获取购物车的数目:
- 判断登陆,
- 然后连接redis,开始取值,
- 模式取数据,在redis插入数据,然后看是否取值正确了,
python-django框架-电商项目-首页开发_20191122的更多相关文章
- Python Django(WEB电商项目构建)
(坚持每一天,就是成功) Python Django Web框架,Django是一个开放源代码的Web应用框架,由Python写成.采用了MTV的框架模式,即模型M,模板T和视图V组成. 安装Pyth ...
- python-django框架-电商项目-订单模块开发_20191125
python-django框架-电商项目-订单模块开发 提交订单页面: 在购物车中点击提交订单,就应该到达提交订单页面了, 显示: 1,收获地址, 2,支付方式 3,用户购买的商品信息,数量,小计, ...
- python-django框架-电商项目-购物车模块开发_20191125
python-django框架-电商项目-购物车模块开发 商品详情页js代码: 在商品详情页,有加入购物车按钮, 点击加减号可以增加减少,手动输入也可以, 点击加入购物车,就要加过去, 先实现加减的操 ...
- python-django框架-电商项目-项目部署_20191127
python-django框架-电商项目-项目部署: uwsgi作为web服务器: 在pycharm中启动项目:使用python manage.py runserver 这个runserver是dja ...
- 电商项目app开发
购物app的开发 首先我们本次要写的是一个电商的项目,项目主要功能有登录.注册.商品展示.轮播图.加入购物车.购物车管理.支付管理.地址管理.个人信息的修改.商品的分类展示.微信支付等等.主要使用vu ...
- python-django框架-电商项目-用户模块开发_20191117
实现注册的基本逻辑: 1,注册页面 注意:注册页面需要静态文件的支持,另外注册页面是基础基类的, 1,url,路由系统, 2,views,视图系统,还是使用类视图,里面有很多的函数, 2,views. ...
- python-django框架-电商项目-商品模块开发_20191124
用户浏览记录的添加 什么时候添加历史浏览记录? 在商品详情的视图里面添加浏览记录, 之前使用的list来存储浏览记录, 注意:如果good_id之前已经浏览过了,那就要移除,conn.lrem(his ...
- web前端Vue+Django rest framework 框架 生鲜电商项目实战✍✍✍
web前端Vue+Django rest framework 框架 生鲜电商项目实战 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频 ...
- web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 ☝☝☝
web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 学习 ...
随机推荐
- MySQL的优化与执行
MySQL会解析查询,并创建内部数据结构(解析树),然后对其进行各种优化,包括重写查询.决定表的读取顺序,以及选择合适的索引等.用户可以通过特殊的关键字提示(hint)优化器,影响它的决策过程.也可以 ...
- kaggle——TMDB 电影票房收入预测
介绍 看电影是目前人们休闲娱乐,消遣时光的选择之一.我们都知道,有些电影的票房很高,有的电影票房却很低,那么决定票房的因素是什么呢?本次将介绍,如何根据电影上映前的一些信息来预测出该电影的票房. 知识 ...
- iris数据集预测
iris数据集预测(对比随机森林和逻辑回归算法) 随机森林 library(randomForest) #挑选响应变量 index <- subset(iris,Species != " ...
- css伪元素::before与::after使用基础示例
1.指定文本前后添加内容 <div class="box">test</div> .box::before{ content: 'before'; marg ...
- Windows环境下spyder调用Arcpy
用python写代码还是喜欢spyder,所以在网上找了通过spyder调用arcpy的方法. 这篇帖子总结的方法非常详细,且通过本人实践,切实可行https://blog.csdn.net/qq_2 ...
- vue验证时间范围
验证时间范围 type="daterange" <DatePicker class="formItem" :size="size" v ...
- Python说文解字_详解元类
1.深入理解一切接对象: 1.1 什么是类和对象? 首先明白元类之前要明白什么叫做类.类是面向对象object oriented programming的重要概念.在面向对象中类和对象是最基本的两个概 ...
- java中abstract怎么使用
abstract(抽象)修饰符,可以修饰类和方法 1,abstract修饰类,会使这个类成为一个抽象类,这个类将不能生成对象实例,但可以做为对象变量声明的类型,也就是编译时类型,抽象类就像当于一类的半 ...
- 《Docekr入门学习篇》——Docker网络及数据卷
Docker网络设置 默认情况下docker会创建一个桥接网卡[docker 0],docker有两种映射方式,一种是随机映射,一种是指定映射. 提示:生产场景一般不使用随机映射,但是随机映射的好处是 ...
- 1 PHP 5.3中的新特性
1 PHP 5.3中的新特性 1.1 支持命名空间 (Namespace) 毫无疑问,命名空间是PHP5.3所带来的最重要的新特性. 在PHP5.3中,则只需要指定不同的命名空间即可,命名空间的分隔符 ...