Django开发之前后端分离快速入门
前言:为什么要进行前后端分离开发,我感觉这是一个哲学问题,django也提供了相应的模版,其实也是可以进行前后端不分离开发的,但是一个人的精力是有限的,加上时间问题,所以要进行前后端分离开发,后端的开发好之后,不仅能把数据提供给前端,还可以把数据提供给安卓、IOS、小程序等。
1.环境配置
1.1 Django安装
python -m pip install Django==3.0.5 -i https://pypi.tuna.tsinghua.edu.cn/simple
注意:版本项目用的版本是Python3.8+Django3.0.5
2.2 创建项目
可以使用pycharm创建项目,如下图所示:
也可以使用以下命令创建项目:
django-admin startproject django_demo
3.3 配置mysql数据库
找到django_demo下的settings.py文件,然后修改“DATABASES”成你的数据库,如下所示:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django_demo',#数据库的名字,在使用之前,需要先自己在mysql里面创建这个数据库
'USER': 'root',#账号
'PASSWORD': 'root',#密码
'HOST': 'localhost',#主机
'PORT':3306#端口号
}
}
然后需要在django_demo下的 init.py文件里面导入pymysql,代码如下:
import pymysql
pymysql.install_as_MySQLdb()
2.Django常用的命令
2.1 创建项目
django-admin startproject 项目名字
2.2 创建应用
python manage.py startapp 应用名
2.3 创建表和迁移到数据库中
python manage.py makemigrations 应用名
python manage.py migrate
3.创建数据库和表
3.1 创建一个students应用
python manage.py startapp students
创建好之后,我们需要在根目录下创建一个apps的文件夹,然后把students的文件夹移动到这个apps的文件夹中去,然后在django_demo下的settings.py需要添加这个应用,如下图:
3.2 创建数据库和表
在students文件夹下的models.py添加以下代码:
from django.db import models
from django.contrib.auth.models import AbstractUser
class Stdudent(models.Model):
name = models.CharField(max_length=200)
number = models.CharField(max_length=200)
addre = models.CharField(max_length=200)
class Meta:
db_table = 'student'
verbose_name = '学生'
verbose_name_plural = verbose_name
然后执行一下语句
python manage.py makemigrations students
python manage.py migrate
此时mysql数据库表已经创建好
4.配置URL
django_demo文件夹下的urls.py代码如下所示:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('api/student/',include('apps.students.urls'))#配置的url地址
]
然后在students文件夹下创建一个urls.py,添加一下代码:
from django.urls import path
from apps.students import student
urlpatterns = [
path('students',student.dispatcher) #dispatcher是student.py里面的一个方法
]
5.前后端分离
所谓的前后端分离,就是我们后端只需要关注后端即可,然后按照事先约定的接口,我们给前端提供json数据即可。
注意:这里我们需要注释掉settings里面的csrf验证
在students文件夹下新建一个student.py文件,添加以下代码:
import traceback
from django.http import HttpResponse,JsonResponse
from apps.students.models import Stdudent
import json
from django.core.paginator import Paginator, EmptyPage
def dispatcher(request):
# GET请求 参数在url中,同过request 对象的 GET属性获取
if request.method == 'GET':
request.params = request.GET
# POST/PUT/DELETE 请求 参数 从 request 对象的 body 属性中获取
elif request.method in ['POST','PUT','DELETE']:
# 根据接口,POST/PUT/DELETE 请求的消息体都是 json格式
request.params = json.loads(request.body)
# 根据不同的action分派给不同的函数进行处理
action = request.params['action']
if action == 'list_student':
return liststudents(request)
elif action == 'list_student2':
return liststudents2(request)
elif action == 'add_student':
return addstudent(request)
elif action == 'modify_student':
return modifystudent(request)
elif action == 'delete_student':
return deletestudent(request)
else:
return HttpResponse(json.dumps({'ret': 1, 'msg': '不支持该类型http请求'},ensure_ascii=False),content_type='application/json')
def liststudents(request):
"""获取所有的学生名单"""
qs = Stdudent.objects.values()
retlist = list(qs)
# return JsonResponse({'ret':0,'retlist':retlist})
return HttpResponse(json.dumps({'ret':0,'retlist':retlist}, ensure_ascii=False), content_type='application/json')
def liststudents2(request):
"""分页查询"""
try:
pagenum = request.params['pagenum']
pagesize = request.params['pagesize']
qs = Stdudent.objects.values()
pgnt = Paginator(qs, pagesize)
page = pgnt.page(pagenum)
retlist = list(page)
return JsonResponse({'ret': 0, 'retlist': retlist, 'total': pgnt.count},charset='utf-8')
except EmptyPage:
return JsonResponse({'ret': 0, 'retlist': [], 'total': 0},charset='utf-8')
except:
return JsonResponse({'ret': 2, 'msg': f'未知错误\n{traceback.format_exc()}'},charset='utf-8')
def addstudent(request):
"""添加学生"""
info = request.params['data']
try:
student = Stdudent.objects.get(name=info['name'])
except Stdudent.DoesNotExist:
student = None
if student:
return JsonResponse({'ret': 1, 'msg': '用户名已经存在'},charset='utf-8')
record = Stdudent.objects.create(name=info['name'], number=info['number'], addre=info['addre'])
return JsonResponse({'ret':0,'id':record.id})
def modifystudent(request):
"""修改学生信息"""
student_id = request.params['id']
newdata = request.params['newdata']
try:
studnet = Stdudent.objects.get(id=student_id)
except Stdudent.DoesNotExist:
print("客户不存在")
return {
'ret':1,
'msg':'客户不存在'
}
if 'name' in newdata:
studnet.name = newdata['name']
if 'number' in newdata:
studnet.number = newdata['number']
if 'addre' in newdata:
studnet.addre = newdata['addre']
studnet.save()
print("修改成功")
return {'ret':0}
def deletestudent(request):
"""删除学生信息"""
student_id = request.params['id']
try:
student = Stdudent.objects.get(id=student_id)
except Stdudent.DoesNotExist:
return {
"ret":1,
"msg":"用户不存在"
}
student.delete()
return JsonResponse({'ret':0},charset='utf-8')
6.测试
测试的意思就是模拟浏览器请求数据,但是我们不能等前端开发结束之后,在进行测试,所以我们要借助request方法,进行模拟浏览器测试。
import requests,pprint
def query():
"""查询"""
response = requests.get('http://127.0.0.1:8000/api/student/students?action=list_student')
print(response.status_code)
print(response.json())
# pprint.pprint(response.json())
def query2():
"""分页查询"""
payload = {
'action': 'list_student2',
'pagenum': 1,
'pagesize': 3
}
response = requests.get('http://127.0.0.1:8000/api/student/students',params=payload)
pprint.pprint(response.json())
def add_student():
"""增加一个学生"""
payload = {
"action":"add_student",
"data":{
"name":"fly9",
"number":"8888",
"addre":"鹿邑"
}
}
response = requests.post('http://127.0.0.1:8000/api/student/students',json=payload)
pprint.pprint(response.json())
def modify_student():
payload = {
"action":"modify_student",
"id":4,
"newdata":{
"name": "fly6",
"number": "123",
"addre": "鹿邑222"
}
}
response = requests.post('http://127.0.0.1:8000/api/student/students', json=payload)
print(response)
# pprint.pprint(response.json())
def delete_student():
payload = {
"action":"delete_student",
"id":4
}
response = requests.post('http://127.0.0.1:8000/api/student/students', json=payload)
pprint.pprint(response.json())
if __name__ == '__main__':
add_student()
# query()
# modify_student()
# delete_student()
# query2()
测试结果:
查询所有的学生信息:
分页查询结果:
其他自行测试。
当然在一个比较大的项目里我们需要考虑的问题还是很多的,这只是一个入门案例,希望能给大家带来帮助!
下一章节介绍redis缓存的使用!!!