我想用Django REST框架来创建一个ToDo应用程序
我将使用Django REST framework创建一个简单的TODO应用。
创建应用程序的特点
- 
- TODOの作成/完了を管理するシングルページアプリ
 
- 
- SQLite3にTODOを保管
 
- 
- Django REST frameworkを使用
 
- RESTfulなAPIを作成
环境和版本:
Windows 7
Python 3.4.3
Django 1.8.2
Django REST框架 3.1.2
成果物是https://github.com/koji-ohki-1974/django-rest-todo。
准备
假设Python和Django已经安装好。
在Python中引入Django REST框架。
执行以下命令,安装Django REST框架。
pip install djangorestframework
创建项目
在任意的文件夹中创建Django项目。执行以下命令。
django-admin.py startproject django_rest_todo
建立数据库
初始化数据库并创建超级用户。
cd django_rest_todo
python manage.py migrate
python manage.py createsuperuser
设定超级用户的ID、电子邮件地址和密码。
启动和确认服务器的运行
执行以下命令。
python manage.py runserver
打开浏览器,并访问http://localhost:8000/。
如果项目成功创建,则会显示一个名为”It worked!”的页面。
使用「CTRL + C」来关闭服务器。
创建应用程序
在项目文件夹中运行下面的命令来创建应用程序。
cd django_rest_todo
django-admin.py startapp api
我将更改项目设置。将”settings.py”文件按照以下方式进行修改。
INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'django_rest_todo.api',
)
MIDDLEWARE_CLASSES = (
#  'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
#  'django.middleware.csrf.CsrfViewMiddleware',
#  'django.contrib.auth.middleware.AuthenticationMiddleware',
#  'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
#  'django.contrib.messages.middleware.MessageMiddleware',
#  'django.middleware.clickjacking.XFrameOptionsMiddleware',
#  'django.middleware.security.SecurityMiddleware',
)
创建 API
任务模型
在 “api/models.py” 文件中,我们定义了 Todo 的模型,并添加了一个 Todo 类。
from django.db import models
class Todo(models.Model):
    text = models.TextField()
一旦模型的定义完成后,将其映射到数据库中并执行以下命令。
cd ..
python manage.py makemigrations api
python manage.py sqlmigrate api 0001
python manage.py migrate
创建序列化器
创建一个将模型映射到JSON的序列化器。在「api/serializers.py」中进行定义。
from .models import Todo
from rest_framework import serializers
class TodoSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Todo
        fields = ('id', 'text')
创建视图
我們將為REST創建一個視圖,並將TodoViewSet類添加到”api/views.py”中。
from rest_framework.viewsets import ModelViewSet
from .models import Todo
from .serializers import TodoSerializer
class TodoViewSet(ModelViewSet):
    queryset = Todo.objects.all()
    serializer_class = TodoSerializer
API 路由
我们将进行路由配置,以便处理API请求。
请修改「urls.py」文件。
from django.conf.urls import include, url
from rest_framework.routers import DefaultRouter
from .api import views
router = DefaultRouter()
router.register(r'todos', views.TodoViewSet)
urlpatterns = [
    url(r'^api/', include(router.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]
启动服务器并确认其运行情况。
我们将再次启动服务器并对API进行操作确认。执行以下命令。
python manage.py runserver
打开浏览器并访问以下网址。
http://本地主机:8000/接口/
http://本地主机:8000/接口/待办事项/
使用「CTRL + C」来关闭服务器。
创建前端
靜態文件
请设置静态文件(.html和.js)的存放位置。编辑“settings.py”文件,并添加以下内容。
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
)
创建「static」文件夹。
mkdir static
HTML文件
我們將創建一個 ToDo 清單畫面。請創建「static/index.html」文件。
<!doctype html>
<html ng-app="djangoTodo">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Django REST framework Todo App</title>
    <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css">
    <style>
        html                    { overflow-y:scroll; }
        body                    { padding-top:50px; }
        #todo-list              { margin-bottom:30px; }
    </style>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.min.js"></script>
    <script src="core.js"></script>
</head>
<body ng-controller="mainController">
    <div class="container">
        <div class="jumbotron text-center">
            <h1>Todoリスト <span class="label label-info">{{ todos.length }}</span></h1>
        </div>
        <div id="todo-list" class="row">
            <div class="col-sm-4 col-sm-offset-4">
                <div class="checkbox" ng-repeat="todo in todos">
                    <label>
                        <input type="checkbox" ng-click="deleteTodo(todo.id)"> {{ todo.text }}
                    </label>
                </div>
            </div>
        </div>
        <div id="todo-form" class="row">
            <div class="col-sm-8 col-sm-offset-2 text-center">
                <form>
                    <div class="form-group">
                        <input type="text" class="form-control input-lg text-center" placeholder="Todoを入力してください" ng-model="formData.text">
                    </div>
                    <button type="submit" class="btn btn-primary btn-lg" ng-click="createTodo()">追加</button>
                </form>
            </div>
        </div>
    </div>
</body>
</html>
JavaScript文件
使用JavaScript编写调用API的代码。创建”static/core.js”文件。
var djangoTodo = angular.module('djangoTodo', []);
function mainController($scope, $http) {
    $scope.readTodos = function() {
        $http.get('/api/todos/')
            .success(function(data) {
                $scope.formData = {};
                $scope.todos = data;
                console.log(data);
            })
            .error(function(data) {
                console.log('Error: ' + data);
            });
    };
    $scope.createTodo = function() {
        $http.post('/api/todos/', $scope.formData)
            .success(function(data) {
                console.log(data);
                $scope.readTodos();
            })
            .error(function(data) {
                console.log('Error: ' + data);
            });
    };
    $scope.deleteTodo = function(id) {
        $http.delete('/api/todos/' + id + '/')
            .success(function(data) {
                console.log(data);
                $scope.readTodos();
            })
            .error(function(data) {
                console.log('Error: ' + data);
            });
    };
    $scope.readTodos();
}
重定向
将对首页「/」的请求重定向到「static/index.html」上,需进行「urls.py」的更改设置。
from django.conf.urls import include, url
from django.views.generic import RedirectView
from rest_framework.routers import DefaultRouter
from .api import views
router = DefaultRouter()
router.register(r'todos', views.TodoViewSet)
urlpatterns = [
    url(r'^api/', include(router.urls)),
    url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    url('', RedirectView.as_view(url='/static/index.html')),
]
确认行动
服务器的启动和运行确认
开始启动服务器。
python manage.py runserver
打开浏览器并访问http://localhost:8000/。
如果能够显示待办事项清单,则任务完成。
 
    