专栏首页python爱好部落搭建restful api后台

搭建restful api后台

作为一个修电脑的老家伙,有的时候要开发一个啥系统的,就需要搞定后台,后台老板要搞定,才有底气。

一般我们搞定接口,都是用restful API. rest 指的是一组架构约束条件和原则,提供了一个新的架构设计思路,满足这些约束条件和原则的应用程序或设计就是 RESTful

在REST规则中,有两个基础概念:对象、行为 对象就是我们要操作的对象,例如添加用户的操作,那么对象就是user 行为有4种常用的:查看、创建、编辑、删除

rest的提出者很巧妙的利用http现有方法来对应这4种行为: GET - 查看 POST - 创建 PUT - 编辑 DELETE - 删除

今天要讲的是rest_framework框架,它是基于Django的,帮助我们快速开发符合RESTful规范的接口框架。

我们先来说说序列化器这个东西。在rest_framework中,序列化器是一个位于客户端和后台之间的中间层。这个中间层一个最基本的作用就是接受前端JSON字符串转化为后台python可以识别的对象;从后台获取python对象然后转化为给前端的JSON格式字符串。当然如果它仅仅是这个作用的话那用json.dumps和json.loads差不多了。一个亮点在于序列化器可以定义一些字段,让进出的数据可以“一个萝卜一个坑”地填入序列化器,从而就可以方便地进行格式转化,顺便还可以做做数据校验这种工作。序列化器的另一个方便之处在于它可以和django的模型层进行互动,从而大幅度减少了编码量。下面我们来看看具体的序列化器

序列化器的类在rest_framework.serializers中,最基本的一个序列化器类是Serializer。

我们通过继承Serializer类定义自己的序列化器类。通常在类中需要指出本序列化器所有需要进行处理的字段名和字段类型,看起来有点像在定义一个Model或者一个Form。

OK, 开战吧。 先准备环境,安装django和djangorestframework

pip install django
pip install djangorestframework

建一个项目:

django-admin startproject xxx
cd xxx
python manage.py startapp yyy

项目建好后,改配置:

INSTALLED_APPS = [
    ...
    'bb',
    'rest_framework'
]

文件末尾增加如下REST_FRAMWORK配置, 以使Api权限生效

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly',
    ]
}

安装好mysql后,就可以:

mysql -u root -p
show databases;

为Django项目创建数据库

create database rouboinfo default charset utf8 collate utf8_general_ci;

项目里面数据库的信息也要改 默认是:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

改成:

    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'rouboinfo',
        'USER': 'root',
        'PASSWORD': 'root',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }

初始化数据库

python manage.py makemigrations
python manage.py migrate

定义数据库表。 这里我们只演示一个记录设备启动次数的api接口所需的基本字段。

from django.db import models

class DeviceReport(models.Model):
    """
    收集设备相关的统计数据
    report_id
        自增id作为主键
    report_type
        上报类型,比如启动上报:open
    report_time
        上报时间戳
    device_id
        可以描述设备的id
    ip_address
        公网ip地址
    """
    report_id = models.IntegerField(primary_key=True)
    report_type = models.CharField(max_length=100)
    report_time = models.DateTimeField(auto_now_add=True)
    device_id = models.CharField(max_length=200)
    ip_address = models.CharField(max_length=50)

在每次修改model之后,都需要进行迁移和生效动作,毕竟我们修改了数据库结构了。

python manage.py makemigrations
python manage.py migrate

执行成功后,会生成rouboapi_devicereport的表。 然后做接口: 实现序列化器 我们使用Django REST framework 提供的序列化器简化代码。

在项里面建一个api文件夹 建立Serializers.py文件

