Django 的 REST framework 基础知识

发布时间:2025-12-10 11:32:12 浏览次数:8

系列文章目录

提示:阅读本章之前,请先阅读目录


文章目录

  • 系列文章目录
  • 前言
  • 1. 创建django项目
  • 2. 修改settings.py
  • 3. 根目录创建static文件夹
  • 4. 启动项目
  • 5. 创建数据表
  • 6. 创建一个超级管理员
  • 7. 登录django的admin后台
  • 8. 安装 REST framework
  • 9. 配置settings.py
  • 10. 重新生成数据表
  • 11. 配置urls.py路由
  • 12. 访问rest framework的登录
  • 13. 创建course app
  • 14. 配置course的apps.py
  • 15. 编写course的models.py
  • 16. 编写course的admin.py
  • 17. 把course加入app
  • 18. 创建数据表
  • 19. 编写serializers.py
  • 20. Django 原生的FBV和CBV编写接口

前言


1. 创建django项目

django-admin startproject 项目名称

2. 修改settings.py

修改

ALLOWED_HOSTS = ["*"] LANGUAGE_CODE = 'zh-hans' TIME_ZONE = 'Asia/Shanghai' USE_TZ = False DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'django_test','USER': 'root','PASSWORD': '123456','HOST': 'localhost','PORT': 3308}}

新增

STATIC_ROOT = os.path.join(BASE_DIR, "static")STATICFIELS_DIRS = [os.path.join(BASE_DIR, "staticfiles")]

3. 根目录创建static文件夹

4. 启动项目

python manage.py runserver

http://127.0.0.1:8000/

5. 创建数据表

python .\manage.py makemigrations python .\manage.py migrate

6. 创建一个超级管理员

python .\manage.py createsuperuser用户名 (leave blank to use 'xxxx'): smobee电子邮件地址: xxxx@qq.comPassword:Password (again):密码长度太短。密码必须包含至少 8 个字符。这个密码太常见了。密码只包含数字。Bypass password validation and create user anyway? [y/N]: ySuperuser created successfully.

7. 登录django的admin后台

http://127.0.0.1:8000/admin

8. 安装 REST framework

依赖requirements.txt

asgiref==3.2.7certifi==2020.4.5.1chardet==3.0.4coreapi==2.3.3coreschema==0.0.4Django==3.0.6django-filter==2.2.0djangorestframework==3.11.0idna==2.9importlib-metadata==1.6.0itypes==1.2.0Jinja2==2.11.2Markdown==3.2.2MarkupSafe==1.1.1Pygments==2.6.1pytz==2020.1requests==2.23.0sqlparse==0.3.1uritemplate==3.0.1urllib3==1.25.9zipp==3.1.0

官网

https://www.django-rest-framework.org/#installation

pip install djangorestframeworkpip install markdown # Markdown support for the browsable API.pip install django-filter # Filtering support

9. 配置settings.py

