第一部分
Django rest framework
1.创建虚拟环境
mkvirtualenv -p /usr/bin/python3 drfstudy
2. 下载 Django 环境
pip install django -i https://pypi.douban.com/simple
3. 下载 djangorestframework 环境
pip install djangorestframework -i https://pypi.douban.com/simple
4. 查看
pip list
5. 创建项目
django-admin startproject drfstudy
6. 用 pycharm 新建一个项目
点击 CREATE
7. 配置同步目录
8.同步、下载
9. 配置 pycharm 运行项目
开机服务后访问失败情况
在服务器内部试试能不能访问,结果提示端口被占用
于是在服务器重新转发一个新的端口8001使用。
服务开机后,成功访问
10. 配置作者信息
11. 使用 root 用户登录
mysql -uroot -p
12. 创建一个新的数据库
create database `drfstudy` charset='utf8';
13. 创建数据库对应的用户及赋予它权限
grant all privileges on drfstudy.* to 'drfstudyu'@'%' identified by 'qwe123';
flush privileges;
14. 创建完数据库及其用户后,退出root用户,使用创建的用户登录
15. 想要使用Django操作这个数据库,需要下载安装pimysal
pip install pymysql -i https://pypi.douban.com/simple
16. 重启pycharm
17. 注册pymysql引擎
import pymysql
pymysql.install_as_MySQLdb()
18.关于配合
[client]
database = drfstudy
user = drfstudyu
password = qwe123
host = 127.0.0.1
port = 3306
default-character-set = utf8
19. 第一次迁移映射
makemigrations
migrate
20. 注册 (Django rest framework 是一款APP)
21. 时序的配置
22. 配置 host
23. 配置日志器,记录网站的日志信息
import os
# 配置日志器,记录网站的日志信息
LOGGING = {
# 版本
'version': 1,
# 是否禁用已存在的日志器
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(lineno)d %(message)s'
},
'simple': {
'format': '%(levelname)s %(module)s %(lineno)d %(message)s'
},
},
'filters': {
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
'handlers': {
'console': {
'level': 'DEBUG',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
'file': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(BASE_DIR, "logs/drfstudy.log"), # 日志文件的位置
'maxBytes': 300 * 1024 * 1024,
'backupCount': 10,
'formatter': 'verbose'
},
},
'loggers': {
'django': { # 定义了一个名为django的日志器
'handlers': ['console', 'file'],
'propagate': True,
'level': 'INFO', # 日志器接收的最低日志级别
},
}
}
24. 配置过滤信息
25. push 项目初始化到仓库
第二部分
1. 新建一个APP
2. 因为我们的项目目录不比较多,新建一个apps目录用于存放所有的APP
资源目录标记可取消
删除不同步到虚拟机,需要在虚拟机进行收到删除。
3.注册apps
import sys
# 把 apps 目录加入到 sys.path 中
sys.path.insert(0, BASE_DIR) # 项目根目录
sys.path.insert(1, os.path.join(BASE_DIR, 'apps')) # 当前项目目录下的apps路径
4.注册user
5.先写models.py文件
class Student(models.Model):
SEX_CHOICES = (
(0, '女'),
(1, '男'),
)
name = models.CharField(max_length=30, verbose_name='姓名')
age = models.CharField(verbose_name='年龄', null=True, blank=True)
sex = models.CharField(verbose_name='性别', null=True, blank=True)
create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
class Meta:
db_table = 'student'
6. 映射迁移
makemigrations
migrate
如果提交没有反应,则先推上去,在打开manage.py
7.序列化
8.创建 user app的序列化器
9. ModelSerializer 比 Serializer 方便
"""
序列化器
本质就是一个类,和模型类差不多的类
用于JSON格式与模对象进行互转以及校验数据
定义的属性就是要参与转换的字段
序列化器字段可以少于或多于模型类字段(属性)
定义返回的数据有哪些字段
"""
from rest_framework import serializers
from .models import Student
class StudentSerializer(serializers.ModelSerializer):
class Meta:
model = Student # 指定序列化器映射的模型类
fields = '__all__' # fields指定映射字段__all__表示所有字段
# fields = ['id', 'name', 'age'] # 只映射id,name,age
# exclude = ['id'] # 映射除id字段之外的所有字段
# 修改映射字段
extra_kwargs = {
'age': {'min_value': 0, 'max_value': 200},
}
# 追加额外的校验逻辑
def validate_name(self, value):
if 'python' not in value.lower():
raise serializers.ValidationError('name error')
return value
# # 对象级别的额外验证
#
# def validate(self, data):
# if 'python' not in data['name'].lower():
# raise serializers.ValidationError('name error')
# return data
11. 编写视图
from django.shortcuts import render
from rest_framework import viewsets
from rest_framework.response import Response
from .models import Student
from .serializers import StudentSerializer
# Create your views here.
class StudentViewSet(viewsets.ViewSet):
def list(self, request):
# 获取所有的学生信息,返回的是模型类集合
student = Student.objects.all()
# 序列化: 实例化序列化器。传入要转换的模型集合,如果是多条数据一般我们加一个参数many=True
serializer = StudentSerializer(student, many=True)
# 返回响应: 返回序列化后的数据
return Response(serializer.data)
12. 写路由
13.运行、请求
14. 创建学生
def create(self, request):
# 获取前端传入的数据
serializer = StudentSerializer(data=request.data) # 得到的是前端的数据,我们需要转模型,反序列化
# 校验
serializer.is_valid(raise_exception=True)
# 保存数据
serializer.save()
# 返回响应: 返回序列化数据
return Response(serializer.data)
from django.urls import path
from .views import StudentViewSet
urlpatterns = [
path('student/', StudentViewSet.as_view({'get': 'list', 'post': 'create'}))
]
15. 运行请求效果
16.条件显示1
18. 条件显示2
19.关于年龄校验效果
20. 关于姓名校验效果
21. 查单
def retrieve(self, request, pk):
try:
student = Student.objects.get(id=pk)
except Student.DoesNotExist:
return Response(status=HTTP_404_NOT_FOUND)
serializer = StudentSerializer(instance=student) # instance 序列化 , data 反序列化
return Response(serializer.data)
path('student/<pk>/', StudentViewSet.as_view({'get': 'retrieve'}))
22. 待学习
23. 推送