使用 Django Rest Framework 向前端展示接口

一、前言

这里写图片描述
之前 Java 开发,基于前后端分离,使用 Swagger 向前端展示接口,前端则可以清晰地调用接口,进行页面渲染等操作。
参考文献:Django REST framework 官网

近来为了部署项目中用 Python 编写 AI 算法接口,为了无缝对接,使用了基于 Python 的 Django,为了展示接口等其他复杂操作,使用了基于 Django 的 Django Rest Framework

类似 Java 里边基于 Java 的 Spring,基于 Spring 的 SpringBoot

DRF 也可以使用 Swagger 进行前后端合作,也许是用了近半年的 Swagger,审美疲劳了,觉得与其作用相当的 DRF Docs 异常炫酷。

二、代码

代码放在 github 上,细节自行查阅:https://github.com/larger5/DRFDocs.git
这里写图片描述
这里主要列举 DRF 的 ViewSet+Router 自带配置 url、API文档 fiter 的代码
好比Java 的 SpringBoot 自带封装 bean 一样强大

1、Model

from django.db import models

# Create your models here.
class BookInfo(models.Model):
    btitle = models.CharField(max_length=20)
    bpub_date = models.DateTimeField()
    def __str__(self):
        return 
<think>嗯,用户想知道Django如何从后向前发送数据。我需要先理清Django处理数据传递的基本流程。首先,Django遵循MVT模式,所以视图(View)负责处理逻辑,模板(Template)负责展示。数据传递通常发生在视图和模板之间。 用户可能对Django的机制不太熟悉,所以应该从基础讲起。首先,可能需要解释视图函数如何将数据封装到上下文字典中,然后通过render函数传递给模板。这是最常见的方法,适用于简单的场景。 然后,用户可能也会遇到需要动态加载数据的情况,比如AJAX请求。这时候可能需要使用JsonResponse,返回JSON数据,前端用JavaScript处理。这也是常见的异步数据传输方式,应该涵盖到。 另外,用户可能会关心不同的数据类型的传递方式,比如查询集对象、模型实例,或者简单的变量。需要提到如何安全地处理这些数据,避免前端出现错误。例如,将查询集转换为列表,或者使用values()方法获取字典列表。 还有,模板标签和过滤器的使用可能也是用户需要了解的部分。比如如何使用{{变量}}显示数据,以及for循环遍历列表等。这部分需要结合示例,让用户更容易理解。 安全问题也不能忽视,比如跨站脚本攻击(XSS),要提醒用户对用户输入的数据进行转义,或者使用safe过滤器时的注意事项。 可能还需要提到基于类的视图(CBV)中的数据传递方式,虽然用户可能刚开始学习,但简要说明可以扩展他们的知识面。比如在get_context_data方法中添加额外的上下文。 用户的问题可能涉及到前后分离的情况,这时候可能需要结合Django REST framework,但问题可能更关注于传统的MVT模式,所以这部分可以简要提及,避免让回答过于复杂。 需要检查是否有遗漏的步骤,比如URL配置是否正确,视图函数是否正确关联到模板。另外,常见错误如上下文变量名称不匹配,或者未正确使用模板标签,这些也需要提醒用户注意。 最后,总结几种方法的适用场景,帮助用户根据需求选择合适的方式。比如简单的页面渲染使用render,异步请求使用JsonResponse,复杂数据使用序列化等。</think>Django 中后向前发送数据主要通过以下步骤实现,结合代码示例逐步说明: 1. **视图层处理数据** ```python # views.py from django.shortcuts import render from .models import Product def product_list(request): # 从数据库获取数据 products = Product.objects.all()[:5] # 构造上下文字典 context = { 'page_title': '最新商品', 'products': products, 'total_items': products.count(), 'discount_rate': 0.15 # 示例数值类型数据 } return render(request, 'shop/products.html', context) ``` 2. **模板层接收数据** ```html <!-- templates/shop/products.html --> <h1>{{ page_title }}</h1> <p>共 {{ total_items }} 件商品,当前折扣率:{{ discount_rate|floatformat:2 }}</p> <ul> {% for product in products %} <li> {{ product.name }} - ¥{{ product.price }} {% if product.stock < 10 %} <span class="warning">(库存紧张)</span> {% endif %} </li> {% empty %} <li>暂无商品</li> {% endfor %} </ul> ``` 3. **处理复杂数据结构** ```python # 视图返回JSON数据(适用于AJAX请求) from django.http import JsonResponse def api_products(request): products = Product.objects.values('id', 'name', 'price') return JsonResponse(list(products), safe=False) ``` **关键要点说明:** 1. **数据传递方式** - 基础方法:使用 `render()` 函数 - 异步方法:使用 `JsonResponse` - 复杂数据:结合 `serializers.serialize()` 2. **数据类型处理** ```python # 处理日期时间 from django.utils.timezone import now context['current_time'] = now() # 处理图片路径 context['logo'] = '/static/images/logo.png' ``` 3. **安全注意事项** ```html <!-- 自动转义示例 --> <p>{{ user_input_content }}</p> <!-- 自动转义HTML --> <p>{{ safe_content|safe }}</p> <!-- 手动标记安全内容 --> ``` 4. **最佳实践建议** - 使用模板过滤器处理数据格式: ```html <p>注册时间:{{ user.register_date|date:"Y年m月d日" }}</p> <p>账户余额:¥{{ user.balance|floatformat:2 }}</p> ``` - 对于大型数据集建议分页: ```python from django.core.paginator import Paginator paginator = Paginator(Product.objects.all(), 25) page = request.GET.get('page') products = paginator.get_page(page) ``` 5. **调试技巧** - 在模板中使用 `{% debug %}` 标签查看所有可用变量 - 使用Django Debug Toolbar检查上下文数据 - 通过 `python manage.py shell` 测试数据查询 **扩展应用场景**: - 使用Django REST Framework构建API - 通过WebSocket实时推送数据 - 结合JavaScript框架(如Vue/React)进行前后分离开发 记得在 `urls.py` 中配置正确的URL路由,并确保模板文件存放在正确的路径下(默认在 `templates/` 目录)。通过这种模式化的数据传递方式,可以实现从简单文本到复杂数据结构的灵活传输。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

IT小村

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

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

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

打赏作者

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

抵扣说明:

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

余额充值