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')
Django-缓存机制、跨域请求(CORS)、ContentType组件的更多相关文章
- Django框架 之 跨域请求伪造
Django框架 之 跨域请求伪造 浏览目录 同源策略与Jsonp 同源策略 Jsonp jQuery对JSONP的实现 CORS 简介 两种请求 同源策略与Jsonp 同源策略 同源策略(Same ...
- 版本控制,django缓存,跨域问题解决
复习 分页: 1. 简单分页 2. 偏移分页 3. 加密分页 解析器:客户处理前端提交来的数据 urlencode: body体中的数据格式: key=value& formdata编码:为区 ...
- 【Django】实现跨域请求
目录 JsonP实现跨域 在Django中间件中添加响应头 @ *** CORS 即 Cross Origin Resource Sharing 跨域资源共享. 跨域请求分两种:简单请求.复杂请求. ...
- 跨域请求CORS
参考:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS http://www.ruanyifeng.com/b ...
- Nginx配置跨域请求 CORS
当出现403跨域错误的时候 No 'Access-Control-Allow-Origin' header is present on the requested resource,需要给Nginx服 ...
- Django学习---jsonp跨域请求
jsonp跨域请求 我们通过ajax进行跨域请求的时候,请求发送过去,但是在接受返回数据的时候浏览器会进行拦截. 这是由于浏览器存在同源策略机制,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源 ...
- .NET 反向代理 YARP 跨域请求 CORS
使用过 nginx 的小伙伴应该都知道,这个中间件是可以设置跨域的,作为今天的主角,同样的 反向代理中间件的 YARP 毫无意外也支持了跨域请求设置. 有些小伙伴可能会问了,怎样才算是跨域呢? 在 H ...
- Django中的跨域请求问题
本文目录 一 同源策略 二 CORS(跨域资源共享)简介 三 CORS基本流程 四 CORS两种请求详解 五 Django项目中支持CORS 回到目录 一 同源策略 同源策略(Same origin ...
- django缓存和跨域解决和短信验证码的使用
缓存 在实际项目中,存在大量的数据检索,比如我们刷微博的时候,刚开始加载速度慢一点,然后第一次加载完毕之后,如果你此时的手机没有网络,但是你发现你的微博还是可以照样刷,但是刷到一定的页面就走不动了,那 ...
随机推荐
- Nginx+Keepalived双主轮询负载均衡
双主模式使用两个VIP,前段有2台服务器,互为主从,两台服务器同时工作,不存在资源浪费情况.同时在前端的DNS服务器对网站做多条A记录,实现了Nginx的负载均衡,当一台服务器故障时候,资源会转移到另 ...
- WordPress企业建站心得
回头聊聊我用WordPress做企业网站的事.说是企业网站,其实就是一个小的企业展示网站.事情要从我爸开了一家自行车店开始说起,自从他开了自行车店,不但开始学着玩起了微信(因为要做微信营销),又想到了 ...
- UVA 10375 Choose and divide(大数的表示)
紫上给得比较奇怪,其实没有必要用唯一分解定理.我觉得这道题用唯一分解只是为了表示大数. 但是分解得到的幂,累乘的时候如果顺序很奇怪也可能溢出.其实直接边乘边除就好了.因为答案保证不会溢出, 设定一个精 ...
- ZOJ-1654 Place the Robots---二分图最小点覆盖+构图
题目链接: https://vjudge.net/problem/ZOJ-1654 题目大意: 有一个N*M(N,M<=50)的棋盘,棋盘的每一格是三种类型之一:空地.草地.墙.机器人只能放在空 ...
- python_图形界面编程示例
"常用Tkinter组件的使用" #一.弹出消息框 #1 弹出提示消息框 from tkinter.messagebox import * showinfo(title='提示', ...
- python_25_string
name="my name is 齐志光qizhiguang" print(name.capitalize())#首字母变大写 print(name.count('i'))#统计字 ...
- Ubuntu 上配置静态的ip
先关掉或卸掉 network-manager.然后,改动/etc/network/interfaces 如下:(由于是静态ip,你当然知道把例子中那些东西改成你自己的)auto lo eth0ifac ...
- WordPress免费清新响应式博客/杂志/图片三合一主题Nana
WordPress免费清新响应式博客/杂志/图片三合一主题Nana 一.主题安装须知 1.本主题必须安装文章点击统计插件:WP-PostViews,可以直接在后台插件→安装插件中直接搜索安装官方最新版 ...
- Zabbix监控告警Lack of free swap space on Zabbix server解决办法
报错详情如下: 是因为Zabbix监控没有考虑虚拟主机的交换空间情况 解决办法修改配置 修改表达式内容:{Template OS Linux:system.swap.size[,pfree].last ...
- session在C#一般处理程序的调用方式
在C#中有一个一般处理程序,可以快速地进行一些逻辑运算等功能,但在这个页面上,不能直接选择使用session进行页面间的值的传递,如何使得页面可以使用session呢 在页面开头写上 using Sy ...