创建一个使用Django处理json的RESTful API

安装Django

    pipを使う場合
$ pip install django
    Anacondaを導入している場合
$ conda install django

我们应该现在可以使用django-admin命令了,请尝试验证一下。

$ django-admin --version

版本回来了就成功了

创建项目

我要移动到想要创建项目的目录。

$ cd projectfolder

使用下面的命令将生成项目的模板。

$ django-admin startproject myproject

我假设您要求将以下句子的意思以中文进行同义改述:「假设您使用了myproject作为项目名称,那么应该已经创建了名为myproject的文件夹。」

文件的结构如下

myproject
├── manage.py
└── myproject
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

创建应用程序。

我将在项目中创建一个应用程序。

$ cd myproject
$ python manage.py startapp myapp

我的app是一个自定义的应用名称。

在这个时间点上,文件的构成应该是这样的。

myproject
├── manage.py
├── myapp
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
└── myproject
    ├── __init__.py
    ├── __pycache__
    │   ├── __init__.cpython-36.pyc
    │   └── settings.cpython-36.pyc
    ├── settings.py
    ├── urls.py
    └── wsgi.py

在 `settings.py` 文件中的 `INSTALLED_APPS` 项中添加刚创建的应用程序的名称。

.....

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
+   'myapp',  #追加行
]

.....

创建数据模型

创建模型文件

$ touch myapp/models.py

这个文件用来指定数据在数据库中的存储结构和类型。

from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=128)

class Book(models.Model):
    author = models.ForeignKey(Writer, related_name='books',on_delete=models.CASCADE, null=True, blank=True, default=None)
    title = models.CharField(max_length=512)
    contents = models.TextField()

另外,还可以看到一些没有编写on_delete的文章。
自Django2.0之后,似乎models.ForeignKey()的参数必须包含on_delete属性。
如果不指定on_delete,创建迁移文件时将会出现以下错误信息:
TypeError: __init__()缺少一个必需的位置参数:’on_delete’

迁移

迁移是指描述将数据模型的更改内容反映到数据库中的命令。

创建迁移文件

$ python manage.py makemigrations

如果不能正常运行,需要指定应用程序名称。

我创建了一个Django模型,但是在运行makemigrations命令时,显示”未检测到任何更改”。

在这一步中,myapp内已经生成了一个migrations目录
此时的文件结构如下。

myproject
├── db.sqlite3
├── manage.py
├── myapp
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-36.pyc
│   │   ├── admin.cpython-36.pyc
│   │   └── models.cpython-36.pyc
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   ├── 0001_initial.py
│   │   ├── __init__.py
│   │   └── __pycache__
│   │       └── __init__.cpython-36.pyc
│   ├── models.py
│   ├── tests.py
│   └── views.py
└── myproject
    ├── __init__.py
    ├── __pycache__
    │   ├── __init__.cpython-36.pyc
    │   ├── settings.cpython-36.pyc
    │   └── urls.cpython-36.pyc
    ├── settings.py
    ├── urls.py
    └── wsgi.py

我将进行迁移操作。(Wǒ .)

$ python manage.py migrate

如果稍后需要重新添加数据模型或更改属性,则需要重新开始。

虽然在这一点上,您仍然可以使用Django的shell来添加数据,但由于我们的目标是创建API,所以在这里省略此步骤。

生成API

创建两个文件

$ touch myproject/urls.py
$ touch myapp/views.py

在urls.py文件中,我们将url与视图进行对应。

from django.conf.urls import url
from django.contrib import admin
from myapp import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^books$', views.show_books),
]

在views.py文件中,指定了要输出的内容。

import json
from django.http import HttpResponse
from django.core import serializers
from myapp.models import Book

def show_books(request):
    return HttpResponse(serializers.serialize("json", Book.objects.all()))

当您访问/books时,我们将以JSON格式返回所有书籍的数据。

服务器操作确认

$ python manage.py runserver

如果在末尾增加四位数字,则可以指定端口号。由于本次未进行指定,将使用默认的8000号端口。

让我们通过浏览器访问 http://localhost:8000/books,或执行以下命令。

$ curl http://localhost:8000/books

因为还没有任何数据填入,所以

[]

应该显示为’+’。

下一篇文章↓
使用Django REST框架实现JSON的GET/POST/PUT/DELETE请求

广告
将在 10 秒后关闭
bannerAds