11.9luffycity(4)

2018-11-9 17:57:09

明天开始自己独立写luffy部分表的接口,

越努力,越幸运!永远不要高估自己!

明天后天先不想下看视频,把接口做完,然后整理一下笔记,温故而习之,可以为师啊!

知识点1:

  通过所给字符串,找到相应的类,并调用已知类里面的方法

  Django的中间件,rest——framework也都是用的该方法

贴上笔记

s9day108 

内容回顾:
    1. Http协议?
        Http协议就是一个传输数据格式。
        
        我原来学习django框架,从socket服务端开始学起。
        自己创造了一个socket服务器来充当:网站。
        浏览器当socket客户端。
        更清楚的明白到底http协议是什么?
            - 请求头 请求头
            - 响应头 响应头
        
        一次请求响应后,断开连接。
    2. 常见请求头 
        
    3. 常见的请求体?
        Form表单提交:
            POST /index http1.1\r\nhost:www.luffycity.com...\r\n\r\nusername=alex&password=123&...
        Ajax请求:
            POST /index http1.1\r\nhost:www.luffycity.com...\r\n\r\nusername=alex&password=123&...
            POST /index http1.1\r\nhost:www.luffycity.com...\r\n\r\n{“username”:"alex","password":123}
            
        补充:django中获取请求体
            - request.POST 
            - request.body 
            
    4. django请求生命周期
        - wsgi, 他就是socket服务端,用于接收用户请求并将请求进行初次封装,然后将请求交给web框架(Flask、Django)
        - 中间件,帮助我们对请求进行校验或在请求对象中添加其他相关数据,例如:csrf、request.session 
        - 路由匹配 
        - 视图函数,在视图函数中进行业务逻辑的处理,可能涉及到:orm、templates => 渲染
        - 中间件,对响应的数据进行处理。
        - wsgi,将响应的内容发送给浏览器。
        
    5. 中间件
        - 5个方法 
        - 应用场景:
            - 登录认证,不再需要在每个函数中添加装饰器
            - 权限,当用户登录时候获取当前用户所有权限并放入session,然后再次访问其他页面,获取当前url并在session中进行匹配。如果没有匹配成功,则在中间件返回“无权访问”
            - 跨域,
                    - jsonp,动态创建一个script标签。
                    - cors,设置响应头
                    应用:本地开始前后端分离的时使用。
        
    6. ORM操作
        - only
        - defer
        - seleted_related
        - prefetch_related
    
        示例:
            class Depart(models.Model): 5个部门
                title = models.CharField(...)

            class User(models.Model):   10个用户
                name = models.CharField(...)
                email = models.CharField(...)
                dp = models.FK(Depart)

            1.以前的你:11次单表查询

                result = User.objects.all()
                for item in result:
                    print(item.name,item.dp.title)

            2. seleted_related,主动做连表查询(1次链表)

                result = User.objects.all().seleted_related('dp')
                for item in result:
                    print(item.name,item.dp.title)

                问题:如果链表多,性能越来越差。

            3. prefetch_related:2次单表查询
                # select * from user ;
                # 通过python代码获取:dp_id = [1,2]
                # select * from depart where id in dp_id
                result = User.objects.all().prefetch_related('dp')
                for item in result:
                    print(item.name,item.dp.title)

        
        赠送:
            数据量比较大,不会使用FK,允许出现数据冗余。
        
    7. django rest framework的作用?
        快速搭建基于restful规范的接口。
    
    8. 你理解的 restful 规范?
        restful是一个规范,规定API如何编写,通过他可以让我们api更加简洁可维护。
        如,最直观的:
            method:
                - get
                - post 
                - put 
                - delete 
            
            原来都是url中设置的。
        除此之外:
            - api
            - 版本
            - 名词
            - 条件
            - 状态码
            - 返回值
            - 错误信息
            - hypermedia link 
    
    9. django rest framework组件:
        # 就说自己前段时间看过源码  restframework部分多看源码
        - 访问频率控制原理:
            匿名:
                1.1.1.1:[时间,时间,时间,时间,]
            登录:
                user:[时间,时间,时间,时间,] 
            
            默认将访问记录放在缓存中:redis/memcached
        - 序列化
            from rest_framework.serializers import Serializer

            class XX(Serializer):
                pass
            ser =XX(queryset,many=True) # ListSerializer对象         源码中使用啦new方法 真正的构造方法  init也算是构造方法
            ser =XX(obj, many=False)    # XX对象
                
        - 列表生成式 
        
        - 根据字符串的形式,自动导入模块并使用反射找到模块中的类【参考:s9day108】。
    
    

