【Python3.13】Django5.1项目之Restful风格API

前置条件:确保你的环境中已经安装了Django。如果没有安装,可以看之前的文章安装

步骤一:安装DRF

Django REST Framework (DRF) 是一个强大的框架,用于构建可扩展的 web API。可以使用 pip 命令安装 DRF:

安装Django REST Framework,可以通过pip命令进行安装:

pip3 install djangorestframework

执行后如下图:

步骤二:配置settings.py

在Django的settings.py文件中添加rest_frameworkINSTALLED_APPS列表中。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'index',
    'cdp',
    'rest_framework',
]

步骤三:全局配置

在settings.py中添加REST framework的全局配置:

REST_FRAMEWORK = {

    # 分页

    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',

    'PAGE_SIZE': 10,

    # 认证

    'DEFAULT_AUTHENTICATION_CLASSES': (

        'rest_framework.authentication.SessionAuthentication',

        'rest_framework.authentication.BasicAuthentication',

    ),

    # 权限

    'DEFAULT_PERMISSION_CLASSES': (

        'rest_framework.permissions.IsAuthenticated',

    ),

    # 序列化

    'DEFAULT_RENDERER_CLASSES': (

        'rest_framework.renderers.JSONRenderer',

    ),

    # 解析器

    'DEFAULT_PARSER_CLASSES': (

        'rest_framework.parsers.JSONParser',

    ),

}

步骤四:数据迁移

确保你的Django项目已经迁移,以创建任何必要的REST Framework数据库表:

​​​​​​​python manage.py migrate

执行后:

现在你可以开始在你的Django项目中使用Django REST Framework了。

步骤五:定义一个Restful风格api

在models.py中定义一个model

from django.db import models


# Create your models here.
class BrainConfig(models.Model):
    id = models.BigAutoField(primary_key=True, verbose_name='ID')
    name = models.CharField(max_length=64, verbose_name='租户名称')

    class Meta:
        db_table = 'brain_config'
        managed = False
        verbose_name = '配置表'
        verbose_name_plural = '配置表'

定义一个序列化类serializers.py:

from rest_framework import serializers

from cdp.models import BrainConfig


class BrainSerializer(serializers.ModelSerializer):
    class Meta:
        model = BrainConfig
        fields = '__all__'

在views.py中定义一个视图:

# Create your views here.
from rest_framework import viewsets

from cdp.models import BrainConfig
from cdp.serializers import BrainSerializer


class TestView(viewsets.ModelViewSet):
    queryset = BrainConfig.objects.all()
    serializer_class = BrainSerializer

在urls.py中定义路由:


from django.contrib import admin
from django.urls import path, include

from rest_framework.routers import DefaultRouter
from cdp.views import TestView
router = DefaultRouter()
router.register(r'test', TestView)
urlpatterns = router.urls

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include(router.urls)),
]

如此就配置完成了一个路径为test的接口,可以通过浏览器访问测试,配置正确的话,访问后如下图所示:

可以给查询指定分页器、过滤器、查询、排序,对应的是pagination_classfilter_backendssearch_fieldsordering_fields属性,这样在查询的时候就可以URL 中添加?limit=10?offset=20?search=django?ordering=id等参数来控制分页和过滤:

# Create your views here.
from rest_framework import viewsets
from rest_framework.pagination import LimitOffsetPagination

from cdp.models import BrainConfig
from cdp.serializers import BrainSerializer


class TestView(viewsets.ModelViewSet):
    queryset = BrainConfig.objects.all()
    serializer_class = BrainSerializer
    #指定分页器
    pagination_class = LimitOffsetPagination
    filter_backends = [SearchFilter, OrderingFilter]
    search_fields = ['id', 'name']
    ordering_fields = ['id']

步骤六:自动API接口文档

博主尝试使用rest_framework.schemas模块来自动生成 API 文档。

然后出现了问题,AssertionError: `coreapi` must be installed for schema support.
如图所示:

接下来就是要解决此问题,首先尝试安装coreapi,执行命令:pip3 install coreapi

xxx@xxxMacBook-Pro dataCenterWeb % pip3 install coreapi
Collecting coreapi
  Using cached coreapi-2.3.3-py2.py3-none-any.whl.metadata (1.0 kB)
