xingxia

 

 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)

 

分类:

技术点:

相关文章:

  • 2021-10-31
  • 2021-11-21
  • 2021-09-25
  • 2022-03-03
  • 2021-05-31
  • 2021-06-03
  • 2022-12-23
  • 2021-11-21
猜你喜欢
  • 2021-05-28
  • 2021-09-25
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-27
相关资源
相似解决方案