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缓存的使用!!!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等待着冬天的风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值