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/<pk>/获取一个学生信息
PUT  /students/<pk>/ 更新一个学生信息
DELETE /students/<pk>/ 删除一个学生信息

一个路由对应一个视图类,把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/(?P<pk>d+)/$', 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

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:django原生api接口 - Python技术站

(0)
上一篇 2023年4月2日 下午4:39
下一篇 2023年4月2日 下午4:39

相关文章

  • Django-rest-framework开发api接口

    django-rest-framework开发api接口 (1) 创建django项目drfdemo1并且创建一个名为app的应用 django-admin startproject drfdemo1 python manage.py startapp app (2) 安装django-rest-framework pip install djangores…

    Python开发 2023年4月2日
    00
  • 使用django+websocket+redis+channels实现简易聊天室

    使用django+websocket+redis+channels实现简易聊天室 1.创建一个django项目 从存储项目的文件夹进入cmd命令行终端,输入以下命令创建chatroom项目 django-admin startproject chatroom 然后再进入项目文件夹,打开cmd命令行终端,输入以下命令创建chat应用 python manage…

    2023年4月2日
    00
  • 自定义Admin后台的登录页面

    自定义Admin后台的登录页面 (1) 在主应用里创建myadmin.py和myapps.py文件,在myadmin.py文件中定义MyAdminSite类,该类继承父类AdminSite并重写admin_view()和get_urls()方法从而更改Admin后台系统地登录地址。 from django.contrib import admin from …

    Python开发 2023年4月2日
    00
  • 树结构

    树结构 1.1 树的定义 树(Tree):个节点构成的有限集合。当n = 0时,称为空树。对于任一棵非空树(n>0),它具备以下性质: 树中有一个称为”根(Root)”的特殊节点,用r表示;其余节点可分为m(m>0)个互不相交的有限集、,…,,其中每个集合本身又是一棵树,称为原来树的子树(SubTree)。如下图: 1.2 树结构的术语 树结…

    Python开发 2023年4月2日
    00
  • Django中封装分页组件

    Django中封装分页组件 (1) 定义Paginator类 from django.utils.safestring import mark_safe class Paginator(object): “”” 初始化参数说明: request:请求对象 data:查询到的符合条件的数据 search_data:搜索框收索的关键字,解决收索情况下分页的BUG…

    Python开发 2023年4月2日
    00
  • 使用python爬取微博评论

    最近在复习以前学习的python爬虫内容,就拿微博来练了一下手,这个案例适合学习爬虫到中后期的小伙伴,因为他不是特别简单也不是很难,关键是思路,为什么说不是很难呢?因为还没涉及到js逆向,好了话不多说开干。 (1)找到要爬取的页面,如下: (2)点开评论,拉到最下方,如下位置: 点击“点击查看”进入另一个页面,如下所示: 这里会显示更多评论,但是不是全部,随…

    2023年4月2日
    00
  • django中资源文件夹的引入

    django中资源文件夹的引入 1.静态资源文件夹的引入 settings.py的配置如下所示: # django默认配置 STATIC_URL=’static/’ # django会去应用里面的static文件夹找静态资源,仅当DEBUG为True时 # BASE_DIR是项目的绝对地址 STATIC_ROOT=BASE_DIR / ‘static’ # …

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部