Django前后分离介绍

前后端分离,是个趋势,了解前后端分离,对我们的技术提升,也是有很大帮助的。

Django 的 MTV 模式,是数据库->后端->前端的一整套流程,所有的内容都是一套项目中。

前后端分离的思想,就是前端负责界面交互和美观,后端负责数据管理和数据输出。前端和后端的通信,完全基于 API 来处理。

什么是 API?
就是一个后端提供给前端拿数据的 url。

本节课的任务,就是做个 API 接口,访问这个接口,可以拿到数据库中的文章内容。

首先,说明下格式问题。前端找后端要数据,后端给数据,前端拿数据,都是有特定格式的,这种格式是前后端两个规则好的。

所以在这里,以 json 格式为例,json 也是前端编程语言 javascript 的对象结构。
image.png

增加模型函数

django 的 Model 默认不能直接导出 json 的,所以在模型定义里面,预先准备一个函数,将对象转换成 json,如下代码:

from django.db import models


# Create your models here.
class Article(models.Model):
	title = models.CharField(max_length=64, verbose_name="标题")
	abstract = models.CharField(max_length=128, verbose_name="摘要")
	content = models.TextField(verbose_name="内容")
	
	def __str__(self):
		return "{}".format(self.title)
	
	@classmethod
	def articles_to_dict(cls, articles):
		arts = {}
		for article in articles:
			tmp = {}
			tmp['title'] = article.title
			tmp['abstract'] = article.abstract
			tmp['content'] = article.content
			arts[article.id] = tmp
		return arts

代码解释:

  • @classmethod 申明这个函数是个类函数
  • articles_to_dict 函数名,类函数参数必须有 cls,第二个 articles 是需要传入的值,文章列表
  • for 循环,循环获取每篇文章,做成一个临时的字典 tmp,将标题、摘要、内容做成字典内容
  • 然后再把 tmp 字典放到循环外的 arts 大字典内,键值分别是文章的 id 和 tmp 临时字典
  • 最后将 arts 字典进行返回
  • 这样就可以把传入的对象列表,做成一个大的对象字典了

代码截图:
image.png

对应的 API 函数

有了将对象转换成字典的函数,下面开始定义 api 函数。

api 和 view 不太一样,虽然操作是一样的,但是概念上不同,view 返回网页内容,api 返回纯数据,所以 api 函数放的位置,单独存放到一个 api.py 里面,这个文件需要新建,看上方的效果图。

新建了 api.py 文件后,打开这个文件,新建一个函数,代码如下:

# -*- coding: utf-8 -*-
# @Time    : 2021/3/5 8:08 下午
# @Author  : AI悦创
# @FileName: api.py
# @Software: PyCharm
# @Blog    :http://www.aiyc.top
# @公众号   :AI悦创
from django.http import JsonResponse
from .models import Article


def export_article(request, id=None):
	if id:
		articles = Article.objects.filter(id=id)
	else:
		articles = Article.objects.all()
	articles_json = Article.articles_to_dict(articles)
	print(articles_json)
	return JsonResponse(articles_json, json_dumps_params={'ensure_ascii': False})

对于新手来说,代码还有难度,在这里详细解释下:

  • 导入 Article 和 JsonResponse。这个 JsonResponse 就是 json 格式的响应内容
  • 然后是函数的定义,函数名是 export_article,参数是 request 默认,以及一个 id,默认值是 None 为什么要 id,又设置成 None ?这里的思路是,这个函数可以返回特定的某篇文章,或者是返回默认所有文章。所以 id 的值,默认给个 None。等传入 id 时,None 会被覆盖
  • 然后判断 id 的值,如果有值,就查询这个 id 所对应的的文章;Article.objects.filter(id=id) 是查询 id 匹配的文章,结果是文章列表
  • 如果没有,则默认返回全部的文章
  • 拿到了文章后,使用类函数 articles_to_dict() 将文章对象列表,转换成字典
  • 通过 JsonResponse 将文章字典,做成响应直接返回
  • json_dumps_params={'ensure_ascii':False} 这个是不转换中文,视觉上看更直观

代码截图如下:
image.png

绑定 URL

api 函数准备好了,然后是注册和绑定 url,不要忘记了,这个也是需要绑定了,如下图:
image.png
这里绑定了两个 url,一个是 article/json,这是匹配没有传入 id 时候的访问 url;另一个是 article/json/<int:id>,这个是匹配传入 id 时的 url。

API 接口测试

一切准备就绪,看下访问效果,分别是访问无 id 的 url 和有 id 的 url,如下效果图:
image.png

网页中正常展示中文,打开浏览器的调试工具,切换到 Network 网络栏,这个 Json 格式就比较明显了,方便阅读。

【选词填空】练习

在 models.py 文件中,@classmethod 的意思_________是函数,也就是通过类可以直接调用的函数;
没有 @classmethod 的函数,是_____________函数,不能通过类调用,只能通过实例调用。

  • 实例
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AI悦创|编程1v1

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

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

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

打赏作者

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

抵扣说明:

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

余额充值