-簡單分頁: -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)),
一、eg,參考鏈接https://i.cnblogs.com/EditPosts.aspx?opt=1html
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)
-單個視圖緩存 from django.views.decorators.cache import cache_page @cache_page(5) def test_time(request): ctime=time.time() return HttpResponse(ctime) -全局緩存 在中間件中加入: MIDDLEWARE = [ # 相應的時候,放入緩存 'django.middleware.cache.UpdateCacheMiddleware', 。。。 # 從緩存中取出頁面 'django.middleware.cache.FetchFromCacheMiddleware' ] CACHE_MIDDLEWARE_SECONDS=10 -模板層的緩存 {%load cache %} {% cache 5 '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": 100} # "PASSWORD": "123", } } }
import time from django.views.decorators.cache import cache_page @cache_page(50) def test_time(request): ctime=time.time() # return HttpResponse(ctime) return render(request,'test.html',locals())
一、本質上是瀏覽器的安全策略,不一樣的域,請求能夠成功,可是被瀏覽器攔截了python
-本質上是瀏覽器的安全策略,不一樣的域,請求能夠成功,可是被瀏覽器攔截了 -能夠在服務器端處理 -簡單請求和非簡單請求 -簡單請求:發一次請求 請求方法是如下三種方法之一: 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
二、eg,新建一個mymiddle.pyredis
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
https://www.cnblogs.com/di2wu/p/10159594.html數據庫
一、ContentType是django提供的關係查找表的組件,創建一個表存儲django項目中全部的表model,django
1 contentType組件: 路飛學成項目,有課程,學位課(不一樣的課程字段不同),價格策略 問題,1 如何設計表結構,來表示這種規則 2 爲專題課,添加三個價格策略 3 查詢全部價格策略,而且顯示對應的課程名稱 4 經過課程id,獲取課程信息和價格策略
二、經過ContentType查找到Course、DrgeeCourse的model ID,而後方便創建關係,最終須要的是價格策略表api
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=32) 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')
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=1).first() table=models.ContentType.objects.filter(model='course').first() ret=models.PricePolicy.objects.create(price=9,period='一個月',course_id=course.pk,table_id=table) ret=models.PricePolicy.objects.create(price=19,period='三個月',course_id=course.pk,table_id=table) ret=models.PricePolicy.objects.create(price=49,period='五個月',course_id=course.pk,table_id=table) 第二種方式 degreecourse=models.DrgeeCourse.objects.filter(pk=1).first() #爲django全站開發學位課,添加一個價格策略 ret=models.PricePolicy.objects.create(price=9,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)
三、反向查詢,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=1) # 第一種方案 # 取出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')