十、分页器

-简单分页:
-from rest_framework.pagination import PageNumberPagination
-生成一个对象
-调用对象的.page.paginate_queryset(books, request, view=self)
-会有返回结果:把结果序列化,返回
-四个参数:
每页的大小
page_size = api_settings.PAGE_SIZE
查询第几页参数
page_query_param = 'page1'
可以指定每页的大小
page_size_query_param = None
每页最大显示多少
max_page_size = None
-偏移分页
-from rest_framework.pagination import LimitOffsetPagination
-生成一个对象
-调用对象的.page.paginate_queryset(books, request, view=self)
-会有返回结果:把结果序列化,返回
-四个参数:
默认大小
default_limit = api_settings.PAGE_SIZE
查询的条数
limit_query_param = 'limit'
偏移的条数
offset_query_param = 'offset'
最多多少条
max_limit = None
-加密分页:
-from rest_framework.pagination import CursorPagination
-生成一个对象
-调用对象的.page.paginate_queryset(books, request, view=self)
-会有返回结果:把结果序列化,返回
-两个参数:
按什么排序
ordering = '-nid'
page_size = 3

十一、响应器

          1 原始的url
-url(r'^books/', views.Book.as_view()),
2 视图类继承ViewSetMixin(as_view中必须传参数,字典形式)
-url(r'^books/', views.Book.as_view(‘get':'get_all’)),
3 全自动路由(自动生成路由)
from rest_framework import routers
router=routers.DefaultRouter()
# 两个参数,一个是匹配的路由,一个是视图中写的CBV的类
router.register('book',views.Book)
        url(r'', include(router.urls)),

十二、版本控制

1、eg,参考连接https://i.cnblogs.com/EditPosts.aspx?opt=1

from rest_framework.response import Response
from rest_framework.viewsets import ViewSetMixin
from rest_framework.versioning import QueryParameterVersioning,AcceptHeaderVersioning,NamespaceVersioning,URLPathVersioning
class Book(APIView):
versioning_class=URLPathVersioning
def get(self, request,*args,**kwargs):
response = MyResponse()
# print(request.GET.get('version'))
# print(request.query_params.get('version'))
print(request.version)
books = models.Book.objects.all() ret = myserial.BookSer(instance=books, many=True)
response.msg = '查询成功'
response.data = ret.data
return Response(response.get_dic)

十三、django中的缓存

-单个视图缓存
from django.views.decorators.cache import cache_page
@cache_page()
def test_time(request):
ctime=time.time()
return HttpResponse(ctime)
-全局缓存
在中间件中加入: MIDDLEWARE = [
# 相应的时候,放入缓存
'django.middleware.cache.UpdateCacheMiddleware',
。。。
# 从缓存中取出页面
'django.middleware.cache.FetchFromCacheMiddleware'
]
CACHE_MIDDLEWARE_SECONDS=
-模板层的缓存
{%load cache %}
{% cache 'time'%}
应用缓存:{{ ctime }}
{% endcache %}
-缓存位置配置:
-可以缓存到文件中
-可以缓存到内存中(默认就是内存)
-可以缓存到redis中(需要安装django-redis模块)
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"CONNECTION_POOL_KWARGS": {"max_connections": }
# "PASSWORD": "",
}
}
}

eg\

import time
from django.views.decorators.cache import cache_page
@cache_page()
def test_time(request):
ctime=time.time()
# return HttpResponse(ctime)
return render(request,'test.html',locals())

十四、跨域请求

1、本质上是浏览器的安全策略,不同的域,请求可以成功,但是被浏览器拦截了

    -本质上是浏览器的安全策略,不同的域,请求可以成功,但是被浏览器拦截了
-可以在服务器端处理
-简单请求和非简单请求
-简单请求:发一次请求
请求方法是以下三种方法之一:
HEAD
GET
POST
HTTP的头信息只能出以下几种字段:
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
-不符合上面的,是非简单请求,发两次请求,一次OPTIONS预检请求,然后发真实请求
-处理跨域:
-写一个中间件(处理简单请求和非简单请求)
class Mymiddleware(MiddlewareMixin):
def process_response(self,request,response):
if request.method == 'OPTIONS':
response['Access-Control-Allow-Methods'] = 'PUT'
response['Access-Control-Allow-Headers'] = '*'
response['Access-Control-Allow-Origin'] = '*'
return response

2、eg,新建一个mymiddle.py

