新建一个restapi项目,然后配置好数据库,添加一个index路由用来测试项目。
restful API接口
传输数据使用json,以为着返回数据也为json,并且开头尽量以api开头,或者以api为域名。
新建api应用
python manage.py startapp api
新建api应用
在api应用内新建urls.py:
from django.conf.urls import url
from api import views
urlpatterns = [
url(r'^$', views.index, name='index'),
]
views:
from django.http import JsonResponse
from django.shortcuts import render
def index(request):
# json数据使用字典
data = {
'status': 200,
'msg': 'ok',
}
return JsonResponse(data=data)
注册urls.py:
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^app/', include('App.urls', namespace='app')),
url(r'^api/', include('api.urls', namespace='api')),
]
api中models.py中建立模型(迁移应用模型,需要在settiongs中注册):
from django.db import models
class Book(models.Model):
b_name = models.CharField(max_length=32)
b_price = models.FloatField(default=1)
api中的urls添加book路由:
from django.conf.urls import url
from api import views
urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'books/', views.book, name='books'),
]
views中:
我们对书有如下操作:
- 获取书的列表(get)
- 创建一本书(post)
创建一本书,我们需要从用户的post请求中提取书的信息,然后创建模型存储,然后返回书的字典信息,但是这里django和flask将模型转化成字典信息比较麻烦,需要在models.py中定义方法去返回
models.py:
from django.db import models
class Book(models.Model):
b_name = models.CharField(max_length=32)
b_price = models.FloatField(default=1)
def to_dict(self):
return {'id': self.id, 'b_name': self.b_name, 'b_price': self.b_price}
views:
from django.http import JsonResponse
from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt
from api.models import Book
def index(request):
# json数据使用字典
data = {
'status': 200,
'msg': 'ok',
}
return JsonResponse(data=data)
@csrf_exempt
def book(request):
if request.method == 'GET':
pass
elif request.method == 'POST': # 创建一本书
# 从前端获取POST请求中的书名,价钱
b_name = request.POST.get('b_name')
b_price = request.POST.get('b_price')
# 获取完信息之后,新建Book对象进行存储
book = Book()
book.b_name = b_name
book.b_price = b_price
book.save()
# 然后返回json数据,这里比较麻烦的是将模型变成字典数据
data = {
'status': 201,
'mag': 'add success',
'data': book.to_dict()
}
return JsonResponse(data=data)
接下来我们使用测试rest请求的工具——TEST RESTful Web Server:
我们也可以用浏览器中的插件postman的来测试:
类似的工具还有httpie
获取所有的书
views:
if request.method == 'GET':
books_list = Book.objects.all() # 这个只是一个查询集,不符合json的格式
books_list_json = [] # 将查询集转化成列表
for book in books_list:
books_list_json.append(book.to_dict())
data = {
'status': 200,
'msg': 'ok',
'data': books_list_json
}
return JsonResponse(data=data)
查询单个的书
url:
urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^books/&', views.books, name='books'),
url(r'^books/(?P<bookid>\d+)/', views.book, name='book'),
]
views:
@csrf_exempt
def book(request, bookid):
if request.method == 'GET':
book_obj = Book.objects.get(pk=bookid)
data = {
'msg': 'ok',
'status': 200,
'data': book_obj.to_dict()
}
return JsonResponse(data=data)
测试:
删除一本书
views:
@csrf_exempt
def book(request, bookid):
if request.method == 'GET':
book_obj = Book.objects.get(pk=bookid)
data = {
'msg': 'ok',
'status': 200,
'data': book_obj.to_dict()
}
return JsonResponse(data=data)
elif request.method == 'DELETE':
book_obj = Book.objects.get(pk=bookid)
book_obj.delete()
data = {
'msg': 'delete success',
'status': 204,
'data': {}
}
return JsonResponse(data=data)
此处评论已关闭