Django之开发restful接口
django中的开发接口有两种模式FBV和CBV,分别是基于函数视图和基于类视图,详细的可以看看菜鸟教程的Django 视图 - FBV 与 CBV,由于本文的用户管理是一个restful风格的api,所以我选择的是类视图的开发风格。
简单用户model:
from django.db import models # Create your models here.
class Users(models.Model):
SEX_ITEMS = (
(2, '未知'),
(1, '男'),
(0, '女'),
)
name = models.CharField(max_length=128, verbose_name='姓名')
sex = models.IntegerField(choices=SEX_ITEMS, default=2, verbose_name='性别')
idcard = models.CharField(max_length=18, verbose_name='身份证号码', unique=True)
email = models.EmailField(verbose_name='邮箱地址')
address = models.CharField(max_length=256, verbose_name='家庭住址')
company = models.CharField(max_length=256, verbose_name='所属公司')
created_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') def __str__(self):
return self.name class Meta:
verbose_name = verbose_name_plural = '用户管理'
配置路由:
from django.contrib import admin
from django.urls import path
from usermanage import views urlpatterns = [
path('admin/', admin.site.urls),
path('user/', views.UsersView.as_view()),
path('user/<int:pk>/', views.UsersView.as_view())
]
我们先从usermanage用户管理app中导入视图模块,然后配置user/路由作为本次的访问路径。
视图开发:
GET:
访问路由:
- 首先
http://127.0.0.1:8000/user/get方法应该可以访问全部的用户 - 然后
http://127.0.0.1:8000/user/1/get方法应该可以访问单个用户 http://127.0.0.1:8000/user/?name=XX/get方法应该可以过滤出符合条件的用户
则get请求实现方式:
import json
from django.http import JsonResponse
from django.views.generic import View
from django.forms.models import model_to_dict from .models import Users class UsersView(View): def get(self, request, pk=0):
if pk:
try:
user = Users.objects.get(pk=pk)
user = model_to_dict(user)
return JsonResponse({'code': 200, 'message': 'success', 'data': user}, status=200)
except Users.DoesNotExist:
return JsonResponse({'code': 404, 'message': '用户不存在'}, status=200)
data = json.loads(request.body) if request.body else {}
users = list(Users.objects.filter(**data).all().values())
return JsonResponse({'code': 200, 'message': 'success', 'data': users}, status=200)
通过pk参数区分是单个用户还是多个用户。
然后通过request的请求来过滤对应的数据
POST:
分析一下post请求,我们post请求是添加一条数据。根据restful的规范添加数据的同时我们必须要返回该请求的信息。
实现:
import json from django.forms.models import model_to_dict
from django.views.generic import View
from django.http import JsonResponse
from django.db.utils import IntegrityError
from .models import Users class UsersView(View): ... def post(self, request):
data = json.loads(request.body)
try:
user = Users.objects.create(**data)
user = model_to_dict(user)
return JsonResponse({'code': 201, 'message': 'created', 'data': user}, status=201)
except IntegrityError:
return JsonResponse({'code': 400, 'message': '身份证号码已存在!'}, status=200)
一般会遇到访问问题:

那么这个是csrf验证失败,什么是csrf呢?看看度娘怎么说吧跨站请求伪造(英语:Cross-site request forgery)
知道了是什么那么怎么处理呢,django内置了一个方法,我们只需要添加上就行了。更改代码
from django.views.decorators.csrf import csrf_exempt # Create your views here.
class UsersView(View):
@csrf_exempt
def dispatch(self, request, *args, **kwargs):
return super(UsersView, self).dispatch(request, *args, **kwargs) ... def post(self, request):
data = json.loads(request.body)
try:
user = Users.objects.create(**data)
except IntegrityError:
return JsonResponse({'code': 400, 'message': '身份证号码已存在!'}, status=200)
user = model_to_dict(user)
return JsonResponse({'code': 201, 'message': 'created', 'data': user}, status=201)
使用csrf_exempt装饰器给dispatch就可以了。
PUT:
更新一条数据。
实现:
def put(self, request, pk=0):
data = json.loads(request.body)
user = Users.objects.get(pk=pk)
for key, value in data.items():
setattr(user, key, value)
user.save()
user = model_to_dict(user)
return JsonResponse({'code': 200, 'message': 'updated', 'data': user}, status=200)
DELETE:
删除一条数据,删除数据和更新数据一样,都需要指定具体的数据,避免胡删除。
实现:
def delete(self, request, pk=0):
user = Users.objects.get(pk=pk)
user.delete()
return JsonResponse({'code': 204, 'message': 'deleted'}, status=204)
Django之开发restful接口的更多相关文章
- 基于.NetCore开发博客项目 StarBlog - (21) 开始开发RESTFul接口
前言 最近电脑坏了,开源项目的进度也受到一些影响 这篇酝酿很久了,作为本系列第二部分(API接口开发)的第一篇,得想一个好的开头,想着想着就鸽了好久,索性不扯那么多了,直接开写吧~ 关于RESTFul ...
- SpringMVC开发RESTful接口
概念: 什么是REST? REST是Representational State Transfer的缩写.翻译为"表现层状态转化",restful是一种接口设计风格,它不是一个协议 ...
- django开发后台接口error 10053/10054
初学Django,开发完接口之后访问post请求的接口遇到error10053和10054,查阅很多资料没有找到具体的原因. 在这里记录下我遇到这两个报错的原因和解决方案: get请求取请求参数:su ...
- Django:前后端分离 djangorestframework开发API接口 serializer序列化认证组件
参考:https://blog.csdn.net/zhangmengran/article/details/84887206 目的: 使用serializer序列化器将QuerySet数据序列化为js ...
- python 全栈开发,Day100(restful 接口,DRF组件,DRF跨域(cors组件))
昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确.方便快速开发 - 针对pc,手机,ipad,微信,支付宝... 使用同一个接口 2. 简述http协议? - 基 ...
- RESTful设计原则和样例(开发前后台接口)
摘要 REST(表征性状态传输)设计风格;REST通常基于使用HTTP,URI协议和标准.使用URL标识资源,开发前后台接口.主要使用post,get方式 参考博文: http://www.cnblo ...
- python3.8.0 Django 开发后端接口api 部署到 Linux Centos7上
经历了两天的时候终于把本地使用python3 django开发的接口API部署到服务器上了,还是记录一下,以免之后忘记,哈哈 注意一点,就是,centos7是基于python2的,我这边默认的是pyt ...
- RESTful规范与django编写restful接口
一.什么是RESTful规范 ①REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” ②REST从资 ...
- 接口开发-restful
数据库表设计 1 --员工表 2 create table Employee 3 ( 4 id NUMBER primary key, 5 employeeID NUMBER not null, 6 ...
- DRF框架之使用Django框架完成后端接口(API)的定义
学习DRF框架,首先我们就需要明白为什么要学习这个框架. 接下来我们就先用原生的Django框架来定义一个符合RESTful设计方法的接口(API). RESTful接口的需求如下: GET /boo ...
随机推荐
- ASP.NET Core Library – MailKit SMTP Client
前言 以前写的 SMTP Client 相关文章: Asp.net core 学习笔记 ( Smtp and Razor template 电子邮件和 Razor 模板 ) ASP.NET Email ...
- IDEA 换了电脑,如何导入和导出配置?
前言 我们在使用IDEA开发时,经常会设置各种各样的配置,时间一长,就会有很多个性化的东西.用起来也越来越顺手. 不过这里可能会有个问题,那就是哪一天我们要换个电脑了,或者想安装新版本的IDEA时 ...
- 运输小猫娘之再续 5k 传奇之寻找人道主义素数
原文 前情提要 本章主角 5k_sync_closer 第一章 从再续前缘到苦心寻找满足最优条件的人道主义美丽素数 上回书说到,5k 因为拯救大家被炸断了 \(1000000007\) 米中的十五千米 ...
- C++中指针和数组相关的运算符优先级
概述 本文深入介绍了与指针和数组相关的运算符优先级,利用代码示例展示了当左结合和右结合运算符同时存在时的结合方式,同时也演示了如何使用()来强制人为指定结合顺序. 指针.数组相关的运算符优先级 下表展 ...
- Android Qcom USB Driver学习(四)
VID/PID识别USB设备 CDC-ACM驱动介绍 CDC-ACM(Communication Device Class--Abstract Control Model)驱动实现以USB设备驱动和t ...
- 10月《中国数据库行业分析报告》已发布,深度剖析甲骨文大会Oracle技术新趋势
为了帮助大家及时了解中国数据库行业发展现状.梳理当前数据库市场环境和产品生态等情况,从2022年4月起,墨天轮社区行业分析研究团队出品将持续每月为大家推出最新<中国数据库行业分析报告>,持 ...
- 活动预告 | 中国数据库联盟(ACDU)中国行第三站定档成都,邀您探讨数据库前沿技术
数据库技术一直是信息时代中不可或缺的核心组成部分,随着信息量的爆炸式增长和数据的多样化,其重要性愈发凸显.作为中国数据库联盟(ACDU)的品牌活动之一,[ACDU 中国行]在线下汇集数据库领域的行业知 ...
- 如何理解 .Net 中的 委托
// 委托 // 一种方法的声明和定义,也就是方法的占位符 // 一般使用在 参数 和 属性中 int Add(int a,int b) { return a + b; } // 定义委托的三种方法 ...
- element+vue2的查询form表单封装成组件复用
<template> <el-form :inline="true" style="display: flex; flex-direction: row ...
- promise是什么?它有哪些作用?
promsie是es6新增的特性,用来解决回调地狱的问题(异步深层嵌套问题) : 也叫做期约函数,是js内部的构造函数 ,可以当作一个容器,里面保存着某个未来才会结束的事件,比如异步请求 :