from django.shortcuts import render,HttpResponse

from django.utils.deprecation import MiddlewareMixin
class Mymiddleware(MiddlewareMixin):
def process_response(self,request,response):
if request.method == 'OPTIONS':
response['Access-Control-Allow-Methods'] = 'PUT'
response['Access-Control-Allow-Headers'] = '*' response['Access-Control-Allow-Origin'] = '*'
return response setting.py:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'app01.mymiddel.Mymiddleware'
]
# from django.middleware.clickjacking import XFrameOptionsMiddleware
# from app01.mymiddel import Mymiddleware

十五、django操作redis

https://www.cnblogs.com/di2wu/p/10159594.html

十六、ContentType组件的使用

1、ContentType是django提供的关系查找表的组件,建立一个表存储django项目中所有的表model,

 contentType组件:
路飞学成项目,有课程,学位课(不同的课程字段不一样),价格策略 问题, 如何设计表结构,来表示这种规则
  为专题课,添加三个价格策略
查询所有价格策略,并且显示对应的课程名称
通过课程id,获取课程信息和价格策略

2、通过ContentType查找到Course、DrgeeCourse的model ID,然后方便建立关系,最终需要的是价格策略表

from django.db import models

from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
Create your models here.
class DrgeeCourse(models.Model):
title=models.CharField(max_length=) class Course(models.Model):
title = models.CharField(max_length=)
# 不会在数据库中生成字段,只用于数据库操作
policy = GenericRelation('PricePolicy',object_id_field='course_id',content_type_field='table_id') class PricePolicy(models.Model):
period=models.CharField(max_length=)
price=models.IntegerField() course_id=models.IntegerField()
# table_id=models.IntegerField()
# to 外部的表,不能用引号引起来
table_id=models.ForeignKey(to=ContentType,on_delete=models.CASCADE)
# 这个字段,不会再数据库生成,只用来插入和查询,插入的时候,
# 只需要传一个对象,他会自动把对象id赋给course_id,对象表模型的id,赋给table_id
content_obj = GenericForeignKey('table_id', 'course_id')

eg.。。。。GenericForeignKey不会在数据库生成,创建时只需要给对象,不需要管它属于的表ID

from django.shortcuts import render,HttpResponse
from django.http import JsonResponse
# Create your views here.
from api import models
from django.contrib.contenttypes.models import ContentType
from rest_framework.views import APIView
def test(request):
为django专题课,添加三个价格策略
第一种方式
course=models.Course.objects.filter(pk=).first() table=models.ContentType.objects.filter(model='course').first() ret=models.PricePolicy.objects.create(price=,period='一个月',course_id=course.pk,table_id=table)
ret=models.PricePolicy.objects.create(price=,period='三个月',course_id=course.pk,table_id=table)
ret=models.PricePolicy.objects.create(price=,period='五个月',course_id=course.pk,table_id=table)
第二种方式
degreecourse=models.DrgeeCourse.objects.filter(pk=).first() #为django全站开发学位课,添加一个价格策略
ret=models.PricePolicy.objects.create(price=,period='一个月',content_obj=degreecourse) 查询所有价格策略,并且显示对应的课程名称
ret=models.PricePolicy.objects.all()
for price in ret:
print(type(price.content_obj))
# price.content_obj拿到的是?课程对象(可能是专题课,可能是学位课)
print(price.content_obj.title)

3、反向查询,policy 其实就是存取PricePolicy表里的course_id

