01-11第十周周报

本周是第十周,本周学习了django框架前后端分离相关知识点,REST框架,网络API接口,以及性能调试,以下是知识点回顾与整理:

1.11本周总结

  1. 版本控制补充 - 回退

    - git reset --hard versionid / head^

    - git reflog 记录

  2. django日志配置 - settings.py

    日志级别:DEBUG < INFO < WARNING < ERROR < CRITICAL

    ELK - ElasticSearch Logstash Kibana - 日志处理平台

    # settings.py,以下配置为日志debug级别打印至控制台
    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'console': {
                'level': 'DEBUG',
                'class': 'logging.StreamHandler',
            },
        },
        'loggers': {
            'django.db': {
                'handlers': ['console', ],
                'level': 'DEBUG',
            },
        },
    }
    

  3. django-debug-toolbar - django调试工具

    debug-debug-toolbar可查看数据请求的时长、数据库查询语句等

    配置:settings.py与urls.py

    # 首先安装第三方库:pip install django-debug-toolbar
    # settings.py
    INSTALLED_APPS = [
        ...
        'debug_toolbar',
    ]
    MIDDLEWARE = [
        'debug_toolbar.middleware.DebugToolbarMiddleware',
    ]
    DEBUG_TOOLBAR_CONFIG = {
        # 引入jQuery库
        'JQUERY_URL': 'https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js',
        # 工具栏是否折叠
        'SHOW_COLLAPSED': True,
        # 是否显示工具栏
        'SHOW_TOOLBAR_CALLBACK': lambda x: True,
    }
    # urls.py
    from django.conf import settings
    from django.urls import include
    if settings.DEBUG:
        import debug_toolbar
        urlpatterns.insert(0, path('__debug__/', include(debug_toolbar.urls)))
    
  4. 性能优化之一,数据库1+N查询问题,是指只需只需用SQL语句查询一次即可出结果,却重复查询多次

    方法:利用django的连表查询

    ​ - 一对多:select_related()

    ​ - 多对多:prefetch_related()

  5. django项目前后端分离开发

    - 服务器完成核心业务返回json等数据,客服端处理渲染数据与页面

    - 优点:

    • 提升开发效率
    • 增强代码可维护性
    • 支持多终端和服务器结构
  6. API - Application Programming Interface 应用程序编程接口

    网络API - 通过http/https请求请求一个url获得json数据

    API接口应围绕实体设计,而不是围绕业务设计,否则后期更改会增加工作量与复杂度

    实体 -- 数据 -- 数据接口 -- 网络API(基于http/https)

    REST架构 - RESTful API -- 无状态、幂等性

    ​ - 幂等性:一次货多次请求某一个资源对于资源本身具有同样的结果

    ​ REST - REpresentational State Transfer - 表现层状态转移

    ​ rest可以更好的支持水平扩展 - 单机结构 --> 多机结构(分布式集群)

    http -- 无连接无状态协议

    url -- universal resource locator 统一资源定位符,根据rest架构url设计应使用名词

    get -- 查看

    post -- 新增

    put -- 全更新

    patch -- 补丁似的更新

    delete -- 删除

  7. 具体网络API接口项目如下,以房源信息获取为例:

    - 首先对rest框架进行安装配置

    # rest框架的安装 - pip install djangorestframework
    # settings.py 
    INSTALLED_APPS = [
     ...
        'rest_framework',
    ]
    

    - 其次,序列化房源信息

    ​ fields表示需要获取的数据,'__all__'表示获取全部数据,exclude表示排除的数据

    # 序列化器,在app文件夹下创建一个serializers.py存放序列化内容,对需要的数据进行序列化
    # serializers.py
    from rest_framework import serializers
    from common.models import District, Estate, Agent, HouseType, HouseInfo
    
    class HouseInfoSerializer(serializers.ModelSerializer):
        class Meta:
            model = HouseInfo
            fields = '__all__'
            # exclude = ('houseid',)
    

    - CBV视图创建

    # view.py
    from rest_framework.viewsets import ReadOnlyModelViewSet
    from common.models import HouseInfo
    from common.serializers import HouseInfoSerializer
    
    # CBV基于类的视图创建
    class HouseInfoViewSet(ReadOnlyModelViewSet):
        queryset = HouseInfo.objects.all().select_related('type', 'district', 'estate', 'agent').prefetch_related('tags').order_by('-pubdate')
        serializer_class = HouseInfoSerializer
    

    - urls.py配置,在app文件夹内 创建一个新的urls.py配置文件,作为单独的配置

    # urls.py
    from django.urls import path
    from rest_framework.routers import SimpleRouter
    from common.views import HouseInfoViewSet
    
    # 创建一个房源信息的路由
    router = SimpleRouter()
    router.register('houseinfo', HouseInfoViewSet)
    urlpatterns += router.urls
    

    这时房源的全部信息API接口已经完成,进入http://127.0.0.1:8000/api/houseinfo/ 可获取房源的全部信息

  8. 设置全局分页查看房源信息,并且限制查询次数每分钟5次

    # DRF配置文件
    REST_FRAMEWORK = {
        # 按页码分页
        'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
        'PAGE_SIZE': 5,  # 每页最大显示5条数据
        # 限流配置
        'DEFAULT_THROTTLE_CLASSES': (
            'rest_framework.throttling.AnonRateThrottle',
        ),
        'DEFAULT_THROTTLE_RATES': {
            'anon': '5/min',  # 一分钟访问5次
        },
    }
    
  9. 设置redis缓存,对部分长期不变的信息进行缓存,可减轻数据库负担,提高查询速度,从而提高用户体验

    # settings.py
    # rest缓存配置
    REST_FRAMEWORK_EXTENSIONS = {
        'DEFAULT_CACHE_RESPONSE_TIMEOUT': 120,  # 过期时间
        'DEFAULT_USE_CACHE': 'default',
        'DEFAULT_OBJECT_CACHE_KEY_FUNC': 'rest_framework_extensions.utils.default_object_cache_key_func',
        'DEFAULT_LIST_CACHE_KEY_FUNC': 'rest_framework_extensions.utils.default_list_cache_key_func',
    }
    # redis缓存配置
    CACHES = {
        'default': {
            'BACKEND': 'django_redis.cache.RedisCache',
            'LOCATION': [
                'redis://ip address/0',
            ],
            'KEY_PREFIX': 'projcet_name',
            'OPTIONS': {
                'CLIENT_CLASS': 'django_redis.client.DefaultClient',
                'CONNECTION_POOL_KWARGS': {
                    'max_connections': 512,
                },
                'PASSWORD': 'your password',
            }
        },
    }
    

    - 在app文件夹下创建一个utils.py的文件,用于存放app的功能函数等

    # utils.py
    # 对redis存储的缓存前缀进行修改
    import re
    PATTERN = re.compile(r'(\.[0-9a-f]{32})')
    
    
    def make_key(key, key_prefix, version):
        items = PATTERN.findall(key)[1:]
        for item in items:
            key = key.replace(item, '')
        return '%s:%s:%s' % (key_prefix, version, key)
    

    - 在view.py中添加装饰器,对需要缓存的数据添加装饰器

    # view.py
    
    class HouseInfoViewSet(CacheResponseMixin,ModelViewSet):
        ...
    
  10. 添加筛选器,对关键字进行筛选,或者对价格进行排序,筛选价格区间等等

    # utils.py
    # 自定义filterset过滤器筛选功能
    class HouseInfoFilterSet(django_filters.FilterSet):
        """自定义FilterSet过滤"""
        minprice = django_filters.NumberFilter(field_name='price', lookup_expr='gte')
        maxprice = django_filters.NumberFilter(field_name='price', lookup_expr='lte')
        keyword = django_filters.CharFilter(method='filter_by_keyword')
    
        @staticmethod
        def filter_by_keyword(queryset, key, value):
            queryset = queryset.filter(Q(title__contains=value) |
                                       Q(detail__contains=value) | Q(street__contains=value))
            return queryset
    

    - 其次在views.py文件,房源信息视图类中添加如下内容

    # views.py
    from django_filters.rest_framework import DjangoFilterBackend
    from rest_framework.filters import OrderingFilter
    from common.utils import HouseInfoFilterSet
    
    class HouseInfoViewSet(ModelViewSet):
        ...
        filter_backends = (DjangoFilterBackend, OrderingFilter)
        filterset_class = HouseInfoFilterSet
        ordering_fields = ('price', 'area', 'floor')  # 排序内容
    

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,340评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,762评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,329评论 0 329
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,678评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,583评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,995评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,493评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,145评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,293评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,250评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,267评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,973评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,556评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,648评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,873评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,257评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,809评论 2 339

推荐阅读更多精彩内容

  • # Awesome Python [![Awesome](https://cdn.rawgit.com/sindr...
    emily_007阅读 2,187评论 0 3
  • 模板标签除了几个常用的,还真心没有仔细了解一下,看到2.0发布后,翻译学习一下。 本文尽量忠实原著,毕竟大神的东西...
    海明_fd17阅读 1,982评论 0 5
  • 出自:https://blog.csdn.net/yueguangMaNong/article/details/9...
    山野过客阅读 1,255评论 0 2
  • 网站Api开发 网站API也称接口,其实与网站的URL地址是同一个原理。当用户使用GET或者POST方式访问接...
    虐心笔记阅读 3,346评论 0 1
  • 20170926 第十组李文艳 #只有感觉好才会做得好!# 孩子第一个30天目标:在30分钟内吃完饭 妈妈第一个3...
    文子16阅读 173评论 0 0