from rest_framework import serializers
from ..models import DeviceReport

 #class DeviceReportSerializer(serializers.HyperlinkedModelSerializer):
     """
     序列化上报接口数据

 #class Meta:
 #    model = DeviceReport
 #    fields = ('report_id', 'report_type', 'report_time', 'device_id', 'ip_address')

class DeviceReportSerializer(serializers.ModelSerializer):
    class Meta:
        model = DeviceReport  # 要序列化的模型
        fields = '__all__'  # 要序列化的字段

建立views.py

from rest_framework import generics
from .serializers import DeviceReportSerializer
from ..models import DeviceReport


class DeviceReportlist(generics.ListCreateAPIView):
    queryset = DeviceReport.objects.all()
    serializer_class = DeviceReportSerializer


class DeviceReportDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = DeviceReport.objects.all()
    serializer_class = DeviceReportSerializer

建立url文件

from django.urls import path
from . import views

app_name = 'bb'   # 指定命名空间

urlpatterns = [
    path('report/', views.DeviceReportlist.as_view(), name='report_list'),
    path('report/<pk>/', views.DeviceReportDetail.as_view(), name='report_list_detail'),
    ]

然后配置项目路由:

from django.contrib import admin
from django.urls import path, include
from rest_framework.documentation import include_docs_urls

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/bb/', include('bb.api.urls', namespace='bb')),

就可以运行起来了:

python manage.py runserver

浏览器中输入:http://localhost:8000/api/bb/report/

建立一个用户登陆,就可以操作了

python manage.py createsuperuser

不建立一个用户,是无权限操作的。 登陆后就可以看到操作按钮了

查询下数据库,就有结果了:

然后加上文档:

from django.contrib import admin
from django.urls import path, include
from rest_framework.documentation import include_docs_urls

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/bb/', include('bb.api.urls', namespace='bb')),
    path('docs/', include_docs_urls(title='文档')),
]

http://localhost:8000/docs/

本文分享自微信公众号 - python爱好部落(lovesweet2018),作者:Snake

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 别再@官方啦,10行代码给自己头像加国旗

    在日常生活中,我们需要处理图片的地方有很多,像这次是加国旗,下次可能就是加个圣诞帽。不会PS怎么办,万能的python可以搞定一切。

    赵云龙龙
  • 基本算法之-递归

    俗话说,大事化小。递归算法也是分治的思想。我国古代的愚公移山,就是这种递归。子又生孙,孙又生子。

    赵云龙龙
  • golang常用的http请求操作

    Golang诞生已经超过十个年头了,发展得愈发完善,其简单方便的协程并发机制使得其在爬虫领域有着一定的天赋。

    赵云龙龙
  • MySQL 8.0发布了,来看看针对SQL有哪些新功能?

    据官方称,此次发布意味着MySQL从此兼顾NoSQL和SQL于一身。NoSQL+SQL=MySQL。

    ImportSource
  • 从游戏AI到自动驾驶,一文看懂强化学习的概念及应用

    强化学习(Reinforcement Learning,简称RL,又译为“增强学习”)这一名词来源于行为心理学,表示生物为了趋利避害而更频繁实施对自己有利的策略...

    华章科技
  • 如何使用统计显着性检验来解释机器学习结果

    在比较两种不同的机器学习算法或比较相同的算法与不同的配置时,收集一组结果是一个好习惯。

    老人雨何
  • 拍照时怎样摆姿势好看?前端玩转AI之posenet指南

    我们在网上可以看到大量优秀的摄影作品,如何利用机器从网上获取大量的图片,从中提取出最佳的摆拍姿势供拍照时参考?首先我们得有大量的优秀摄影图片。然后,需要思考如何...

    mixlab
  • Task之管道

    很多OS都会提供一种进程通信机制:管道。VxWorks也提供了管道 - Pipe,而且可以用于任务间通信

    Taishan3721
  • AI工程师应聘要具备哪些能力?

    IT派 - {技术青年圈} 持续关注互联网、大数据、人工智能领域 作者|洪亮劼 出处|极客时间专栏《AI 技术内参》 洪亮劼,电子商务平台 Etsy 的数据科...

    IT派
  • 五年Python程序员平时学习笔记总结

    像list, tuple等这些序列是可以使用for...in ...语句来进行遍历输出的。这是为什么呢?这就需要知道可迭代对象(Iterable)、迭代器对象(...

    python学习教程

扫码关注云+社区

领取腾讯云代金券