关于rest
rest:representational state transfer 表述性状态转移
rest原则:
<1> 网络上的所有事物都可以被抽象为资源
<2> 米格资源都有一个唯一的资源标识符
<3> 同一个资源具有多种表现形式(xml,json等)
<4> 对资源的各种操作不会改变资源标识符
<5> 所有的操作都是无状态的
restful
restful:遵循了rest原则的web服务
restul是由rest派生出来的
用法:
在Restful之前的操作:
http://127.0.0.1/user/query/1 GET 根据用户id查询用户数据
http://127.0.0.1/user/save POST 新增用户
http://127.0.0.1/user/update POST 修改用户信息
http://127.0.0.1/user/delete GET/POST 删除用户信息
RESTful用法:
http://127.0.0.1/user/1 GET 根据用户id查询用户数据
http://127.0.0.1/user POST 新增用户
http://127.0.0.1/user PUT 修改用户信息
http://127.0.0.1/user DELETE 删除用户信息
restful API设计
-
API与用户通信的协议,总是使用HTTPS协议
-
版本:URL:https://api.example.com/v1
-
路径:定位网络上的唯一资源,均使用名词
https://api.examole.com/v1/zoos https://api.example.com/v1/animals
-
method
- GET 从服务器获取资源
- POST 在服务器上创建一个资源
- PUT 更新服务器上的资源
- PATCH 更新服务器资源(如果更新某几列,则用这个方法;上面的是更新全部数据)
- DELETE 删除某个资源
-
过滤
- https://api.example.com/v1/zoos?limit=10 : 指定返回记录的数量
- https://api.example.com/v1/zoos?offset=10 : 指定返回记录的开始位置
- https://api.example.com/v1/zoos?page=2&per_page=100 : 指定第几页,以及每页的记录数
- https://api.example.com/v1/zoos?sortby=name&order=asc : 指定返回结果按照哪个属性排序,以及排序顺序
- https://api.examle.com/v1/aoos?animal_type_id=1 :指定筛选条件
Django rest_framework
- 安装依赖 (Python2.7 Django1.8.11 rest_framework3.4.4)
- 创建项目和应用(django-admin startproject(startapp) (name) 这里先建立项目再建立应用
- 配置项目
- 配置settings文件
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'application', # app 名称
'rest_framework' # 添加rest_framework
)
REST_FRAMEWORK = {
# Use Django's standard `django.contrib.auth` permissions,
# or allow read-only access for unauthenticated users.
# 'PAGE_SIZE': 1,#每页数量
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
]
}
# 配置数据库
import pymysql
pymysql.install_as_MySQLdb()
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'application',
'USER': 'root',
'PASSWORD': 'root',
'PORT': '3306'
}
}
- 配置urls文件
配置相关的路由
- 编写models
# -*- coding:utf-8 -*-
from django.db import models
# Create your models here.
class UserInfo(models.Model):
name = models.CharField(verbose_name=u'姓名', max_length=100)
# 0 男;1 女;2 其他
sex = models.SmallIntegerField(verbose_name=u'性别')
age = models.IntegerField(verbose_name=u"年龄")
hobby = models.CharField(verbose_name=u"爱好", max_length=200)
email = models.EmailField(verbose_name=u'邮箱')
phone = models.IntegerField(verbose_name=u"电话")
username = models.CharField(verbose_name=u'账号', max_length=200)
paasword = models.CharField(verbose_name=u'密码', max_length=200)
safe_code = models.CharField(verbose_name=u'安全码', max_length=200)
class Meta:
verbose_name = u'用户表'
db_table = 'user_info'
- 创建serializer类
在app根目录下创建serializer.py文件
class UserInfoSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = UserInfo
fields = ('name', 'sex', 'age', 'hobby', 'email', 'phone', 'username', 'safe_code')
name = serializers.CharField(max_length=200)
sex = serializers.IntegerField()
age = serializers.IntegerField()
hobby = serializers.CharField(max_length=200)
email = serializers.EmailField()
phone = serializers.IntegerField()
username = serializers.CharField(max_length=200)
# password = serializers.CharField(max_length=200)
safe_code = serializers.CharField(max_length=200)
def create(self, validated_data):
return UserInfo.objects.create(**validated_data)
def update(self, instance, validated_data):
instance.name = validated_data.get('name', instance.name)
instance.sex = validated_data.get('sex', instance.sex)
instance.age = validated_data.get('age', instance.age)
instance.hobby = validated_data.get('hobby', instance.hobby)
instance.email = validated_data.get('email', instance.email)
instance.phone = validated_data.get('phone', instance.phone)
instance.username = validated_data.get('username', instance.username)
# instance.password = validated_data.get('password', instance.password)
instance.safe_code = validated_data.get('safe_code', instance.safe_code)
instance.save()
return instance
# -*- coding:utf-8 -*-
from application.models import UserInfo
from application.serializers import UserInfoSerializer
from rest_framework import generics
# V1.0
class UserInfoList(generics.ListCreateAPIView):
queryset = UserInfo.objects.all()
serializer_class = UserInfoSerializer
class UserInfoDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = UserInfo.objects.all()
serializer_class = UserInfoSerializer
# V2.0
from rest_framework.viewsets import ModelViewSet
class UsersInfoView(ModelViewSet):
queryset = UserInfo.objects.all()
serializer_class = UserInfoSerializer
# -*- coding:utf-8 -*-
from rest_framework import routers
from django.conf.urls import patterns, include, url
from application import views
router = routers.SimpleRouter()
urlpatterns = patterns(
url(r'^', include(router.urls)),
url(r'^user_list/$', views.UserInfoList.as_view()),
url(r'^user_info/(?P<pk>[0-9]+)/$', views.UserInfoDetail.as_view()),
url(r'^users/$', views.UsersInfoView.as_view({"get": "list", "post": "create"})),
url(r'^users/(?P<pk>[0-9]+)/$', views.UsersInfoView.as_view({"put": "update", "delete": "destroy", "get": "retrieve"})),
)