今日内容:
    1. 深科技表结构
    2. git
    
    
内容详细:
    1. 深科技表结构(6表)
        

        # ######################## 深科技相关 ########################
        class ArticleSource(models.Model):
            """文章来源"""
            name = models.CharField(max_length=64, unique=True)

            class Meta:
                verbose_name_plural = "16. 文章来源"

            def __str__(self):
                return self.name

        class Article(models.Model):
            """文章资讯"""
            title = models.CharField(max_length=255, unique=True, db_index=True, verbose_name="标题")
            source = models.ForeignKey("ArticleSource", verbose_name="来源")
            article_type_choices = ((0, '资讯'), (1, '视频'))
            article_type = models.SmallIntegerField(choices=article_type_choices, default=0)
            brief = models.TextField(max_length=512, verbose_name="摘要")
            head_img = models.CharField(max_length=255)
            content = models.TextField(verbose_name="文章正文")
            pub_date = models.DateTimeField(verbose_name="上架日期")
            offline_date = models.DateTimeField(verbose_name="下架日期")
            status_choices = ((0, '在线'), (1, '下线'))
            status = models.SmallIntegerField(choices=status_choices, default=0, verbose_name="状态")
            order = models.SmallIntegerField(default=0, verbose_name="权重", help_text="文章想置顶,可以把数字调大,不要超过1000")
            vid = models.CharField(max_length=128, verbose_name="视频VID", help_text="文章类型是视频, 则需要添加视频VID", blank=True, null=True)
            comment_num = models.SmallIntegerField(default=0, verbose_name="评论数")
            agree_num = models.SmallIntegerField(default=0, verbose_name="点赞数")
            view_num = models.SmallIntegerField(default=0, verbose_name="观看数")
            collect_num = models.SmallIntegerField(default=0, verbose_name="收藏数")

            # tags = models.ManyToManyField("Tags", blank=True, verbose_name="标签")
            date = models.DateTimeField(auto_now_add=True, verbose_name="创建日期")

            position_choices = ((0, '信息流'), (1, 'banner大图'), (2, 'banner小图'))
            position = models.SmallIntegerField(choices=position_choices, default=0, verbose_name="位置")


            #comment = GenericRelation("Comment")

            class Meta:
                verbose_name_plural = "17. 文章"

            def __str__(self):
                return "%s-%s" % (self.source, self.title)

        class Collection(models.Model):
            """收藏"""
            content_type = models.ForeignKey(ContentType)
            object_id = models.PositiveIntegerField()
            content_object = GenericForeignKey('content_type', 'object_id')

            account = models.ForeignKey("Account")
            date = models.DateTimeField(auto_now_add=True)

            class Meta:
                unique_together = ('content_type', 'object_id', 'account')
                verbose_name_plural = "18. 通用收藏表"

        class Comment(models.Model):
            """通用的评论表"""
            content_type = models.ForeignKey(ContentType, blank=True, null=True, verbose_name="类型")
            object_id = models.PositiveIntegerField(blank=True, null=True)
            content_object = GenericForeignKey('content_type', 'object_id')

            p_node = models.ForeignKey("self", blank=True, null=True, verbose_name="父级评论")
            content = models.TextField(max_length=1024)
            account = models.ForeignKey("Account", verbose_name="会员名")
            disagree_number = models.IntegerField(default=0, verbose_name="")
            agree_number = models.IntegerField(default=0, verbose_name="赞同数")
            date = models.DateTimeField(auto_now_add=True)

            def __str__(self):
                return self.content

            class Meta:
                verbose_name_plural = "19. 通用评论表"

        class Account(models.Model):
            username = models.CharField("用户名", max_length=64, unique=True)
            password = models.CharField("密码", max_length=64)

        class UserAuthToken(models.Model):
            """
            用户Token表
            """
            user = models.OneToOneField(to="Account")
            token = models.CharField(max_length=64, unique=True)
    
    
    2. git 
        git是一个用于帮助用户实现版本控制的软件。
        
        命令:
            git init 
            
            git status             查看当前文件夹的状态。
            git add 文件名        对指定文件进行版本控制
            git add .            对指定文件夹下的所有文件及子目录进行版本控制
            git commit -m '详细的描述信息' 创建提交记录(版本)
            
            git log 
            git reflog 
            
            git reset --hard 提交记录(版本号)
    
    
作业:
    课程系列:
        - 课程列表 
        - 课程详细
    深科技相关
        - 文章列表
        - 文章详细
        - 文章评论 
        - 点赞 
        - 收藏 
    
    
  

猜你喜欢

转载自www.cnblogs.com/zhen1996/p/9936687.html