class Course(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.CharField(max_length=32)
price=models.IntegerField() course_id=models.IntegerField()
# table_id=models.IntegerField()
# to 外部的表,不能用引号引起来
table_id=models.ForeignKey(to=ContentType,on_delete=models.CASCADE)
# 这个字段,不会再数据库生成,只用来插入和查询,插入的时候,
# 只需要传一个对象,他会自动把对象id赋给course_id,对象表模型的id,赋给table_id
content_obj = GenericForeignKey('table_id', 'course_id')

 course=models.Course.objects.get(pk=)
# 第一种方案
# 取出course的id
# 取出Couser这个表再contenttype表中对应的id
# 去PricePolicy去查询数据
# 第二种方案,再course表中加入:policy = GenericRelation('PricePolicy',object_id_field='course_id',content_type_field='table_id')
ret=course.policy.all()
for policy in ret:
print(policy.price) return HttpResponse('ok')

djangorestful framework (三)学习的更多相关文章

  1. Qt Installer Framework的学习(三)

    Qt Installer Framework的学习(三) Qt Installer Framework的样例中.通常是这种:config目录一般放了一个config.xml文件,包括的是安装配置xml ...

  2. Robot Framework语法学习(一)

    Robot Framework语法学习: 一.变量的声明.赋值与使用 1.变量标识符:每个变量都可以用  变量标识符 ${变量名} 来表示. 2.变量声明:可以在TestSuite上点右键或者在Edi ...

  3. Robot Framework基础学习(一)

    Robot Framework语法学习: 一.变量的声明.赋值与使用 1.变量标识符:每个变量都可以用  变量标识符 ${变量名} 来表示. 2.变量声明:可以在TestSuite上点右键或者在Edi ...

  4. Spring Framework基础学习

    Spring Framework基础学习 Core support for dependency injection,transaction management,web applications,d ...

  5. Entity Framework 6 学习笔记2 — 增、删、改、显示简单代码示例

    前言 通过 “Entity Framework 6 学习笔记1 — 介绍和安装方法”文章我相信大家对EF的安装应该没什么问题了,整体安装还是比较简单的,只需要通过Nuge搜索EF然后安装就可以了,这也 ...

  6. Qt Installer Framework的学习(二)

    Qt Installer Framework的学习(二) Qt Installer Framework的一些操作能够使用最常见的Qt项目来表示,也就是说,书写pro文件,使用qmake执行之,除了能够 ...

  7. Robot FrameWork基础学习(三)

    一.关键字(Keyword)根据架构的区分可分为以下三层结构: 底层关键字.公共层关键字.特性关键字. 底层关键字一般与最底层的代码在关系,为上层公共关键字和特性关键字提供接口. 公共层关键字:一般是 ...

  8. EF3:Entity Framework三种开发模式实现数据访问

    前言 Entity Framework支持Database First.Model First和Code Only三种开发模式,各模式的开发流程大相径庭,开发体验完全不一样.三种开发模式各有优缺点,对 ...

  9. Django REST framework JWT学习

    1.JWT学习 在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证.我们不再使用Session认证机制,而使用Json Web Token认证机制. Json web toke ...

随机推荐

  1. css3 min-content,max-content,fit-content, fill属性

    css3里有四个属性,用来实现以内容为主的尺寸计算方式,intrinsic sizing min-content max-content fit-content fill 其中 fill 关键字,需要 ...

  2. DAY27.XIA.面向對象

    2018-07-23  08:43:17

  3. Ubuntu下怎么编译并运行C、C++和Pascal语言?

    很多同学在安装了Ubuntu的环境后,发现在Windows下的许多东西都打不开了,但是用网站上的在线IDE又不是很方便. 所以,ljn教你如何在Ubuntu下编译并运行C.C++和Pascal. 一. ...

  4. 枚举,Math和Random

    1.实用类: 01.枚举 enum Student stu=new Student(); 我们为了保证用户一个健康的输入! 我们使用了封装特性! 用户就不能直接访问我们的属性了!! private c ...

  5. Linux学习: LCD驱动

    一.LCD驱动框架: 1.分配一个fb_info结构体:s3c_lcd = framebuffer_alloc(0,NULL); 2.设置fb_info(s3c_lcd): ID.固定参数.可变参数. ...

  6. 6.1 C++ string类型变量的定义以及输入与输出

    参考:http://www.weixueyuan.net/view/6389.html 总结: 在C++中提供了一个型的内建数据类型string,该数据类型可以替代C语言中char数组. 与C风格的c ...

  7. SQL-39 使用索引

    题目描述 针对salaries表emp_no字段创建索引idx_emp_no,查询emp_no为10005, 使用强制索引.CREATE TABLE `salaries` (`emp_no` int( ...

  8. Centos7部署kubernetes-ETCD集群(三)

    1.下载etcd软件包 wget https://github.com/coreos/etcd/releases/download/v3.2.18/etcd-v3.2.18-linux-amd64.t ...

  9. mybatis学习(五)----实现关联表查询

    一.一对一的表查询 查询班级表中班级号为1的对应的记录(包括教师的具体信息) 1.首先建立数据表 数据表class和techear,class表中只有一个外键techear_id,sql脚本如下: C ...

  10. if-else和while循环

    用户登陆验证: if-else 判断 #!/usr/bin/env python # -*-coding:utf-8 -*- import getpass passwd=' name='sunhao' ...