RESTFull 的 Django

最近为了升级曾经用Django做的网站,决定升级修改下架构,而且在当今Rest风格API的架构正在一步步的渗透到各个公司的API设计中,那Django这个框架呢?当然也会例外。

现在现在以相对比较好用的rest framework做个demo:

环境:ubuntu, mysql, python, django, django-rest-framework

安装django

(env)[email protected]:/usr/local$pip install django
Downloading/unpackingdjango
  Downloading Django-1.9.8-py2.py3-none-any.whl(6.6MB): 6.6MB downloaded
Installing collectedpackages: django
Successfullyinstalled django
Cleaning up...

安装djangorestframework

(env)[email protected]:/usr/local$pip install djangorestframework
Downloading/unpackingdjangorestframework
 
 Downloadingdjangorestframework-3.4.1-py2.py3-none-any.whl (705kB):   
0% 4.1k  Downloading 
djangorestframework-3.4.1-py2.py3-none-any.whl(705kB):   1%  
8.2k Downloading djangorestframework-3.4.1-py2.py3-none-any.whl 
(705kB):   1% 12kB
………..
loaded
Installing collectedpackages: djangorestframework
Successfullyinstalled djangorestframework
Cleaning up...
(env)[email protected]:/usr/local$

安装MySqL:

(env)[email protected]:/usr/local$sudo apt-get install mysql-server
Reading packagelists... Done
Building dependencytree      
Reading stateinformation... Done
The following extrapackages will be installed:
  libdbd-mysql-perl libdbi-perllibhtml-template-perl libmysqlclient18
  libterm-readkey-perl mysql-client-5.5mysql-client-core-5.5 mysql-common
  mysql-server-5.5 mysql-server-core-5.5
Suggested packages:
  libmldbm-perl libnet-daemon-perllibplrpc-perl libsql-statement-perl
  libipc-sharedcache-perl tinyca mailx
The following NEWpackages will be installed:
  libdbd-mysql-perl libdbi-perllibhtml-template-perl libmysqlclient18
  libterm-readkey-perl mysql-client-5.5mysql-client-core-5.5 mysql-common
  mysql-server mysql-server-5.5mysql-server-core-5.5
0 upgraded, 11 newlyinstalled, 0 to remove and 24 not upgraded.
Need to get 99.3kB/9,594 kB of archives.
After thisoperation, 97.1 MB of additional disk space will be used.

安装成功后验证

(env)[email protected]:/usr/local$mysql -uroot -p
Enter password:
Welcome to the MySQLmonitor.  Commands end with ; or \g.
Your MySQLconnection id is 44
Server version:5.5.50-0ubuntu0.14.04.1 (Ubuntu)
 
Copyright (c) 2000,2016, Oracle and/or its affiliates. All rights reserved.
 
Oracle is aregistered trademark of Oracle Corporation and/or its
affiliates. Othernames may be trademarks of their respective
owners.
 
Type ‘help;‘ or ‘\h‘for help. Type ‘\c‘ to clear the current input statement.
 
mysql>

在开始创建项目之前,我们用virtualenv先搭建一个新的环境,这样会确保我们的包配置很好的从正在工作的其他项目中隔离:

virtualenv env
source env/bin/activate

在任何时候想要退出虚拟环境,只需要输入:

deactivate

安装环境

pip install djangorestframework
pip install markdown       # Markdown:为了可以浏览的 API.
pip install django-filter  # Filtering:过滤器

现在开始创建项目

django-admin.py startproject resttest

创建Web API.

cd resttest
python manage.py startapp testapi
cd ..

第一次同步数据库

(env)[email protected]:/usr/local/resttest$python manage.py migrate
Operations toperform:
  Apply all migrations: admin, contenttypes,auth, sessions
Running migrations:
  Rendering model states... DONE
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applyingadmin.0002_logentry_remove_auto_add... OK
  Applyingcontenttypes.0002_remove_content_type_name... OK
  Applyingauth.0002_alter_permission_name_max_length... OK
  Applyingauth.0003_alter_user_email_max_length... OK
  Applyingauth.0004_alter_user_username_opts... OK
  Applyingauth.0005_alter_user_last_login_null... OK
  Applyingauth.0006_require_contenttypes_0002... OK
  Applyingauth.0007_alter_validators_add_error_messages... OK
  Applying sessions.0001_initial... OK
(env)[email protected]:/usr/local/resttest$

为我们的项目初始化一个管理员:

(env)[email protected]:/usr/local/resttest$python manage.py createsuperuser
Username (leaveblank to use ‘lybing‘): 
Email address:[email protected]
Password:
Password (again):
Superuser createdsuccessfully.
(env)[email protected]:/usr/local/resttest$

Serializers - 数据的展示模块: resttest/testapi/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‘)

备注:这里我们使用hyperlinked关联,同样你可以用主键或其他各种其他关系,但是hyperlinking是一个很好的RESTful设计

Views : resttest/testapi/views.py

from django.contrib.auth.models import User, Group
from rest_framework import viewsets
from  testapi.serializers import UserSerializer, GroupSerializer

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all().order_by(‘-date_joined‘)
    serializer_class = UserSerializer

class GroupViewSet(viewsets.ModelViewSet):
    queryset = Group.objects.all()
    serializer_class = GroupSerializer

与其写多个view倒不如将一些有相同行为的view分组叫ViewSets,如果有需有需要,我们可以很容易的拆成单独的view,但是使用viewsets保持view逻辑便于组织也非常简明.

