setting配置

Setting配置信息

注册子应用

# 注意:需要修改Django的全局配置文`settings.py`
'''
1. 创建子应用
1)在pycharm中创建
python manage.py startapp 子应用名
2)在cmd命令中创建
django-admin startapp 子应用名
2. 在INSTALLED_APPS配置中写入
创建好的子应用名(app)
'''
INSTALLED_APPS = [
   "app",
]

注册rest_framework

django-rest-framework
# 注意:需要修改Django的全局配置文`settings.py`
'''
1. 通过pip安装rest_framework
pip install djangorestframework
2. 将rest_framework写入INSTALLED_APPS中
'''
INSTALLED_APPS = [
   "rest_framework",
]

设置cors headers跨域

django-cors-headers
# 注意:需要修改Django的全局配置文`settings.py`
'''
1. 通过pip进行安装
pip install django-cors-headers

2. 在INSTALLED_APPS配置中写入
corsheaders

3. 在MIDDLEWARE(中间件)配置中写入
corsheaders.middleware.CorsMiddleware

4. 在setting.py文件中写入
# 全局允许所有来源的跨域请求
CORS_ORIGIN_ALLOW_ALL = True

# 生产环境中推荐的做法
CORS_ORIGIN_ALLOW_ALL = False
# 使用CORS_ALLOWED_ORIGINS来指定允许访问的特定源
CORS_ALLOWED_ORIGINS = [
      例:"http://example.com",
          "https://another-example.com",
]
'''
INSTALLED_APPS = [
   "corsheaders",
]
MIDDLEWARE = [
   "corsheaders.middleware.CorsMiddleware",
]

分页

DRF全局分页

# 注意:需要修改Django的全局配置文`settings.py`
'''
1. 在settings中写入以下关键代码
'''
REST_FRAMEWORK = {
   'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
   # 表示一页获取10条数据
   'PAGE_SIZE': 10
}

DRF局部分页

# url地址:查询参数?page=页数%size=展示的数量数据
# hero/?page=2&size=2 查询第2页,每页2条的英雄信息

# 导包
from rest_framework.pagination import PageNumberPagination

# 只有某些视图,需要分页, 可以自定义分页类
class Pagination(PageNumberPagination):
   page_size = 1  # 每页数量
   max_page_size = 3  # 每页最大的数量
   page_size_query_param = 'size'  # 每页数量的参数名
   page_query_param = 'page'  # 页码的参数名

class HeroListCreateAPIView(ListAPIView):
   queryset = Hero.objects.all()  # 查询集
   serializer_class = HeroModelSerializer  # 自己定义的序列化器
   
   # 没有指明分页类,会按照全局分页
   pagination_class = Pagination  # 使用自定义的分页类

过滤

全局过滤

# 注意:需要修改Django的全局配置文`settings.py`
# 通过pip安装插件
pip install django-filter
# 注册
INSTALLED_APPS = [
   'django_filters',
]
# 配置过滤引擎 全局配置过滤
REST_FRAMEWORK = {
   'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend']
}

局部过滤

# 注册
INSTALLED_APPS = [
   'django_filters',
]
# 针对单个视图类进行的过滤
# 导包
from django_filters.rest_framework import DjangoFilterBackend

from rest_framework.generics import ListAPIView

class GoodsListAPIView(ListAPIView):
  ...
   filter_backends = (DjangoFilterBackend,)

指定字段过滤

# 注册
INSTALLED_APPS = [
   'django_filters',
]
# 导包
from django_filters.rest_framework import DjangoFilterBackend

from rest_framework.generics import ListAPIView

class GoodsListAPIView(ListAPIView):
   queryset = GoodsModel.objects.all()
   serializer_class = GoodsModelSerializer

   # filter_backends = (DjangoFilterBackend, ) # 如果全局设置过,局部不需要设置
   # 指定该模型类中要过滤的字段
   filterset_fields = ('price', 'name')

模糊过滤

自定义过滤器

# 注册
INSTALLED_APPS = [
    'django_filters',
]
# 导包
from django_filters.rest_framework import DjangoFilterBackend,FilterSet

from rest_framework.generics import ListAPIView
class 

# 写法与序列器基本一致
GoodsFilter(FilterSet):
	'''过滤器'''
    min_price = django_filters.NumberFilter(field_name="price",lookup_expr="gte")
    # field_name 表示要过滤字段;lookup_expr 表示 过滤时要进行的操作,gte 表示 大于等于
    max_price = django_filters.NumberFilter(field_name="price", lookup_expr="lte")  # lte 小于等于

    name = django_filters.CharFilter(field_name="name", lookup_expr="icontains")  # icontains 表示 包含(忽略大小写)

    class Meta:
        model = GoodsModel  # 关联的表
        fields = ["min_price", "max_price", "name"]  # 过滤的字段
        
class GoodsListAPIView(ListAPIView):
    '''视图类'''
    queryset = GoodsModel.objects.all()
    serializer_class = GoodsModelSerializer        
    filterset_class = GoodsFilter  # 指明过滤器类
        filter_backends = [DjangoFilterBackend,]
# FilterSet将自动为给定的字段创建一个类,并允许发出以下请求:
http://127.0.0.1:8000/api/goods/?max_price=50&name=瓜

搜索

全局搜索

该搜索引擎依赖于 rest_framework, 不需要安装额外的插件

rest_framework的SearchFilter

# 注意:需要修改Django的全局配置文`settings.py`
REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': ['rest_framework.filters.SearchFilter']
}

局部搜索

# 这将允许客户端通过执行以下查询来过滤列表中的项目
http://127.0.0.1:8000/api/goods/?search=西瓜汁
# 导包
from rest_framework.filters import SearchFilter
from rest_framework.generics import ListAPIView