INSTALLED_APPS = [...'rest_framework','rest_framework.authtoken',] REST_FRAMEWORK = {# 分页器'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',# 分页'PAGE_SIZE': 50,# 返回的时间格式'DATETIME_FORMAT': '%Y-%m-%d %H:%M:%S',# 返回的数据格式'DEFAULT_RENDER_CLASSES': ['rest_framework.renderers.JSONRenderer','rest_framework.renderers.BrowsableAPIRenderer',],# 解析request.data'DEFAULT_PARSER_CLASSES': ['rest_framework.parsers.JSONParser','rest_framework.parsers.FormParser','rest_framework.parsers.MultiPartParser',],# 全局权限'DEFAULT_PERMISSION_CLASSES': ['rest_framework.permissions.IsAuthenticated'],# 认证方式'DEFAULT_AUTHENTICATION_CLASSES': ['rest_framework.authentication.BasicAuthentication','rest_framework.authentication.SessionAuthentication','rest_framework.authentication.TokenAuthentication',]}

10. 重新生成数据表

python .\manage.py makemigrations

python .\manage.py migrate

11. 配置urls.py路由

from django.contrib import adminfrom django.urls import path, includeurlpatterns = [path('api-auth/', include('rest_framework.urls')),path('admin/', admin.site.urls),]

12. 访问rest framework的登录

http://127.0.0.1:8000/api-auth/login/


13. 创建course app

python .\manage.py startapp course

14. 配置course的apps.py

class CourseConfig(AppConfig):default_auto_field = 'django.db.models.BigAutoField'name = 'course'verbose_name = '课程信息'

15. 编写course的models.py

from django.conf import settingsfrom django.db import modelsclass Course(models.Model):name = models.CharField(max_length=255, unique=True, help_text='课程名称', verbose_name='课程名称')introduction = models.TextField(help_text='课程介绍', verbose_name='课程介绍')price = models.DecimalField(max_digits=10, decimal_places=2, help_text='课程价格', verbose_name='课程价格')teacher = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, help_text='课程讲师',verbose_name='课程讲师')create_at = models.DateTimeField(auto_now_add=True, help_text='创建时间', verbose_name='创建时间')update_at = models.DateTimeField(auto_now=True, verbose_name='更新时间')class Meta:verbose_name = '课程信息'verbose_name_plural = '课程信息'ordering = ('price',)def __str__(self):return self.name

16. 编写course的admin.py

from django.contrib import adminfrom .models import Course@admin.register(Course)class CourseAdmin(admin.ModelAdmin):# 显示哪些字段list_display = ('name', 'introduction', 'teacher', 'price', 'create_at')# 搜索字段search_fields = list_display# 筛选字段list_filter = list_display

17. 把course加入app

settings.py

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

18. 创建数据表

python .\manage.py makemigrations

python .\manage.py migrate

19. 编写serializers.py

#!/usr/bin/env python# -*- coding: UTF-8 -*-# Author : zhongshaofeng# File : serializers.py# Time : 2023/6/30 0:06from django.contrib.auth.models import Userfrom .models import Coursefrom rest_framework import serializersclass UserSerializer(serializers.ModelSerializer):class Meta:model = User# 序列号所有字段,如果要序列化某些字段,写成元祖即可,('id', 'name', )fields = '__all__'class CourseSerializer(serializers.ModelSerializer):# 引入外键teacher = serializers.ReadOnlyField(source='teacher.username')class Meta:model = Coursefields = '__all__'# 设置深度depth = 2# 带超链接的# class CourseSerializer(serializers.HyperlinkedModelSerializer):# # 引入外键# teacher = serializers.ReadOnlyField(source='teacher.username')## class Meta:# model = Course# fields = '__all__'

20. Django 原生的FBV和CBV编写接口

import jsonfrom django.shortcuts import renderfrom django.http import HttpRequest, JsonResponse, HttpResponsefrom django.utils.decorators import method_decoratorfrom django.views import Viewfrom django.views.decorators.csrf import csrf_exemptfrom .models import Coursecourse_dict = {'name': '数学','introduction': '这是一门数学哦','price': 256.01}@csrf_exemptdef course_list(request: HttpRequest):"""Django FBV 原生接口:param request::return:"""if request.method == 'GET':# 查询所有课程courses = Course.objects.all()# 等同于这种返回# return HttpResponse(json.dumps(courses), content_type='application/json')return JsonResponse(courses)if request.method == 'POST':# post的话,需要引入取消csrf认证# 序列化course = json.loads(request.body.decode('utf-8'))# return HttpResponse(json.dumps(course), content_type='application/json')return JsonResponse(course, safe=False)# 这里的name='dispatch',是因为django路由进来时,先走的dispatch@method_decorator(csrf_exempt, name='dispatch')class CourseList(View):"""Django 的 CBV 编写接口"""def get(self, request: HttpRequest):return JsonResponse(course_dict)def post(self, request: HttpRequest):course = json.loads(request.body.decode('utf-8'))return HttpResponse(json.dumps(course), content_type='application/json')
需要做网站?需要网络推广?欢迎咨询客户经理 13272073477