django中的开发接口有两种模式FBV和CBV,分别是基于函数视图和基于类视图,详细的可以看看菜鸟教程的Django 视图 - FBV 与 CBV,由于本文的用户管理是一个
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 path
from usermanage import views
urlpatterns = [
path('admin/', admin.site.urls),
path('user/', views.UsersView.as_view()),
path('user//', 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 jsonfrom 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 jsonfrom 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)