Collecting coreschema (from coreapi)
  Downloading coreschema-0.0.4.tar.gz (10 kB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... done
Requirement already satisfied: requests in /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages (from coreapi) (2.32.3)
Collecting itypes (from coreapi)
  Downloading itypes-1.2.0-py2.py3-none-any.whl.metadata (4.9 kB)
Collecting uritemplate (from coreapi)
  Downloading uritemplate-4.1.1-py2.py3-none-any.whl.metadata (2.9 kB)
Collecting jinja2 (from coreschema->coreapi)
  Downloading jinja2-3.1.4-py3-none-any.whl.metadata (2.6 kB)
Requirement already satisfied: charset-normalizer<4,>=2 in /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages (from requests->coreapi) (3.4.0)
Requirement already satisfied: idna<4,>=2.5 in /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages (from requests->coreapi) (3.10)
Requirement already satisfied: urllib3<3,>=1.21.1 in /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages (from requests->coreapi) (2.2.3)
Requirement already satisfied: certifi>=2017.4.17 in /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages (from requests->coreapi) (2024.8.30)
Collecting MarkupSafe>=2.0 (from jinja2->coreschema->coreapi)
  Downloading MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl.metadata (4.0 kB)
Downloading coreapi-2.3.3-py2.py3-none-any.whl (25 kB)
Downloading itypes-1.2.0-py2.py3-none-any.whl (4.8 kB)
Downloading uritemplate-4.1.1-py2.py3-none-any.whl (10 kB)
Downloading jinja2-3.1.4-py3-none-any.whl (133 kB)
Downloading MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl (12 kB)
Building wheels for collected packages: coreschema
  Building wheel for coreschema (pyproject.toml) ... done
  Created wheel for coreschema: filename=coreschema-0.0.4-py3-none-any.whl size=15017 sha256=215cc1ec4e822254ece48ccf200c4d1929be79f41b1e9d7b9564d37d2108e4aa
  Stored in directory: /Users/dengfengsun/Library/Caches/pip/wheels/91/91/76/2bf8eadb0d094a23dbcf2da133882ff07d6bdccaf6215818f1
Successfully built coreschema
Installing collected packages: itypes, uritemplate, MarkupSafe, jinja2, coreschema, coreapi
Successfully installed MarkupSafe-3.0.2 coreapi-2.3.3 coreschema-0.0.4 itypes-1.2.0 jinja2-3.1.4 uritemplate-4.1.1

重新启动项目后问题依然存在,查阅资料说是urllib3版本太高,需要降低版本,然后就将版本降低

pip3 install urllib3==1.26.15

降低后问题依然存在,然后卸载urllib3后重新安装

然后出现新的问题,显示ModuleNotFoundError: No module named 'cgi':

首先,需要了解 cgi 模块是 Python 的标准库之一,通常应该在所有的 Python 安装中都可用。但是,从 Python 3.11 开始,cgi 模块已被标记为废弃(deprecated),并在 Python 3.13 中被移除。因此,如果你使用的是 Python 3.13 或更高版本,你会遇到这个错误。所以cgi 模块不可用是预期的行为(博主使用的是Python3.13😭),所以从目前来看还不能使用自动生成api文档功能,等后续coreapi出兼容版本。

同时如果'cgi'模块非标准库或已被移除

  • 对于 Python 3.13 及更高版本,你需要寻找替代方案。Python 文档提供了 cgi 模块的替代方案,如使用 urllib.parse 和 email 包来处理类似的任务。
  • 例如,如果你之前使用 cgi.FieldStorage 来解析表单数据,你可以改用 urllib.parse.parse_qsl() 或 email.message 来处理 GET 和 POST 请求。

 示例代码:

假设你原来的代码是这样:

import cgi

form = cgi.FieldStorage()
# 处理表单数据

对于python3.13或更高版本:

from urllib.parse import parse_qsl
from email.message import EmailMessage
import io

# 假设 data 是从 HTTP 请求的查询字符串或 POST 请求体中获取的
data = "key1=value1&key2=value2"

# 对于 GET 请求
params = dict(parse_qsl(data))

# 对于 POST 请求(假设数据是 multipart/form-data)
# 这里需要更复杂的解析,但可以使用 email.message 来处理
# 注意:这里的代码仅作为示例,实际情况可能需要更复杂的处理
input_stream = io.StringIO(data)
msg = EmailMessage()
msg.set_content(data)  # 注意:这里不是实际的处理方式,只是为了演示
# 你需要编写或找到解析 multipart/form-data 的代码
# 可能需要使用类似 multipart 的第三方库

# 使用 params 或通过其他方式获取的表单数据
print(params)

请注意,上面的 POST 请求处理示例是不完整的,因为 EmailMessage 不是用来直接解析 multipart/form-data 的。你需要使用像 email.parser 或第三方库(如 multipart)来正确解析这种类型的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值