Django之开发restful接口(django restful API 代码自动生成)

网友投稿 381 2022-08-31


Django之开发restful接口(django restful API 代码自动生成)

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 adminfrom django.urls import pathfrom usermanage import viewsurlpatterns = [ path('admin/', admin.site.urls), path('user/', views.UsersView.as_view()), path('user//', views.UsersView.as_view())]

我们先从usermanage用户管理app中导入视图模块,然后配置​​user/​​路由作为本次的访问路径。

视图开发:

GET:

访问路由:

首先​​jsonfrom django.import JsonResponsefrom django.views.generic import Viewfrom django.forms.models import model_to_dictfrom .models import Usersclass 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 jsonfrom django.forms.models import model_to_dictfrom django.views.generic import Viewfrom django.import JsonResponsefrom django.db.utils import IntegrityErrorfrom .models import Usersclass 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)


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Python3.6,3.7,3.8版本对比(python3.8与3.6区别)
下一篇:SpringBoot实现接口的各种参数校验的示例
相关文章

 发表评论

暂时没有评论,来抢沙发吧~