• 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)
  • 相关阅读:
    技术面试问题汇总第005篇:猎豹移动反病毒工程师part5
    技术面试问题汇总第004篇:猎豹移动反病毒工程师part4
    Hexo安装和配置
    hexo从零开始到搭建完整 转
    window下phpstudy的nginx配置虚拟主机
    CentOS Linux搭建SVN服务器
    解决CentOS7关闭/开启防火墙出现Unit iptables.service failed to load: No such file or directory.
    numpy使用
    Linux学习15_CentOS6.5下netcat工具安装教程
    中国天气网七天天气
  • 原文地址:https://www.cnblogs.com/xingxia/p/django_restful.html
Copyright © 2020-2023  润新知