美文网首页
2.电商总结商品模块

2.电商总结商品模块

作者: 小爆虾丶 | 来源:发表于2017-12-15 19:45 被阅读0次

    1. FastDFS

    • 海量存储, 存储容量扩展方便
    • 防止文件内容重复
    • 结合nginx提高网站访问图片的效率


      WX20171215-113919.png

    2. Django对接fdfs

    • 自定义文件存储类
    from fdfs_client.client import Fdfs_client
    from django.core.files.storage import Storage
    from django.conf import settings
    
    
    class FDFSStorage(Storage):
        # fast dfs 文件储存类
        def __init__(self, client_conf=None, base_url=None):
            if client_conf is None:
                client_conf = settings.FDFS_CLIENT_CONF
            self.client_conf = client_conf
            if base_url is None:
                base_url = settings.FDFS_URL
            self.base_url = base_url
    
        def _open(self, name, mode='rb'):
            pass
    
        def _save(self, name, content):
            # name:你选择上传文件的名字
            # content:包含你上传文件内容的File对象
            # 创建一个Fdfs_client对象
    
            client = Fdfs_client(self.client_conf)
            res = client.upload_by_buffer(content.read())
    
            # dict
            # {
            #     'Group name': group_name,
            #     'Remote file_id': remote_file_id,
            #     'Status': 'Upload successed.',
            #     'Local file name': '',
            #     'Uploaded size': upload_size,
            #     'Storage IP': storage_ip
            # }
            if res['Status'] != 'Upload successed.':
                raise Exception('上传文件到fast dfs失败')
            filename = res['Remote file_id']
            return filename
    
        def exists(self, name):
            """Django判断文件名是否可用"""
            return False
    
        def url(self, name):
            """返回访问文件的url路径"""
            return self.base_url+name
    
    • 配置文件fdfs
    # 设置Django的文件存储类
    DEFAULT_FILE_STORAGE = 'utils.fdfs.storage.FDFSStorage'
    
    # 设置fdfs使用的client.conf文件路径
    FDFS_CLIENT_CONF = './utils/fdfs/client.conf'
    
    # 设置fdfs存储服务器上nginx的IP和端口号
    FDFS_URL = 'http://192.168.191.134:8888/'
    
    WX20171215-114634.png

    3. 商品首页

    • 动态给对象增加属性

    4. 使用redis保存购物车信息

    • 用户点击加入购物车时需要添加购物车记录
    • 用户访问购物车页面时获取用户的购物车记录
    • 每个用户的购物车记录用一条数据保存
      hash:cart_用户id: {'sku_id1': 数量, 'sku_id2': 数量}
    • 统计hash中元素的数量: hlen

    5. 页面静态化

    • 把原本动态的页面处理结果保存成html文件, 让用户直接访问生成出来的静态html页面


      WX20171215-193136.png
    • 什么时候需要重新生成静态页面?
      管理员在后台修改了首页上数据表里的信息的时候,需要重新生成静态页面。
      celery
      当修改了数据库数据时会调用管理类里的save_model或者delete_model

    from django.contrib import admin
    from goods.models import GoodsType, GoodsSKU, IndexGoodsBanner, IndexTypeGoodsBanner, IndexPromotionBanner
    from django.core.cache import cache
    # Register your models here.
    class BaseModelAdmin(admin.ModelAdmin):
        def delete_model(self, request, obj):
            super().delete_model(request, obj)
            # 发出任务
            from celery_tasks.tasks import generate_static_index_html
            generate_static_index_html.delay()
            # 删除缓存
            cache.delete('index_page_data')
    
        def save_model(self, request, obj, form, change):
            super().save_model(request, obj, form, change)
            # 发出任务
            from celery_tasks.tasks import generate_static_index_html
            generate_static_index_html.delay()
            # 删除缓存
            cache.delete('index_page_data')
    
    
    class IndexGoodsBannerAdmin(BaseModelAdmin):
        pass
    
    admin.site.register(IndexGoodsBanner, IndexGoodsBannerAdmin)
    
    

    6. 数据缓存

    • 把页面用到的数据缓存起来,如果使用这些数据的时候,先从缓存中获取,
      如果获取不到,再去查询数据库。

    • 什么时候缓存数据需要更新?
      管理员在后台修改了首页上数据表里的信息的时候,需要更新缓存数据。也是在管理器类
      首页数据缓存

    class IndexView(View):
        def get(self, request):
            context = cache.get('index_page_data')
    
            if context is None:
                # 商品种类
                types = GoodsType.objects.all()
    
                # 获取首页轮播商品信息
                goods_banners = IndexGoodsBanner.objects.all().order_by('index')
    
                # 首页促销活动信息
    
                promotion_banners = IndexPromotionBanner.objects.all().order_by('index')
    
                for type in types:
                    type.image_banner = IndexTypeGoodsBanner.objects.filter(type=type, display_type=1).order_by('index')
                    type.title_banner = IndexTypeGoodsBanner.objects.filter(type=type, display_type=0).order_by('index')
    
                context = {
                    'types': types,
                    'goods_banners': goods_banners,
                    'promotion_banners': promotion_banners
                }
                cache.set('index_page_data', context, 3600)
            user = request.user
            cart_count = 0
            if user.is_authenticated():
                conn = get_redis_connection('default')
                cart_key = 'cart_%d' % user.id
                cart_count = conn.hlen(cart_key)
    
            context['cart_count'] = cart_count
    
            return render(request, 'index.html', context)
    

    网站本身性能的优化,减少数据库的查询的次数。防止恶意的攻击。DDOS攻击

    相关文章

      网友评论

          本文标题:2.电商总结商品模块

          本文链接:https://www.haomeiwen.com/subject/bubrwxtx.html