创建一个使用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请求