django框架搭建API接口代码示例与步骤python

django框架搭建API接口代码示例与步骤

https://docs.djangoproject.com/zh-hans/5.0/
https://q1mi.github.io/Django-REST-framework-documentation/api-guide/routers_zh/
https://django-vue-admin.com/guide/getting-started


1 安装python,下载对应的版本,我的是3.12.3
https://www.python.org/downloads/

2 安装django
python -m pip install Django
查看版本
python -m django --version

3 创建项目:https://docs.djangoproject.com/zh-hans/5.0/intro/tutorial01/
django-admin startproject mysite

启动
python manage.py runserver 9192

4 创建应用
python manage.py startapp polls
添加应用mysite.py文件中

INSTALLED_APPS = [
    ...
    'polls',
    ...
]

5 写代码:
打开 polls/views.py,把下面这些 Python 代码输入进去:

from django.http import HttpResponse
def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

路由(应用):polls/urls.py 

from django.urls import path
from . import views
urlpatterns = [
    path("", views.index, name="index"),
]

路由(项目):mysite/urls.py 

from django.contrib import admin
from django.urls import include, path
urlpatterns = [
    path("polls/", include("polls.urls")),
    path("admin/", admin.site.urls),
]

启动测试:
python manage.py runserver 9192
或者在manage.py文件中添加:

if __name__ == '__main__':
    if sys.argv[1] == 'runserver' and len(sys.argv) == 2:
        sys.argv.append('9192')  # 默认端口
    main()

7 生成 requirements.txt 文件 
pip freeze > requirements.txt

8 安装依赖 requirements.txt 文件 
pip install -r requirements.txt

9 接口API示例‘增删改查’CURD,用框架djangorestframework,即rest_framework

polls/views.py

from rest_framework import viewsets, filters,status,permissions
from rest_framework.response import Response
from rest_framework.pagination import PageNumberPagination
from django_filters.rest_framework import DjangoFilterBackend
from .models import News
from .serializers import NewsSerializer

# 自定义分页类
class NewsPagination(PageNumberPagination):
    page_size = 10  # 每页显示的条数
    page_size_query_param = 'size'  # 前端控制每页显示条数的参数
    max_page_size = 100  # 最大每页显示条数
    page_query_param = 'page'  # 页码参数

class NewsViewSet(viewsets.ModelViewSet):
    queryset = News.objects.all()
    serializer_class = NewsSerializer
    pagination_class = NewsPagination
    filter_backends = [DjangoFilterBackend, filters.SearchFilter]
    filterset_fields = ['created_at']  # 允许通过 created_at 字段进行过滤
    search_fields = ['title']  # 允许通过 title 字段进行搜索
    http_method_names = ['get', 'post', 'put', 'patch', 'delete']
    permission_classes = [permissions.AllowAny]  # 允许所有请求


    def get_queryset(self):
        queryset = super().get_queryset()
        title = self.request.query_params.get('title', None)
        start_date = self.request.query_params.get('start_date', None)
        end_date = self.request.query_params.get('end_date', None)

        if title:
            queryset = queryset.filter(title__icontains=title)
        if start_date and end_date:
            queryset = queryset.filter(created_at__range=[start_date, end_date])

        return queryset

    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            response = self.get_paginated_response(serializer.data)
            return response

        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)

    # 创建新闻
    def create(self, request):
        serializer = NewsSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    # 获取单条新闻
    def retrieve(self, request, pk=None):
        try:
            news = News.objects.get(pk=pk)
        except News.DoesNotExist:
            return Response(status=status.HTTP_404_NOT_FOUND)
        serializer = NewsSerializer(news)
        return Response(serializer.data)

    # 更新新闻
    def update(self, request, pk=None):
        try:
            news = News.objects.get(pk=pk)
        except News.DoesNotExist:
            return Response(status=status.HTTP_404_NOT_FOUND)
        serializer = NewsSerializer(news, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    # 删除新闻
    def destroy(self, request, pk=None):
        try:
            news = News.objects.get(pk=pk)
        except News.DoesNotExist:
            return Response(status=status.HTTP_404_NOT_FOUND)
        news.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

polls/models.py

from django.db import models

class News(models.Model):
    title = models.CharField(max_length=255)
    description = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    company_id = models.IntegerField()  # 添加 company_id 字段
    category_id = models.IntegerField()  # 添加 company_id 字段
    
    class Meta:
        db_table = 'news'  #
    def __str__(self):
        return self.title

polls/serializers.py

from rest_framework import serializers
from .models import News

class NewsSerializer(serializers.ModelSerializer):
    class Meta:
        model = News
        fields = '__all__'
    def validate_company_id(self, value):
        """
        自定义验证方法,确保 company_id 是数字类型
        """
        if not isinstance(value, int):
            raise serializers.ValidationError("company_id 必须是数字类型")
        return value

    def validate_category_id(self, value):
        if not isinstance(value, int):
            raise serializers.ValidationError("category_id 必须是数字类型")
        return value

polls/urls.py

from django.urls import path,include
from . import views

from rest_framework.routers import DefaultRouter
from .views import NewsViewSet

router = DefaultRouter()
router.register(r'news333', NewsViewSet)

urlpatterns = [
    path('', include(router.urls)),

mysite/urls.py

from django.contrib import admin
from django.urls import path, include  # 注意导入 include

urlpatterns = [
    path('admin/', admin.site.urls),
    # path('polls/', include('polls.urls')),
    path('api/', include('polls.urls')),
]

或者这样自定义每个单独的URL

# polls/urls.py
from django.urls import path,include
from . import views

from rest_framework.routers import DefaultRouter
from .views import NewsViewSet

# router = DefaultRouter()
# router.register(r'news333', NewsViewSet)

urlpatterns = [
    # path('', include(router.urls)),

    # 对应的网址:http://127.0.0.1:9192/polls/news/detail/1/
    path('news/detail/<int:pk>/', NewsViewSet.as_view({'get': 'retrieve'}), name='news-detail'),
    # 对应的网址:http://127.0.0.1:9192/polls/news/my_detail/1/
    path('news/my_detail/<int:pk>/', NewsViewSet.as_view({'get': 'my_detail'}), name='news-my_detail'),

    path('news/list/', NewsViewSet.as_view({'get': 'list'}), name='news-list'),
    path('news/update/<int:pk>/', NewsViewSet.as_view({'post': 'update_news'}), name='news-update'),
    path('news/delete/<int:pk>/', NewsViewSet.as_view({'post': 'delete_news'}), name='news-delete'),
    path('news/add/', NewsViewSet.as_view({'post': 'add_news'}), name='news-add'),
]

mysite/sittings.py

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


结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值