配置API Url:resttest/urls.py

from django.conf.urls import url, include
from rest_framework import routers
from testapi import views

router = routers.DefaultRouter()
router.register(r‘users‘, views.UserViewSet)
router.register(r‘groups‘, views.GroupViewSet)

# 用自动url路由来连接我们的API
# 另外,包含我们登录用的可浏览的API的url
urlpatterns = [
    url(r‘^‘, include(router.urls)),
    url(r‘^api-auth/‘, include(‘rest_framework.urls‘, namespace=‘rest_framework‘))
]

设置:resttest/settings.py

INSTALLED_APPS = (
    ...
    ‘rest_framework‘,
)
REST_FRAMEWORK = {
    ‘DEFAULT_PERMISSION_CLASSES‘:(‘rest_framework.permissions.IsAdminUser‘,),
    ‘PAGE_SIZE‘: 10
}

启动服务端测试

python manage.py runserver

未登录的页面

点击右上角的Log in登录,用户名和密码在是上面初始化的管理员

如要添加新的用户则可以在下面输入数据,直接点击Post即可

时间: 2024-11-08 18:59:17

RESTFull 的 Django的相关文章

Django restfull规范

一. 什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为"表征状态转移" REST从资源的角度类审视整个网络,它将分布在网络中某个节点的资源通过URL进行标识,客户端应用通过URL来获取资源的表征,获得这些表征致使这些应用转变状态 REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为"表

实践:Backbone作前端,Django+Tastypie作后端的简单Web在线聊天室

一.界面设计: 二.数据模型设计 id 每个发言都有一个独立的id由tastypie自动生成 content 发言的内容 username 发言者 date 发言时间 三.前端制作 这里没有用到Backbone的Router,因为这里不需要记录hash记录 1.Div+CSS制作静态页面,这里item-template为每一个发言的模版 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <

一个简单的数据增量更新策略(Android / MongoDB / Django)

我在做个人APP - CayKANJI - 的时候遇到一个问题: 怎样增量式地把日语汉字数据地从服务器更新到APP端,即每次用户执行更新操作时,只获取版本高于本地缓存的内容. 数据格式 为了能够与mongoDB无缝结合,并省去编写后台代码的麻烦,索性就把汉字数据保存成json文件,上传到服务器后,交给web应用去读取并写入数据库. 汉字文件就是普通的json格式. { "category": "行為ー2", "contents": [ { &qu

Python开发WebService:REST,web.py,eurasia,Django

Python开发WebService:REST,web.py,eurasia,Django 博客分类: Python PythonRESTWebWebServiceDjango 对于今天的WebService开发,我们至少有两种选择:SOAP/WSDL/UDDI系列的: REST风格架构系列的 !!! 在Bioinformatics(生物信息学)领域,WebService是很重要的一种数据交换技术,未来必将更加重要.目前EBI所提供的WebService就分别有SOAP和REST两种方式的服务,

python后端面试第四部分:django框架--长期维护

##################    Python语法基础        ####################### django框架部分 1,流程 2,admin 3,视图 3,路由 4,csrf 3.csrf是什么?django是如何防范的? django请求的生命周期, 浏览器-wsgi-中间件-路由-视图-然后处理数据等,返回数据 3,什么是wsgi?是一个协议,还有一些需要理解, 4,中间件是什么?在视图之前定制一些操作, 5,使用中间件做什么?做过什么认证,权限,跨域,等,

Django面试题汇总

1.django请求的生命周期? 1.wsgi,请求封装后交给web框架    2.中间件,对请求进行校验或者在请求对象中添加其他相关数据,    3.路由匹配,根据浏览器发送的不同url去匹配不同的视图函数    4.视图函数,在视图函数中进行业务逻辑的处理    5.中间件,对响应的数据进行处理    6.wsgi,将响应的内容发送给浏览器 2.列举django中间件的5个方法?以及django中间件的应用场景? 1.process_request        接收到客户端信息后立即执行,

Django url 标签和reverse()函数的使用(转)

原文:http://www.yihaomen.com/article/python/355.htm 使用url标签和reverse()函数,可以避免在模板和view中对url进行硬编码,这样即使url改变了,对模板和view也没有影响 起初用django 开发应用的时候,完全是在urls.py 中硬编码配置地址,在views.py中HttpResponseRedirect()也是硬编码转向地址,当然在template 中也是一样了,这样带来一个问题,如果在urls.py 中修改了某个页面的地址,

利用 Django REST framework 编写 RESTful API

利用 Django REST framework 编写 RESTful API Updateat 2015/12/3: 增加 filter 最近在玩 Django,不得不说 rest_framework 真乃一大神器,可以轻易的甚至自动化的搞定很多事情,比如: 自动生成符合 RESTful 规范的 API 支持 OPTION.HEAD.POST.GET.PATCH.PUT.DELETE 根据 Content-Type 来动态的返回数据类型(如 text.json) 生成 browserable

Django(三) ORM 数据库操作

比较有用 转自 http://blog.csdn.net/fgf00/article/details/53678205 一.DjangoORM 创建基本类型及生成数据库表结构 1.简介 2.创建数据库 表结构 二.Django ORM基本增删改查 1.表数据增删改查 2.表结构修改 三.Django ORM 字段类型 1.字段类型介绍 2.字段参数介绍 3.Django ORM 外键操作 一.DjangoORM 创建基本类型及生成数据库表结构 1.简介 ORM:关系对象映射.定义一个类自动生成数