我安装了 django djangorestframework markdown pygments django-filter
# 创建项目,直接创建
django-admin startproject <dj_learn>
# 自动创建数据库表
python manage.py makemigrations
python manage.py migrate
# 创建管理员(admin byack89HKC)
python manage.py createsuperuser
修改 settings.py 一些内容
ALLOWED_HOSTS = ['*']
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = False
STATIC_ROOT = os.path.join(BASE_DIR, 'static') # 静态文件路径
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'staticfiles')
]
所有 REST 相关的配置文件放在这个字典里
# REST API 所有相关的配置
# 全局配置
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', # 自带的分页类
'PAGE_SIZE': 10, # 默认每页大小
'DATETIME_FORMAT': '%Y-%m-%d %H:%M:%S', # 默认时间格式
'DEFAULT_RENDERER_CLASSES': ( # 默认渲染器 Render 类
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer',
),
'DEFAULT_PARSER_CLASSES': ( # 默认解析器 Parser 类,解析 request.data
'rest_framework.parsers.JSONParser',
'rest_framework.parsers.FormParser',
'rest_framework.parsers.MultiPartParser',
'rest_framework.parsers.FileUploadParser', # 上传文件
),
'DEFAULT_PERMISSION_CLASSES': [ # 默认权限
'rest_framework.permissions.IsAuthenticated', # 必须登录后才能访问
],
'DEFAULT_AUTHENTICATION_CLASSES': [ # 默认认证
'rest_framework.authentication.BasicAuthentication', # 基本认证
'rest_framework.authentication.SessionAuthentication', # 会话认证
]
}
创建一个简单的课程信息 APP
python manage.py startapp course
修改该应用的信息 app.py
class CourseConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'course'
verbose_name = '课程信息'
创建模型类
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class course(models.Model):
name = models.CharField(max_length=20, unique=True, help_text='课程名称', verbose_name='课程名称')
introduction = models.TextField(help_text='课程介绍', verbose_name='课程介绍')
# 老师关联外键到默认的用户组
teacher = models.ForeignKey(User, on_delete=models.CASCADE, help_text='课程讲师', verbose_name='课程讲师')
# 价格最多6为数字,小数点后面占2位
price = models.DecimalField(max_digits=6, decimal_places=2, help_text='课程价格', verbose_name='课程价格')
created_at = models.DateTimeField(auto_now_add=True, help_text='创建时间', verbose_name='创建时间')
updated_at = models.DateTimeField(auto_now=True, help_text='更新时间', verbose_name='更新时间')
# 元数据
class Meta:
verbose_name = '课程信息'
verbose_name_plural = verbose_name
ordering = ('price',) # 按价格排序
def __str__(self):
return self.name
将这些字段放入后台,方便我们可以在后台添加数据 admin.py
from django.contrib import admin
from .models import Course
# Register your models here.
@admin.register(Course)
class CourseAdmin(admin.ModelAdmin):
list_display = ['name', 'introduction', 'teacher', 'price', 'created_at', 'updated_at'] # 显示字段
search_fields = ['name', 'introduction', 'teacher'] # 搜索字段
list_filter = list_display # 过滤的字段
完成后我们直接生成数据表,但是需要将该APP加入到项目settings.py
里的INSTALLED_APP
里
python manage.py makemigrations
python manage.py migrate
对模型的字段进行序列化,主要是将查询集 queryset
和模型实例 instance
序列化成 json
格式,方便按统一的格式传递给前端,一般情况下,序列化我们是在对应的应用里创建 serializers.py
from rest_framework import serializers
from .models import Course
# 在这里序列化模型
class CourseSerializer(serializers.HyperlinkedModelSerializer):
# 外键字段,所以只读
teacher = serializers.ReadOnlyField(source='teacher.username')
class Meta:
model = Course
# 这个地方的 url 并不是固定的,只是一个默认值
fields = ['id', 'url', 'name', 'introduction', 'teacher', 'price', 'created_at', 'updated_at']
某个用户只能修改自己创建的课程,所有需要权限管理,在对应的应用里创建 permissions.py
from rest_framework import permissions
# 在这里自定义权限
class IsOwnerOrReadOnly(permissions.BasePermission):
""" 只允许对象所有者能够编辑 """
def has_object_permission(self, request, view, obj):
# 任何人都可以读
if request.method in permissions.SAFE_METHODS:
return True
# 对象所有者才拥有写权限
return obj.teacher == request.user
自定义权限后,在视图 view.py
中处理
# 使用 ViewSet 来创建接口
class CourseViewSet(viewsets.ModelViewSet):
queryset = Course.objects.all()
serializer_class = CourseSerializer
permission_classes = [IsOwnerOrReadOnly] # 局部权限设置优先于全局设置
def perform_create(self, serializer):
serializer.save(teacher=self.request.user)
最后在 urls.py
中注册路由即可
然后自动生成 API 文档
pip install coreapi
在全局中进行配置
REST_FRAMEWORK = {
#指定用于支持coreapi的Schema
'DEFAULT_SCHEMA_CLASS':'rest_framework.schemas.coreapi.AutoSchema',
}
配置路由即可
from rest_framework.documentation import include_docs_urls
path('docs/', include_docs_urls(title="API文档", description="API文档"))
跨域问题解决办法,参考文章:地址
token登录认证:
- https://developer.aliyun.com/article/1228023
- 解决: AttributeError: This QueryDict instance is immutable
django 处理文件上传 Django 使用 Django FileField 还是 FilePathField
- 使用Celery异步处理任务