class GoodsListAPIView(ListAPIView):
    # 视图类单独配置搜索
    filter_backends = [SearchFilter]
    # 配置搜索字段
    search_fields = ['name']
    
 # 您还可以使用查找API双下划线表示法在ForeignKey或ManyToManyField上执行相关查找:
	search_fields = ['name', 'cate__name']
 # 可以通过在字符前面添加各种字符来限制搜索行为
- `'^'`开始搜索
- `'='`完全匹配
- `'$'`正则表达式搜索
	search_fields = ['^name', '=cate__name']

排序

全局排序

# 1.全局--settings.py
REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': ['rest_framework.filters.OrderingFilter']
}

局部排序

# 2. 局部设置 

# 导包
from rest_framework import filters
class SomeModelViewSet(ModelViewSet):
    # 在视图类中filter_backends配置排序
    filter_backends = [filters.OrderingFilter]
    # 排序的字段
    ordering_fields = ['age','name']
# 通过连接GET参数手动指明排序字段
http://127.0.0.1:8000/user/?ordering=-age # 从大到小
http://127.0.0.1:8000/user/?ordering=age # 从小到大

认证

注意:认证需要和权限一起使用

认证失败会有两种可能的返回值 。401 Unauthorized 未认证 。403 Permission Denied 权限被禁止

全局认证

# 在配置文件中配置全局默认的认证方案

# 配置认证
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES':(
        'rest_framework.authentication.BasicAuthentication',#基本认证

        'rest_framework.authentication.SessionAuthentication', # session认证
    ),
)

局部认证

# 导包
from rest_framework.authentication import SessionAuthentication, BasicAuthentication

from rest_framework.views import APIView


class fxampleView(APIView):
    """视图类"""
    # 每个视图中通过设置authentication_classess属性来设置局部认证
authentication_classes = (SessionAuthentication, BasicAuthentication)

权限

全局权限

# 在配置文件中设置默认的权限管理类
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    )
}

如果未在settings中配置权限

# 如果未指明,则采用如下默认配置(底层封装)
DEFAULT PERMISSION CLASSES : (
    # 允许所有用户访问和操作
'rest _framework.permissions.ALLowAny'
)

局部权限

# 导包
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView

class Exampleview(APIView):
    # 在具体的视图中通过permission_classes属性来设置权限
    # IsAuthenticated通过认证的用户可以访问和操作
permission_classes = (IsAuthenticated,)

提供的权限

。AllowAny 允许所有用户 。IsAuthenticated 仅通过认证的用户 。IsAdminUser 仅管理员用户 。IsAuthenticatedOrReadOnly 认证的用户可以完全操作,否则只能get读取

限流

匿名用户全局限流

# 可以对接口访问的频次进行限制,以减轻服务器压力。特别是限制爬虫的抓取。
# 可以在配置文件中,使用DEFAULT_THROTTLE_CLASSES 和 DEFAULT_THROTTLE_RATES进行全局配置


 REST_FRAMEWORK = {
      'DEFAULT_THROTTLE_CLASSES': (
          # 限制所有匿名未认证用户,使用IP区分用户
          'rest_framework.throttling.AnonRateThrottle',
          #认证用户的限流
          'rest_framework.throttling.UserRateThrottle',
      ),
      'DEFAULT_THROTTLE_RATES': {
          # 可以使用 second, minute, hour 或day来指明周期
          'anon': '3/minute',
          'user': '5/minute'
      }
  }

匿名用户局部限流

# 视图中使用`throttle_classes`属性设置限流用户类型

# 导包
 from rest_framework.generics import ListAPIView
  from rest_framework.throttling import AnonRateThrottle

  from .serializer import UserSerializer, User

  class UserView(ListAPIView):
      queryset = User.objects.all()
      serializer_class = UserSerializer
      throttle_classes = [AnonRateThrottle]  # 指明针对匿名用户进行限流,限流频率全局配置
        
# 在项目配置文件中针对用户类型设置具体频率        
REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_RATES': {
        # 可以使用 second, minute, hour 或day来指明周期
        'anon': '3/minute',
        'user': '5/minute'
      }
  }

跨域

# 注意:需要修改Django的全局配置文`settings.py`

# 需要安装django-cors-headers包,可以通过pip来安装:
pip install django-cors-headers
# 在INSTALLED_APPS中注册corsheaders
INSTALLED_APPS = [
"corsheaders",
]
# 在中间件中配置corsheaders.middleware.CorsMiddleware中间件
MIDDLEWARE = [
   "corsheaders.middleware.CorsMiddleware",
]
# 在settings.py中编写允许任何请求
CORS_GRIGIN_ALLOW_ALL = True


# 或者指定允许的域名
# CORS_ORIGIN_WHITELIST = [
#     'http://localhost:3000', # 前端开发服务器地址
#     'https://yourfrontenddomain.com', # 生产环境前端域名
# ]

# 如果需要携带cookie,需要设置:
CORS_ALLOW_CREDENTIALS = True

# 允许的HTTP方法
CORS_ALLOW_METHODS = [
   'DELETE',
   'GET',
   'OPTIONS',
   'PATCH',
   'POST',
   'PUT',
]

# 允许的请求头
CORS_ALLOW_HEADERS = [
   'accept',
   'accept-encoding',
   'authorization',
   'content-type',
   'dnt',
   'origin',
   'user-agent',
   'x-csrftoken',
   'x-requested-with',
   # 添加任何自定义的header
]
 
posted @ 2024-05-19 21:11  醍醐灌顶hl  阅读(15)  评论(0编辑  收藏  举报