contenttype组件、Django缓存机制以及跨域请求

时间:2024-08-23 16:37:02

1 昨日回顾
版本控制 ***
(1)url=127.0.0.1/course/?version=v100000
1 versioning_class=QueryParameterVersioning
'VERSION_PARAM':'version',
'DEFAULT_VERSION':'v2',
'ALLOWED_VERSIONS':['v1','v2']

2 配置成全局:在setting里:QueryParameterVersioning

(2)重要(以后建议用这种):127.0.0.1/v1/course/
1 路由改写:(?P<version>[v1|v2|v3]+)/version/
2 versioning_class=URLPathVersioning
'VERSION_PARAM':'version',
'DEFAULT_VERSION':'v2',
'ALLOWED_VERSIONS':['v1','v2']

2 配置成全局:再setting里:URLPathVersioning
(其他)1 v1.baidu.com/course/
2 放在头里
3 名称空间的

分页 ***
1 简单分页
PageNumberPagination
1 再试图类里 生成一个PageNumberPagination对象
2 对象.属性=xxx:修改属性
3 ret=models.Book.objects.all()
data_list=对象.paginate_queryset(ret,request,self)
4 序列化 instance,反序列化:data
5 my_page.get_paginated_response(ser.data)

2 偏移分页
就第二部不一样

3 加密分页
就第二部不一样:ordering

响应(渲染)器 *
局部:JSONRenderer,BrowsableAPIRenderer
全局:配置在settings里的rest_framework

2 路飞学城项目分析
-主站
课程系列:
-所有课程(专题课,学位课)
-课程详情
-视频播放
-课程章节
-课程评论
-课程价格策略
-加入购物车
-支付中心
-去支付(调支付宝支付)
首页
轻课
个人中心:
登陆
注册
个人中心

-管理员后台

-导师后台

3 ContentType组件
解决什么问题:表的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 拿到的就是课程对象

models层

 from django.db import models

 from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation class Course(models.Model):
title = models.CharField(max_length=32)
# 不会在数据库中生成字段,只用于数据库操作
# policy = GenericRelation('PricePolicy',object_id_field='object_id',content_type_field='contentType') class DegreeCourse(models.Model):
title = models.CharField(max_length=32) class PricePolicy(models.Model):
# 跟ContentType表做外键关联
contentType = models.ForeignKey(to=ContentType)
# 正数
object_id = models.PositiveIntegerField() # 引入一个字段,不会在数据库中创建,只用来做数据库操作
# content_obj = GenericForeignKey('contentType', 'object_id') period = models.CharField(max_length=32)
price = models.FloatField()

views层

 from app01 import models
def test(request):
import json
# 方式一插入价格规则
# ret=models.ContentType.objects.filter(model='course').first()
# course=models.Course.objects.filter(pk=1).first()
# print(ret.id)
# models.PricePolicy.objects.create(period='30',price=100,object_id=course.id,contentType_id=ret.id) # 方式二插入价格规则
# course=models.Course.objects.filter(pk=1).first()
# # content_obj=course 会自动的把课程id放到object_id上,并且去ContentType表中查询课程表的id,放到contentType上
# models.PricePolicy.objects.create(period='60',price=800,content_obj=course)
# 增加学位课,价格规则
# degreecourse = models.DegreeCourse.objects.filter(pk=1).first()
# models.PricePolicy.objects.create(period='60', price=800, content_obj=degreecourse) # 查询所有价格策略,并且显示对应的课程名称
# ret=models.PricePolicy.objects.all()
# for i in ret:
# print(i.price)
# print(i.period)
# # content_obj 就是代指关联的课程,或者学位课程的那个对象
# print(type(i.content_obj))
# print(i.content_obj.title) # 通过课程id,获取课程信息和价格策略
course=models.Course.objects.filter(pk=1).first()
print(course.policy.all()) return render(request,'test.html')

4 Django缓存机制
三个粒度:有粗粒度和细粒度,这里不做研究

缓存是放在最外层的中间件里,第一次请求经过多个中间件过滤,请求到数据,返回的时候数据缓存到最外层,再次请求可以直接在最外层拿到(缓存有时间限制)

1 全站缓存 在中间件做缓存 全局缓存是所有的类和函数都要遵守规定的。

用中间件: 注意:这里第一个中间件是处理请求过来的信息request,最后一个中间件是处理response。
MIDDLEWARE = [
# 'django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.security.SecurityMiddleware',
。。。。。。
# 'django.middleware.cache.FetchFromCacheMiddleware'

]
# CACHE_MIDDLEWARE_SECONDS=10  在settings里设置缓存失效时间。在设置的时间内缓存是一直存在的。
2 单视图:
用装饰器
from django.views.decorators.cache import cache_page
# @cache_page(24*60*60)  导入cache_page 传入缓存时间,只有加了装饰器的才会有缓存。有缓存的在一段时间数据是不会变化的,没缓存的数据实时变化。
3 局部页面:  这个一般是前端处理,在前端页面导入cache模块,{%cache 5 'test'%} 这里的cache是一个函数,需要传参。
{% load cache %}
{% cache 5 'test' %} 两个参数:5是时间,test是唯一标识 
{{ ctime }}
{% endcache %}

5 跨域请求
1 浏览器的同源策略

同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现

请求的url地址,必须与浏览器上的url地址处于同域上,也就是域名,端口,协议相同.

请求的信息来到服务器,服务器做出响应,只是响应来到浏览器被浏览器拒绝。

2 简单请求:发一次请求
response['Access-Control-Allow-Origin'] = '*'   * 代表所有的访问ip+port来源
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'
建议写在中间件里
注释:里面尽量不要写(*),都支持(*)  这里尽量不要写* 虽然都支持,默认规定。

跨域请求写在中间件里:定义后记得加在中间件里。需要写中间件要注意一点:不会写的时候可以仿照中间件源码。

 from django.utils.deprecation import MiddlewareMixin

 class MyMiddle(MiddlewareMixin):
def process_response(self, request, response):
if request.method=='OPTIONS':
response['Access-Control-Allow-Methods']='*'
response['Access-Control-Allow-Headers']='*' response['Access-Control-Allow-Origin'] = '*'
return response

作业:https://www.cnblogs.com/liuqingzheng/articles/9794285.html