前置条件:确保你的环境中已经安装了Django。如果没有安装,可以看之前的文章安装
步骤一:安装DRF
Django REST Framework (DRF) 是一个强大的框架,用于构建可扩展的 web API。可以使用 pip 命令安装 DRF:
安装Django REST Framework,可以通过pip命令进行安装:
pip3 install djangorestframework
执行后如下图:
步骤二:配置settings.py
在Django的settings.py文件中添加rest_framework到INSTALLED_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_class、filter_backends、search_fields和ordering_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)来正确解析这种类型的数据。

2030

被折叠的 条评论
为什么被折叠?



