Django 是一个使用 Python 编程语言开发的、免费且开源的 Web 应用框架。它遵循 "DRY(Don't Repeat Yourself)" 原则,旨在简化创建功能丰富的、高效率的 Web 网站。Django 提供了模型-视图-控制器(MVC)架构的实现,以及ORM(对象关系映射)系统、内置了 admin 界面、URL 路由、模板引擎、表单处理和强大的安全特性。
开发环境:Python3 + MySQL + PyCharm专业版
一、创建项目
打开PyCharm,新建Django项目(PyCharm社区版无法快速创建Django项目),设置新项目的路径和项目名,然后点击创建即可
等待项目加载完依赖后,可以在PyCharm的终端中可以使用pip freeze命令来查看默认安装的依赖:
可根据实际需求,卸载并安装指定版本的Django(新版本不支持MySQL 5.x):
pip uninstall django
pip install django==3.2.18
二、项目文件主要文件介绍
修改(注意是修改,不是添加!!!)setting.py文件,配置数据库、时区等
# 数据库配置 默认的数据库为sqlite
DATABASES = {
'default': {
'ENGINE': 'djangoDemo.db.backends.mysql', # 数据库类型
'NAME': 'db_name', # 数据库名
'USER': 'username', # 用户名
'PASSWORD': 'password', # 密码
'HOST': '127.0.0.1', # 数据库服务器地址
'PORT': 3306, # 端口号(MySQL默认3306)
}
}
# 设置语言代码为zh-hans,默认为en-us
LANGUAGE_CODE = 'zh-hans'
# 设置时区为亚洲上海,默认是UTC
TIME_ZONE = 'Asia/Shanghai'
# 时区感知
USE_TZ = True
打开终端,执行命令,安装mysql依赖:
pip install mysqlclient
三、启动项目
PyCharm运行manage.py启动项目,默认启动端口为8000,直接点击蓝的 http://127.0.0.1:8000/ 即可跳转到浏览器访问Django的主页
控制台日志:
浏览器主页:
四、新建应用模块
在PyCharm的终端中执行命令,创建新的应用模块:
python manage.py startapp app名
生成的应用模块目录 :
修改setting.py文件,找到INSTALLED_APPS(约31行处),将新建的应用模块注册到Django中
五、写一个Hello World接口
修改urls.py路由配置文件,添加新的路由:
在新建的应用模块中的views.py中添加hello接口:
浏览器访问 http://127.0.0.1:8000/
六、写一个user表的增删改查接口
执行SQL,创建user表:
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL COMMENT '名字',
`account` varchar(20) NOT NULL COMMENT '账号',
`password` varchar(20) NOT NULL COMMENT '密码',
`age` int(11) NOT NULL COMMENT '年龄',
`gender` char(1) NOT NULL COMMENT '性别',
`money` decimal(10, 2) NOT NULL COMMENT '钱,人民币单位:元',
`create_time` datetime(0) NOT NULL COMMENT '创建时间',
`update_time` datetime(0) NOT NULL COMMENT '更新时间',
`isdel` int(11) NOT NULL DEFAULT 0 COMMENT '该用户是否已删除,0未删除,1已删除',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 ROW_FORMAT = DYNAMIC;
INSERT INTO `user` VALUES (1, '小白', 'aaa@qq.com', '123456', 15, '男', 100.00, '2023-01-15 00:35:44', '2023-01-15 00:35:44', 1);
INSERT INTO `user` VALUES (2, '小明', 'bbb@qq.com', '123456', 16, '男', 58.00, '2023-01-15 00:35:44', '2023-01-15 00:35:44', 0);
INSERT INTO `user` VALUES (3, '大白', 'ccc@qq.com', '123456', 22, '女', 168.00, '2023-01-15 00:35:44', '2023-01-15 00:35:44', 0);
INSERT INTO `user` VALUES (4, '大明', 'ddd@qq.com', '123456', 21, '男', 12.50, '2023-01-15 00:35:44', '2023-01-15 00:35:44', 0);
INSERT INTO `user` VALUES (5, '小刚', 'eee@qq.com', '123456', 17, '男', 65.23, '2023-01-15 00:35:44', '2023-01-15 00:35:44', 1);
INSERT INTO `user` VALUES (6, '小灵', 'fff@qq.com', '123456', 18, '女', 95.32, '2023-01-15 00:35:44', '2023-01-15 00:35:44', 0);
INSERT INTO `user` VALUES (7, '小月', 'ggg@qq.com', '123456', 19, '女', 55.50, '2023-01-15 00:35:44', '2023-01-15 00:35:44', 0);
INSERT INTO `user` VALUES (8, '小华', '111@qq.com', '123456', 16, '男', 38.00, '2023-01-15 00:35:44', '2023-01-15 00:35:44', 1);
INSERT INTO `user` VALUES (9, '小雪', '222@qq.com', '123456', 20, '女', 320.77, '2023-01-15 00:35:44', '2023-01-15 00:35:44', 0);
在新建的应用模块中的models.py中创建user表的模型类
# 模型层,实体类层
class User(models.Model):
# 设置所需要映射的数据表,默认映射的表名是:应用名_全小写类名
class Meta:
db_table = "user"
ISDEL_CHOICES = (
(0, "未删除"),
(1, "已删除")
)
# Django自带id字段,无需手动添加
# id = models.IntegerField()
# 将变量与数据库表字段进行映射,CharField限制该字段为字符串类型,限制该字段的长度、默认值,verbose_name字段注释
name = models.CharField(max_length=20, default="", verbose_name="姓名")
account = models.CharField(max_length=20, default="", verbose_name="账号")
password = models.CharField(max_length=16, default="", null=False, verbose_name="密码")
age = models.IntegerField()
gender = models.CharField(max_length=1)
money = models.DecimalField(max_digits=10, decimal_places=2)
create_time = models.DateTimeField()
update_time = models.DateTimeField()
# choices限制字段的取值范围,只能是0和1,只是形式上限制,实际执行user.del=2时并不会报错,可以正常插入到数据库
isdel = models.IntegerField(null=False, choices=ISDEL_CHOICES)
在新建的应用模块中的views.py中编写接口:
import json
from datetime import datetime
from django.forms import model_to_dict
from django.http import JsonResponse
from django.shortcuts import HttpResponse
from django.utils import timezone
from django.views.decorators.csrf import csrf_exempt
from django_celery_beat.models import PeriodicTask, ClockedSchedule
from myapp.models import User, Book
def hello(request):
print(request.method) # 获取请求方式
print(request.path) # 获取请求路径
return HttpResponse("Hello World") # 返回一个字符串到前端
@csrf_exempt # 跨域
def user_list(request, user_id=None):
if request.method != "GET":
return JsonResponse({'message': '请求方式错误,应使用GET请求 !!!'})
print("GET请求参数:", request.GET) # 获取get请求路径中的参数
if user_id: # 如果提供了用户ID,则返回单个用户的信息
try:
# 查询指定id,且isdel字段等于0的用户信息
user = User.objects.filter(isdel=0).get(id=user_id)
except User.DoesNotExist:
return JsonResponse({'message': '未找到该用户信息 !!!'})
user = model_to_dict(user) # 转换为字典类型
return JsonResponse(user)
# 查询用户列表,返回的是QuerySet类型
users = User.objects.filter(isdel=0).all()
# 遍历数据
for user in users.values():
print(user)
break
# 将数据转换为list类型
user_list = list(users.values())
# 向前端返回JSON字符串,safe=False允许传入非字典类型数据
return JsonResponse(user_list, safe=False)
@csrf_exempt # 跨域
def user_add(request):
if request.method != "POST":
return JsonResponse({'message': '请求方式错误,应使用POST请求 !!!'})
request_data = json.loads(request.body) # 获取请体中的参数
print(request_data)
now_time = datetime.now()
user = User(name=request_data.get('name'),
account=request_data.get('account'),
password=request_data.get('password'),
age=request_data.get('age'),
gender=request_data.get('gender'),
money=0.00,
create_time=now_time,
update_time=now_time,
isdel=0,
)
print(user.name, user.create_time)
user.save()
return JsonResponse({'message': '添加成功'})
@csrf_exempt # 跨域
def user_update(request, user_id):
if request.method != "PUT":
return JsonResponse({'message': '请求方式错误,应使用PUT请求 !!!'})
try:
user = User.objects.filter(isdel=0).get(id=user_id)
except User.DoesNotExist:
return JsonResponse({'message': '未找到该用户信息 !!!'})
request_data = json.loads(request.body) # 获取请体中的参数
print(request_data)
user.name = request_data.get('name')
user.password = request_data.get('password')
user.age = request_data.get('age')
user.gender = request_data.get('gender')
user.update_time = datetime.now()
print(user.name, user.update_time)
user.save()
return JsonResponse({'message': '修改成功'})
@csrf_exempt # 跨域
def user_del(request, user_id):
if request.method != "DELETE":
return JsonResponse({'message': '请求方式错误,应使用DELETE请求 !!!'})
try:
user = User.objects.filter(isdel=0).get(id=user_id)
except User.DoesNotExist:
return JsonResponse({'message': '未找到该用户信息 !!!'})
user.isdel = 1
user.save()
return JsonResponse({'message': '删除成功'})
修改urls.py文件,添加路由:
from myapp import views
urlpatterns = [
path('admin/', admin.site.urls),
# 添加路由,当用户发送请求时,执行myapp.views.hello函数
path('', views.hello),
# 获取全部用户信息
path('user/list/', views.user_list),
# 获取指定id的用户信息,<int:user_id>是RESTful API风格请求,将请求url的最后一段值作为请求参数
path('user/<int:user_id>/', views.user_list),
path('user/add/', views.user_add),
path('user/update/<int:user_id>/', views.user_update),
path('user/del/<int:user_id>/', views.user_del),
]
重启项目进行接口测试,可使用ApiPost工具对post、put、delete等类型的请求进行测试