Restful规范 --- 通信协议
API和用户通信协议,推荐使用HTTPS
Restful规范 --- 域名
有两种可选的方式:
① https://api.abc.com/
② https://abc.com/api/
Restful规范 --- 请求方法
GET : 从服务器取出资源(一项或多项)
POST : 在服务器新建一个资源 PUT : 在服务器更新资源(客户端提供改变后的完整资源) PATCH : 在服务器更新资源(客户端提供改变的属性)
DELETE : 从服务器删除资源
Restful规范 --- 状态码
200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE]:用户删除数据成功。
400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。 403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
Restful规范 --- 错误处理
状态码为4xx时需要返回错误信息提示,默认error为返回的字典中的key,当然也可以自己定义。例如:
{
error: 'Invalid API key’
}
创建model
from django.db import models
# Create your models here.
# 学院-faculty 专业 major 学生信息 student
# 学院 Faculty
class Faculty(models.Model):
name = models.CharField(verbose_name="学院名称",max_length=100,unique=True,null=False,blank=False)
class Meta:
managed = True
app_label = "studentweb"
db_table = "Stu_Faculty"
def __str__(self):
return "%s" %(self.name)
# 专业 Major id name faculty
class Major(models.Model):
name = models.CharField(verbose_name="专业名称",max_length=100,null=False,blank=False)
faculty = models.ForeignKey(verbose_name="所属学院",to=Faculty,on_delete=models.PROTECT)
class Meta:
managed = True
app_label = "studentweb"
db_table = "Stu_Major"
def __str__(self):
return "%s" %(self.name)
# 学生信息 Student son name genger birthday major mobile email address image
class Student(models.Model):
sno = models.CharField(verbose_name="学号",max_length=100,primary_key=True,null=False,blank=False)
name = models.CharField(verbose_name="姓名", max_length=100, null=False, blank=False)
gender = models.CharField(verbose_name="性别", max_length=100, null=False, blank=True,default=None)
birthday = models.DateTimeField(verbose_name="出生日期", null=False, blank=True, default=None)
major = models.ForeignKey(verbose_name="专业", to=Major,on_delete=models.PROTECT)
mobile = models.CharField(verbose_name="电话", max_length=100, null=False, blank=True, default=None)
email = models.CharField(verbose_name="邮箱", max_length=100, null=False, blank=True, default=None)
address = models.CharField(verbose_name="地址", max_length=100, null=False, blank=True, default=None)
image = models.CharField(verbose_name="照片", max_length=100, null=False, blank=True, default=None)
class Meta:
managed = True
app_label = "studentweb"
db_table = "Stu_Studet"
def __str__(self):
return "%s" %(self.name)
# -*- coding: utf-8 -*-
from rest_framework import serializers
from studentweb.models import Faculty,Major,Student
class FacultySerialzer(serializers.ModelSerializer):
class Meta:
model = Faculty
fields = "__all__"
class MajorSerialzer(serializers.ModelSerializer):
faculty = FacultySerialzer()
class Meta:
model = Major
fields = "__all__"
class StudentSerialzer(serializers.ModelSerializer):
major = MajorSerialzer
class Meta:
model = Student
fields = "__all__"
from django.shortcuts import render
from rest_framework.viewsets import ModelViewSet
from studentweb.models import Faculty,Major,Student
from studentweb.serializer import FacultySerialzer,MajorSerialzer,StudentSerialzer
from studentweb.filter import FacultyFilter
from rest_framework.response import Response
from rest_framework import status
from rest_framework.decorators import action
# Create your views here.
# Faculty视图
class FacultyViewSet(ModelViewSet):
"""
create:
创建院系信息
retrieve:
获取院系信息详情数据
update:
完整更新院系信息
partial_update:
部分更新院系信息
destroy:
删除院系信息
list:
获取所有院系信息
"""
queryset = Faculty.objects.all()
serializer_class = FacultySerialzer
# 指定筛选的类
#filter_class = FacultyFilter
# --- Major视图---
class MajorViewSet(ModelViewSet):
"""
create:
创建专业信息
retrieve:
获取专业信息详情数据
update:
完整更新专业信息
partial_update:
部分更新专业信息
destroy:
删除专业信息
list:
获取所有专业信息
"""
queryset = Major.objects.all()
serializer_class = MajorSerialzer
# 指定筛选的类
# filter_class = MajorFilter
# --- Student视图---
class StudentViewSet(ModelViewSet):
"""
create:
创建学生信息
retrieve:
获取学生信息详情数据
update:
完整更新学生信息
partial_update:
部分更新学生信息
destroy:
删除学生信息
list:
获取所有学生信息
"""
queryset = Student.objects.all()
serializer_class = StudentSerialzer
# -*- coding: utf-8 -*-
from django.urls import path
from rest_framework.routers import DefaultRouter
from studentweb.views import FacultyViewSet,MajorViewSet,StudentViewSet
# 1.实例一个 DefaultRouter
router = DefaultRouter()
# 2.注册相应的url
# 注册faculty对象
router.register('facultys', FacultyViewSet, basename='facultys') # http://127.0.0.1:8000/api/v1/facultys/
# 注册major对象
router.register('majors', MajorViewSet, basename='majors') # http://127.0.0.1:8000/api/v1/majors/
# 注册student对象
router.register('students', StudentViewSet, basename='students') # http://127.0.0.1:8000/api/v1/students/
urlpatterns = []
urlpatterns += router.urls