本节内容大量参考《Django REST Framework 官方文档》
当前(2020.7.27)使用的版本:
Python 3.8.2
pip 20.1.1
django 3.0.8 python -m django --version
djangorestframework 3.11.0
创建项目目录,我将其命名为 demo
:
1
2
| $ mkdir demo
$ cd demo
|
创建虚拟环境来隔离本地依赖:
1
2
3
| $ python -m venv env
$ source env/bin/activate # Linux
$ .\env\Scripts\activate.bat # Windows
|
安装 Django 及相关依赖:
1
2
| $ pip install django
$ pip install djangorestframework
|
新建 Django 项目:
1
2
3
4
5
| $ django-admin startproject demo .
# ↑ 注意这个点 很关键
$ cd demo
$ django-admin startapp web
$ cd ..
|
执行数据库迁移(初始化数据库,默认为 sqlite3
)并创建一个管理员用户:
1
2
| $ python manage.py migrate
$ python manage.py createsuperuser --email [email protected] --username admin
|
接着是序列化类,新建 ./demo/web/serializers.py
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| 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')
|
然后是视图 ./demo/web/views.py
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| from django.shortcuts import render
from django.contrib.auth.models import User, Group
from rest_framework import viewsets
from demo.web.serializers import UserSerializer, GroupSerializer
class UserViewSet(viewsets.ModelViewSet):
"""
允许用户查看或编辑的API路径。
"""
queryset = User.objects.all().order_by('-date_joined')
serializer_class = UserSerializer
class GroupViewSet(viewsets.ModelViewSet):
"""
允许组查看或编辑的API路径。
"""
queryset = Group.objects.all()
serializer_class = GroupSerializer
|
最后是路由 ./demo/urls.py
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| from django.contrib import admin
from django.urls import path
from django.conf.urls import url, include
from rest_framework import routers
from demo.web import views
router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'groups', views.GroupViewSet)
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^', include(router.urls)),
url(r'^api/', include('rest_framework.urls', namespace='rest_framework'))
]
|
编辑 ./demo/settings.py
以进行全局设置(比如打开分页或者只允许管理员访问):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# ...
'rest_framework'
]
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAdminUser',
],
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 10
}
|
运行临时服务以便测试:
1
| $ python manage.py runserver
|
尝试访问:
1
| $ curl -H 'Accept: application/json; indent=4' -u admin:password http://127.0.0.1:8000/users/
|
整体流程跑通以后开始写业务,没写几行发现实在难受。
编写过程和优雅两个字不沾边就算了。
社区环境也差,差到令人难以置信这是 Python 最流行的 web 框架。
总而言之言而总之,写网站这事——
Python,不行。
PHP / Go / Java,彳亍!
与其用Python,我宁愿用 Java 写。
至于 Flask,我以前也用过,确实比 Django 简洁,但也比 Django 简陋。
等等,就目前来说,简陋好像算不上什么缺点。
试试吧。