热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

django原生api接口

django原生api接口1.1创建django项目django-adminstartprojectdrfdemo11.2创建appdjango-admins

django原生api接口

django原生api接口

1.1 创建django项目

django-admin startproject drfdemo1

1.2 创建app

django-admin startapp app

1.3 创建数据模型

app/models.py中编写如下代码:

from django.db import models


class studentsInfo(models.Model):
    name = models.CharField(max_length=12, verbose_name="姓名")
    sex = models.CharField(max_length=1, verbose_name="性别")
    age = models.IntegerField(verbose_name="年龄")
    classroom = models.CharField(max_length=10, verbose_name="教室")
    info = models.CharField(max_length=100, verbose_name="个人简介")

1.4 配置环境

drfdemo1/settings.py:

# 后端只提供接口,不使用后台等其他功能,所以将无用功能注释掉可以减轻压力,提高性能
INSTALLED_APPS = [
    # "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    # "django.contrib.messages",
    # "django.contrib.staticfiles",
    "app",
]

# 由于我们在使用post请求提交数据到后台的时候,django会有一个csrftoken验证,这样使用postman工具提交表单数据时就会失败,所以注释掉csrf中间件
MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.common.CommonMiddleware",
    # "django.middleware.csrf.CsrfViewMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    # "django.contrib.messages.middleware.MessageMiddleware",
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
]


# 由于是测试,所以不再使用mysql,使用sqlite3比较方便
DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.sqlite3",
        "NAME": BASE_DIR / "db.sqlite3",
    }
}

# 设置为中文
LANGUAGE_CODE = "zh-hans"

1.5 数据迁移

python manage.py makemigration
python manage.py migrate

1.6 编写视图代码

app/views.py:

import json
from .models import *
from django.views import View
from django.http import JsonResponse

"""
post /students/ 添加一个学生
GET  /students/ 获取所有学生信息

GET  /students//获取一个学生信息
PUT  /students// 更新一个学生信息
DELETE /students// 删除一个学生信息

一个路由对应一个视图类,把5个api接口分为两个视图类来写
"""


# 原生接口
class studentView(View):
    def post(self, request):
        # 1.接受客户端提交的数据
        name = request.POST.get("name")
        sex = request.POST.get("sex")
        age = request.POST.get("age")
        classroom = request.POST.get("classroom")
        info = request.POST.get("info")

        # 2.操作数据库,保存数据
        instance = studentsInfo.objects.create(
            name=name,
            sex=sex,
            age=age,
            classroom=classroom,
            info=info
        )

        # 3.返回结果
        return JsonResponse({
            "id": instance.id,
            "name": instance.name,
            "sex": instance.sex,
            "age": instance.age,
            "classroom": instance.classroom,
            "info": instance.info
        }, status=201, json_dumps_params={"ensure_ascii": False})

    def get(self, request):
        """
        获取多个学生信息
        """
        students_list = studentsInfo.objects.values()
        return JsonResponse(data=list(students_list), status=200, safe=False, json_dumps_params={"ensure_ascii": False})


class studentInfoView(View):
    def get(self, request, pk):
        """
        获取一条数据
        """
        try:
            instance = studentsInfo.objects.get(id=pk)
        except studentsInfo.DoesNotExist:
            return JsonResponse(data={"message": "学生不存在"}, status=404)
        else:
            return JsonResponse({
                "id": instance.id,
                "name": instance.name,
                "sex": instance.sex,
                "age": instance.age,
                "classroom": instance.classroom,
                "info": instance.info
            }, status=201, json_dumps_params={"ensure_ascii": False})

    def put(self, request, pk):
        # 1.接受客户端提交的数据
        data = json.loads(request.body)
        name = data.get("name")
        sex = data.get("sex")
        age = data.get("age")
        classroom = data.get("classroom")
        info = data.get("info")

        # 2.操作数据库,修改并保存数据
        try:
            instance = studentsInfo.objects.get(id=pk)
        except studentsInfo.DoesNotExist:
            return JsonResponse(data={"message": "学生不存在"}, status=404)
        else:
            instance.name = name
            instance.sex = sex
            instance.age = age
            instance.classroom = classroom
            instance.info = info
            instance.save()

        # 3.返回结果
        return JsonResponse({
            "id": instance.id,
            "name": instance.name,
            "sex": instance.sex,
            "age": instance.age,
            "classroom": instance.classroom,
            "info": instance.info
        }, status=201, json_dumps_params={"ensure_ascii": False})

    def delete(self, request, pk):
        try:
            studentsInfo.objects.get(id=pk).delete()
        except studentsInfo.DoesNotExist:
            return JsonResponse(data={"message": "您要删除的数据不存在"}, status=404)
        else:
            return JsonResponse(data={"message": "删除成功"})

1.7 配置路由

drfdemo1/urls.py:

from django.urls import path, include

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

app/urls.py:

from django.urls import path,re_path
from .views import *

urlpatterns = [
    path("students/", studentView.as_view()),
    re_path(r"^students/(?Pd+)/$", studentInfoView.as_view())
]

1.8 启动项目

python manage.py runserver 8000

1.9 测试api接口

1.9.1 添加一个学生

x2IIKO.png

返回数据:

{
    "id": 13,
    "name": "胡歌",
    "sex": "男",
    "age": "36",
    "classroom": "888",
    "info": "这个人很懒,什么都没有留下"
}

数据库:

x27Fg0.png

1.9.2 获取所有学生信息

x2IorD.png

返回数据

[
    {
        "id": 1,
        "name": "小明",
        "sex": "男",
        "age": 22,
        "classroom": "301",
        "info": "这个人很懒,什么也没有留下"
    },
    {
        "id": 2,
        "name": "小红",
        "sex": "女",
        "age": 18,
        "classroom": "301",
        "info": "这个人很懒,什么也没有留下"
    },
    {
        "id": 3,
        "name": "张三",
        "sex": "男",
        "age": 25,
        "classroom": "307",
        "info": "这个人很懒,什么也没有留下"
    },
    {
        "id": 4,
        "name": "李四",
        "sex": "男",
        "age": 24,
        "classroom": "308",
        "info": "这个人很懒,什么也没有留下"
    },
    {
        "id": 5,
        "name": "闵麒良",
        "sex": "男",
        "age": 23,
        "classroom": "310",
        "info": "河工胡歌"
    },
    {
        "id": 12,
        "name": "孙明辉",
        "sex": "男",
        "age": 23,
        "classroom": "333",
        "info": "这个人很懒,什么都没有留下"
    },
    {
        "id": 13,
        "name": "胡歌",
        "sex": "男",
        "age": 36,
        "classroom": "888",
        "info": "这个人很懒,什么都没有留下"
    }
]

1.9.3 获取一条数据

x2opqg.png

返回数据

{
    "id": 13,
    "name": "胡歌",
    "sex": "男",
    "age": 36,
    "classroom": "888",
    "info": "这个人很懒,什么都没有留下"
}

1.9.4 更新一条数据

x2oiIs.png

返回数据

{
    "id": 13,
    "name": "胡歌",
    "sex": "男",
    "age": 18,
    "classroom": 666,
    "info": "6666666666666666"
}

数据库:

x27nUJ.png

1.9.5 删除一条数据

x2oeMT.png

返回数据:

{
    "message": "删除成功"
}

数据库:

x2oYQK.png


推荐阅读
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
author-avatar
手机用户2502900723
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有