电商web项目中页面静态化

1、问题的引入:
任何一个电商web项目,当用户通过浏览器或者客户端仅仅输入IP访问这个网站时,后端必定会返回给用户该网站的主页,就这个主页而言,用户没有登陆的情况下,每个用户看到的主页都是一模一样的。像这种高并发的访问一个完全一样的页面,我们可以把它静态化,取代了web框架或者web模块做出处理的过程,提高了页面返回的效率。

2、何为页面静态化?
即这个静态页面不需要web框架或者模块去找到对应视图再返回,直接把这个静态页面放在一个服务器上,通过配置这个服务器,如:用户访问/或者/static时,返回本机的xxx静态页面。那么这个服务器用什么呢,肯定一下就能想到提供静态文件非常高效的nginx。

3、那怎样页面静态化呢?
前面用过celery异步队列来发送激活邮件,同样,这里也要用celery来生成静态页面。我们需要在项目中用代码定义一个任务函数,这个函数就是用来生成静态页面,先查询数据库,获取到主页上显示的内容,生成模板上下文。

@app.task
def generate_static_index_html():
"""产生首页静态页面"""
# 获取商品的种类信息
types = GoodsType.objects.all()
# 获取首页轮播商品信息
goods_banners = IndexGoodsBanner.objects.all().order_by('index')
# 获取首页促销活动信息
promotion_banners = IndexPromotionBanner.objects.all().order_by('index')
# 获取首页分类商品展示信息
for type in types:  # GoodsType
    # 获取type种类首页分类商品的图片展示信息
    image_banners = IndexTypeGoodsBanner.objects.filter(type=type, display_type=1).order_by('index')
    # 获取type种类首页分类商品的文字展示信息
    title_banners = IndexTypeGoodsBanner.objects.filter(type=type, display_type=0).order_by('index')

    # 动态给type增加属性,分别保存首页分类商品的图片展示信息和文字展示信息
    type.image_banners = image_banners
    type.title_banners = title_banners

# 组织模板上下文
context = {'types': types,
           'goods_banners': goods_banners,
           'promotion_banners': promotion_banners}

4、拿到原页面对象temp,把模板上下文content传给原页面做渲染生成我们的static_index_html对象,这个对象实际就是个index.html,只不过是一调用任务函数在celery机器上会不断覆盖生成。

# 使用模板
# 1.加载模板文件,返回模板对象temp
temp = loader.get_template('static_index.html')
# 2.定义模板上下文
# context = RequestContext(request, context)
# 3.模板渲染
static_index_html = temp.render(context)

5、最后用一个with open(’…/index.html’,‘w’)不就好了,然后把项目代码拿到celery机器上初始化,再回到项目delay()发出任务,celery用法就不赘述了。

在拷贝到celery机器上的项目中生成对应的静态文件

save_path = os.path.join(settings.BASE_DIR, 'static/index.html')

with open(save_path, 'w') as f:
    f.write(static_index_html)

6、动态生成静态页面:
生成了静态页面在celery所在机器上了,这个页面虽然用户看到是一样的,但主页不可能一成不变吧,因为站点管理员可能需要在后台管理页面改变主页的展示内容,如:促销活动,上架或下架商品。这时就需要我们动态生成这个静态页面,即管理员修改一次,我们就要调用这个任务函数来重新覆盖生成一次。直接重写框架的后台管理的save和delete方法(这两个方法后面加一个发出celery任务的代码),因为我们是‘w’方式打开,会一直覆盖上一个index.html生成。这不就动态生成了。

7、说了nginx服务器提供静态文件效率极高,那么怎样在celery所在机器上搭建一个nginx服务器呢,前面我们已经用过了fastdfs分布式文件存储系统,fastdfs用来上传文件,再在本机上搭一个nginx服务器用来读取fastdfs里面的文件。而这里原理一样,由于我celery异步队列和fastdfs都在我虚拟机(nginx服务器IP一样),所以我只需在nginx配置文件(conf/nginx.conf)里面加一个与fastdfs不一样的监听端口比如80端口,配置/(对于url而言,/就是代表IP + port如172.16.179.131:80)隐射到本机上的(index
.html绝对路径),返回这个静态文件。
在这的里插入图片描述
到这儿就已经完成了用nginx处理主页,拓展:现在又抛出来了一个问题,当一个用户访问一个地址的时候,我到底是要给它返回nginx服务器上的静态文件还是要调用我django网站上对应的视图呢?那么,调度服务器就产生了,这个服务器很显然也是个nginx,而且它得是一个另外的机器(IP),如果用户访问/就找下一个nginx只给静态页面看看而已,如果访问/index,找django框架,完成更多功能
在这里插入图片描述

发布了3 篇原创文章 · 获赞 0 · 访问量 139

猜你喜欢

转载自blog.csdn.net/qq_37623764/article/details/102455837