Django RESTful api
相关站点
Django+RestFramework实现API接口及接口文档并返回json数据
代码 https://github.com/xingjidemimi/DjangoAPI 感觉不错
pre
REST framework requires the following:
Django (4.2, 5.0) Python (3.8, 3.9, 3.10, 3.11, 3.12)
https://www.django-rest-framework.org/#requirements
知识点
RESTful API现在很流行,这里是它的介绍 理解RESTful架构 和 RESTful API设计指南. 按照Django的常规方法当然也可以实现REST,但有一种更快捷、强大的方法,那就是 Django REST framework.它是python的一个模块,通过在Django里面配置就可以把app的models中的各个表实现RESTful API
序列化
什么是序列化?序列化有什么作用? django 为什么要序列化-非常好的教程
Django实战003:为什么使用Serializer序列化器 有空要细细操作品味一下
Python类型数据序列化(serialization)
每种编程语言都有各自的数据类型, 将属于自己语言的数据类型或对象转换为可通过网络传输或可以存储到本地磁盘的数据格式(如:XML、JSON或特定格式的字节串)的过程称为序列化(seralization);反之则称为反序列化。API开发的本质就是各种后端语言的自己的数据类型序列化为通用的可读可传输的数据格式,比如常见的JSON类型数据。
过滤信息(Filtering)
如果记录数量很多,服务器不可能都将它们返回给用户。符合RESTful规范的API应该支持过滤。下面是一些常见的过滤参数。
on django
Django中的序列化主要应用在将数据库中检索的数据返回给客户端用户,特别的Ajax请求一般返回的为Json格式
on python
为什么要序列化
我们把变量从内存中变成可存储或传输的过程称之为序列化
在程序运行的过程中,所有的变量都是在内存中,比如,定义一个dict:
d = dict(name='Bob', age=20, score=88)
可以随时修改变量,比如把name改成'Bill',但是一旦程序结束,变量所占用的内存就被操作系统全部回收。如果没有把修改后的'Bill'存储到磁盘上,下次重新运行程序,变量又被初始化为'Bob'。
我们把变量从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思。
序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。
反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。 Python提供了pickle模块来实现序列化。
In [1]: import pickle
In [2]: d=dict(name='bob',age=20,score=88)
In [3]: pickle.dumps(d)
Out[3]: b'\x80\x04\x95$\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x03bob\x94\x8c\x03age\x94K\x14\x8c\x05score\x94KXu.'
In [5]: import json
In [6]: json.dumps(d)
Out[6]: '{"name": "bob", "age": 20, "score": 88}'
小结
Python语言特定的序列化模块是pickle,但如果要把序列化搞得更通用、更符合Web标准,就可以使用json模块。
内存中的字典、列表、集合以及各种对象,如何保存到一个文件中。
设计一套协议,按照某种规则,把内存中的数据保存到文件中,文件是一个个字节序列。所以必须把数据额转换为字节序列,输出到文件,这就是序列化,反之,从文件的字节 序列恢复到内存中,就是反序列化。
1、定义
Serialization系列化,将内存中对象存储下来,把他变成一个个字节。二进制。
deSerialization反序列化,将文件的一个个字节到内存中。
序列化保存到文件就是持久化。
可将数据序列化后持久化,或者网络传输,也可以将文件中或者网络接受到的字节序列反序列化
django模型类序列化器 ModelSerializer
1. 定义
比如我们创建一个BookInfoSerializer
class BookInfoSerializer(serializers.ModelSerializer):
"""图书数据序列化器"""
class Meta:
model = BookInfo
fields = '__all__'
model 指明参照哪个模型类
fields 指明为模型类的哪些字段生成
2. 指定字段
1) 使用fields来明确字段,__all__表名包含所有字段,也可以写明具体哪些字段,如
class BookInfoSerializer(serializers.ModelSerializer):
"""图书数据序列化器"""
class Meta:
model = BookInfo
fields = ('id', 'btitle', 'bpub_date')
2) 使用exclude可以明确排除掉哪些字段
class BookInfoSerializer(serializers.ModelSerializer):
"""图书数据序列化器"""
class Meta:
model = BookInfo
exclude = ('image',)
eg
class BookModelSerializer(serializers.ModelSerializer):
class Meta: # 写一个内部类
model=models.Book # 该序列化类跟哪个表建立关系
fields = ['id','title'] # 序列化哪些字段
# fields = '__all__' # 序列化全部字段
过程
install
pip3 install djangorestframework #Django REST Framework pip3 install markdown # Markdown support for the browsable API. pip3 install django-filter # Filtering support
创建API
python3 manage.py startapp api #当然 得先创建项目
setting.py 添加
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'api',
]
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
)
}
数据库迁移
python3 manage.py makemigrations
python3 manage.py migrate
用我以前创建的可以用
创建数据
点击主页右上角的Log in登录超级管理员账户,然后分别创建Group和User数据
创建用户和组在这里
HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
{
"users": "http://127.0.0.1:8000/users/?format=api",
"groups": "http://127.0.0.1:8000/groups/?format=api"
}
files
# 接下来需要做的就是创建 Serializer 类,类似于 Form。它的作用就是从你传入的参数中提取出你需要的数据,并把它转化为 json 格式(注意,已经是字节码了),同时支持反序列化到model对象。在 snippets 文件夹中添加 serializers.py 并在其添加如下:
# on api/serializers.py
from django.contrib.auth.models import User,Group
from rest_framework import serializers
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model=User
fields=('url','username','email','groups')
class GroupSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model=Group
fields=('url','name')
解说
from rest_framework import serializers
from app01 import models
class BookModelSerializer(serializers.ModelSerializer):
class Meta: # 写一个内部类
model=models.Book # 该序列化类跟哪个表建立关系
fields = ['id','title'] # 序列化哪些字段
# fields = '__all__' # 序列化全部字段
#视图 on api/views.py
from django.shortcuts import render
from django.contrib.auth.models import User,Group
from rest_framework import viewsets
from api.serializers import UserSerializer,GroupSerializer
# Create your views here.
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
class GroupViewSet(viewsets.ModelViewSet):
queryset = Group.objects.all()
serializer_class = GroupSerializer
# Create your views here.
#URL路由配置 项目名下的 /urls.py
from django.contrib import admin
from django.urls import path
from django.conf.urls import include
from rest_framework import routers
from api import views
router=routers.DefaultRouter()
router.register(r'users',views.UserViewSet)
router.register(r'groups',views.GroupViewSet)
urlpatterns = [
path('admin/', admin.site.urls),
path('',include(router.urls)),
path('api-auth/',include('rest_framework.urls',namespace='rest_framework')),
]
数据可视化图形展示pyecharts
troubleshooting
troubleshooting
ModuleNotFoundError: No module named 'tutorial.quickstart'
加上project nmae 有错呀
urls.py
from quickstart import views
# from tutorail.quickstart import views
views.py
from quickstart.serializers import UserSerializer, GroupSerializer
from tutorial.quickstart.serializers import UserSerializer, GroupSerializer
INSTALLED_APPS = [
...
'rest_framework',
'quickstart',
官方参考 文档 https://www.django-rest-framework.org/tutorial/quickstart/#project-setup
2024
django-admin startproject tutorial1 . # Note the trailing '.' character cd tutorial1 django-admin startapp quickstart cd ..
代码
github/django/drf/tutorial1
参考官方 文档 https://www.django-rest-framework.org/tutorial/quickstart/
应该是另外一个例子
Django REST Framework教程(1): 为什么要学习DRF, 什么是序列化和RESTful的API
Django+RestFramework实现API接口及接口文档并返回json数据
这种接口可能和得少 不过学习还是有用的 note
- on urls.py
from django.urls import path, include
那个views_api 我放到views on apps(django_web)
如何借助 Django 来编写一个 Python Web API 其实就是官方restful