zoukankan      html  css  js  c++  java
  • Django-缓存机制、跨域请求(CORS)、ContentType组件

    Django缓存机制:

     在settings中间件里面设置:

    三个粒度:
    1 全站缓存
    	用中间件:
    	MIDDLEWARE = [
    		# 'django.middleware.cache.UpdateCacheMiddleware',  #起始位置配置:类似response,当请求完成返回时在这里往缓存存数据
    		'django.middleware.security.SecurityMiddleware',
    		......
    		# 'django.middleware.cache.FetchFromCacheMiddleware' #类似request,当请求过来时先经过其他中间件的一些操作(例如认证等),在最后这里从缓存取数据

    ] 
    # CACHE_MIDDLEWARE_SECONDS=10

    2.单视图:
      用装饰器
      from django.views.decorators.cache import cache_page
      # @cache_page(24*60*60)

    3 局部页面设置(实现test有缓存机制,下面的ctime没有缓存机制):
    {% load cache %}
    {% cache 5 'test' %} 两个参数:时间(5秒内),唯一标识
    {{ ctime }} {% endcache %} 

    跨域请求(CORS):

    要实现的效果就是:我在本地上的域名是127.0.0.1:8000,请求另外一个域名:127.0.0.1:8001一段数据

    正常情况,浏览器上就会报错,个就是同源策略的保护,如果浏览器对javascript没有同源策略的保护,那么一些重要的机密网站将会很危险

    简单请求与非简单请求区别:

    只要同时满足以下两大条件,就属于简单请求。凡是不同时满足上面两个条件,就属于非简单请求。

    (1) 请求方法是以下三种方法之一:
    HEAD
    GET
    POST
    (2)HTTP的头信息不超出以下几种字段:
    Accept
    Accept-Language
    Content-Language
    Last-Event-ID
    Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
    

    如何处理: 

    浏览器的同源策略解决方法
    	2 简单请求:发一次请求
    		response['Access-Control-Allow-Origin'] = '*'
    		response['Access-Control-Allow-Origin'] = 'http://127.0.0.1:8008,http://127.0.0.1:8009'
    	2 非简单请求:发两次,一次预检(OPTIONS),第二次是真正的请求
    		if request.method=='OPTIONS':
                response['Access-Control-Allow-Methods']='PUT,DELETE'
                response['Access-Control-Allow-Headers']='Content-Type'
    	建议写再中间件里
    	注释:里面尽量不要写(*),都支持(*)

    ContentType组件:

    表格关系的介绍:价格表与专题课表和学位课表关联,2张表里分别有各自分类的课程,价格统一维护在价格策略表里面

    解决什么问题:表的id和数据id,来唯一确定一条数据

    主要的一些设置信息:

    插入数据:
    			 models:content_obj = GenericForeignKey('table_id', 'course_id')
    			 存:models.PricePolicy.objects.create(period=5, price=18000, content_obj=degree)
    		
    		查询数据:
    			1 通过课程查价格策略:
    			   policy = GenericRelation('PricePolicy', object_id_field='course_id', content_type_field='table_id')
    			   course.policy.all()   拿出所有价格策略
    			2 通过价格策略查课程
    				content_obj = GenericForeignKey('table_id', 'course_id')
    				price.content_obj    拿到的就是课程对象
    

    代码案例如下:

    首先要先导入:

    from django.contrib.contenttypes.models import ContentType
    
    from django.contrib.contenttypes.fields import GenericForeignKey,GenericRelation

    ContentType其实内部就是一个表格

    #由来
    #settings里面的
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app01.apps.App01Config',
    ]
    
    #看源码ContentType的表格,封装的有字段(这些字段就是在生成数据的时候自动建立的表格)
    @python_2_unicode_compatible
    class ContentType(models.Model):
        app_label = models.CharField(max_length=100)
        model = models.CharField(_('python model class name'), max_length=100)
        objects = ContentTypeManager()
    

    即自动Django数据库里自动生成的数据表

    专题课表:Course

    #专题课表
    class Course(models.Model):
        title=models.CharField(max_length=32)
        # 固定到哪个门课,不会再数据库中生成字段,进而可以只用来查询对应的价格,例如使用就是Couser.policy=价格信息对象.price拿到所对应的价格信息
        policy=GenericRelation('PricePolicy',object_id_field='course_id',content_type_field='table_id')

    学位课表DeggreCourse:

    #学位课表
    class DegreeCourse(models.Model):
        title=models.CharField(max_length=32)
        policy=GenericRelation('PricePolicy',object_id_field='course_id',content_type_field='table_id')

    价格策略表:

    #价格策略表
    class PricePolicy(models.Model):
        #课程周期
        period=models.IntegerField()
        #课程价格
        price=models.PositiveIntegerField()
        #具体哪一门课程id
        course_id=models.PositiveIntegerField(null=True)
        #对应哪个课程表的id,只不过用forenkey做了外键关联(与导入的ContentType表的id做关联即可以看到id分别对应是那张表# )
        table_id=models.ForeignKey(to=ContentType,null=True)   #7,8吗
    
    
        # 将通过table_id-course_id做关联,得到一条数据对象,会自动将课程id与表格id进行绑定
        content_obj=GenericForeignKey('table_id','course_id')

    views视图设置:

    from django.shortcuts import render,HttpResponse
    
    # Create your views here.
    
    from app01 import models
    def addPrice(reqest):
    #为Python运维开发专题课,添加三个价格策略
    
    #方式一:普通方式添加(比较复杂每次都要取出课程、取出表)
    
        #第一步:拿到专题课表里面id=1Python运维开发对象、已经对应表格对象(只有这2个条件才能确定一条准确的数据-表的对应关系)
        #拿到课程表对象
        course=models.Course.objects.filter(id=1).first()
        # #拿到专题课表的表格对象:去ContentType这张表里找到course对应的id
        table=models.ContentType.objects.filter(model='course').first() #根据课程找到对应的表对象
        # # table = models.ContentType.objects.filter(model=course.__class__.__name__.lower()).first() #根据专题课程名小写拿到专题课表对象
    
        # #第二步:插入数据
        # # #增加数据(注意点1:table_id只是个字段,存在数据库后会自动再加上一个id,所以就写成table_id_id)
        models.PricePolicy.objects.create(period=1,price=0,course_id=course.id,table_id_id=table.id)
    
        '''数据库中:价格策略表的显示结果
        id period  price course_id   table_id_id
        1      1          0        1            7
        
        '''
    
    #为学位课里面的id=2的智能机器人课程添加一条价格策略
        #为只能机器人学位课,加一个价格策略
        degree=models.DegreeCourse.objects.filter(id=2).first()
        models.PricePolicy.objects.create(period=3,price=10000,content_obj=degree) #因为degree里面也有id,也有表名
        # print(degree.__class__.__name__) #DegreeCourse 内部其实一定做了这个可以拿到表名
        print(degree.policy.all())  #拿到的是整个价格策略表里面每条数据的对象
        for i in degree.policy.all():
            print(i.price)    #遍历出每条数据再.price可以取出对应的字段属性值
    
    
        return HttpResponse('ok')
  • 相关阅读:
    01-helloworld
    F2. Nearest Beautiful Number (hard version) (思维+分类讨论+枚举)
    CF1559 D2. Mocha and Diana (Hard Version)
    牛客小白月赛36——全部施工完毕
    [P4735] 最大异或和——可持久化trie + 思维
    CF1322B Present(思维 + 位运算 + 双指针 + 枚举)
    牛客每日一题SCI2005扫雷
    一些没见过的dp模型
    思维训练——CF1304E 1-Trees and Queries
    思维训练——CF1292B Aroma's Search
  • 原文地址:https://www.cnblogs.com/yangzhizong/p/9846947.html
Copyright © 2011-2022 走看看