luffy项目相关

本文详细介绍了如何在Django项目中配置和使用Redis缓存、解决跨域问题、利用DRF内置功能进行过滤、排序和分页操作,以及实现认证、权限管理和请求频率限制。通过实例代码展示了如何自定义过滤器、分页类和频率限制类,并提供了全局和局部配置的示例。
摘要由CSDN通过智能技术生成

一、使用redis缓存

pip install django-redis
# 在settings中配置
# redis缓存配置,以后所有的缓存都在redis中
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/0",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 100},
            "DECODE_RESPONSES": True,
            "PASSWORD": "",
        }
    }
}

二、跨域问题解决

pip install django-cors-headers
# 在settings中配置
注册:'corsheaders'
中间件: 'django.contrib.sessions.middleware.SessionMiddleware',
    	'corsheaders.middleware.CorsMiddleware',
   	 	'django.middleware.common.CommonMiddleware',
        
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_METHODS = (  # 允许所有请求方式
    'DELETE',
    'GET',
    'OPTIONS',
    'PATCH',
    'POST',
    'PUT',
    'VIEW',
)

CORS_ALLOW_HEADERS = (
    'XMLHttpRequest',
    'X_FILENAME',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',
    'Pragma',
)

三、drf内置配置相关

1、drf过滤使用

# 在app下新建一个.py文件,来写自定义过滤字段
# 自定义搜索类
# 方式一
from rest_framework.filters import BaseFilterBackend
class SearchByName(BaseFilterBackend):
    def filter_queryset(self,request,queryset,view):
        # name = request.query_params.get('name')
        name = request.GET.get('name')
        queryset = queryset.filter(name_startswith = name)
        return queryset    # 过滤以啥开头的
class SearchByPrice(BaseFilterBackend):
    def filter_queryset(self,request,queryset,view):
        price_gt = request.GET.get('price_gt')
        price_lt = request.GET.get('price_lt')
        queryset = queryset.filter(price__gt = price_gt)
        return queryset
# 方式二:可以自定义没有的过滤字段
from django_filters.filterset import FilterSet
from django_filters import filters
from .models import Course
class CourseFilter(FilterSet):
    # 区间过滤:field_name关联的Model字段,lookup_expr设置规则:gt是大于,gte是大于等于
    max_price = filters.NumberFilter(field_name = 'price',lookup_expr='lte')
    min_price = filters.NumberFilter(field_name = 'price',lookup_expr='gte')
    class Meta:
        model = Course
        fields = ['course_category','max_price','min_price']
# 应用中注册
INSTALLED_APPS = [
    'django_filters',  # 需要注册应用,
]
# 在视图中使用
pip install django-filter
from django_filters.rest_framework import DjangoFilterBackend
class 视图:
	filter_backends = [DjangoFilterBackend]  # 局部配置
    # filter_fields = ['age','sex']  # 过滤的字段
    filter_class = CourseFilter  # 区间过滤,配置filter_class前必须配置filter_backends = [DjangoFilterBackend]
# 全局配置,优先级局部>全局
REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}

2、drf排序使用

# 视图中使用
from rest_framework.filters import OrderingFilter
filter_backends = [OrderingFilter,DjangoFilterBackend]
ordering_fields = ['id','price']   # 排序的字段

3、drf分页使用

# 在app下新建一个pagination.py,自定义分页功能
# pagination.py
from rest_framework.pagination import PageNumberPagination
class BasicPagination(PageNumberPagination):
    # 默认一页显示的条数
    page_size = 2
    # url中携带页码的key
    page_query_param = 'page'
    # url中用户携带自定义一页条数的key
    page_size_query_param = 'page_size'
    # 用户最大可自定义一页的条数
    max_page_size = 10
# 在视图中使用,局部使用
pagination_class = BasicPagination  
# 关闭分页功能
pagination_class = None

# 全局使用,在配置文件中配置
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS':  'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 100  # 每页数目
}

# 前端访问网址形式
GET  http://127.0.0.1:8000/students/?page=4

4、drf认证、权限

from rest_framework_jwt.authentication import JSONWebTokenAuthentication
from rest_framework.permissions import IsAuthenticated
# 在视图中使用
# 认证类需要搭配一个权限类,保证必须登陆才能用
authentication_classes = [JSONWebTokenAuthentication, ]
permission_classes = [IsAuthenticated, ]

5、drf频率

# 在配置文件中设置
# 配置限制访问频率
REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_RATES': {
        'sms': '1/m'  # key跟scope对应,value是一个时间。1/m指一分钟限制1次
    }
}
# 在app下新建throttlings.py,自定义频率类
from rest_framework.throttling import SimpleRateThrottle
class SMSThrotting(SimpleRateThrottle):
     scope = 'sms'
     def get_cache_key(self, request, view):
         mobile = request.query_params.get('mobile')
         # cache_format = 'throttle_%(scope)s_%(ident)s'
         return self.cache_format%{'scope':self.scope,'ident':mobile}
# 在视图中使用
throttle_classes = [throttlings.SMSThrotting,]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值