Django实践-09前后端分离开发入门

简介: Django实践-09前后端分离开发入门

image.png


Django实践-09前后端分离开发入门


官网:https://www.djangoproject.com/

博客:https://www.liujiangblog.com/

本博客内容参考git:https://gitcode.net/mirrors/jackfrued/Python-100-Days 一些细节问题,大家可以查看git连接。本文主要的改变为把代码升级为django4.1版本。


Django静态文件问题备注:

参考:

Django测试开发-20-settings.py中templates配置,使得APP下的模板以及根目录下的模板均可生效

解决django 多个APP时 static文件的问题

django配置app中的静态文件步骤

Django多APP加载静态文件

django.short包参考:

中间件的应用

Django 前后端分离(REST Framework)


前后端分离开发概述

前后端分离开发的优点包括:

可以提高开发效率:前后端可以并行开发,加快产品发布速度。

可以降低系统的耦合性:前后端各自独立开发,前端不需要考虑后端的具体实现细节,后端也不用考虑前端的展示方式。

更好的可扩展性:前后端分离架构可以轻松地扩展新功能或模块,而无需改变整个系统。

更好的跨平台兼容性:前后端分离开发可以为多个平台提供服务,如 Web、Android、iOS 等。

更好的用户体验:通过前后端分离,可以更好地处理数据和 UI 展现,提升用户体验。


前后端分离开发的缺点包括:

开发难度较大:前后端分离需要开发者具备更多的技术能力和经验,同时需要更多的协调和沟通工作。

系统复杂度增加:前后端分离会增加系统的网络请求次数和数据交互,对于一些简单的应用来说可能会影响系统性能。

需要额外的工具支持:前后端分离需要使用一些额外的工具,如 Webpack、Babel 等,增加了开发成本。

安全性风险:前后端分离架构需要将数据和逻辑分别部署在不同的服务器上,可能会面临一些安全性问题。


基于前后端分离改写投票应用

接下来我们就用前后端分离的方式来改写之前的投票应用。为了避免影响原有的案例,现在新建一个应用polls2,然后在polls2应用中,完成前后端分离的应用,同时也体现了django的可插拔应用设计。


创建新的应用polls2

1.创建polls2
django-admin startapp polls2
2.修改settings.py文件

注册应用到INSTALLED_APPS

INSTALLED_APPS = [
    # ...
    'polls2', # 新增
]
3.修改polls2下的views.py文件

新增

from django.http import JsonResponse
from django.shortcuts import render
from polls.models import Subject
# Create your views here.
def show_subjects(request):
    queryset = Subject.objects.all()
    subjects = []
    for subject in queryset:
        subjects.append({
            'no': subject.no,
            'name': subject.name,
            'intro': subject.intro,
            'isHot': subject.is_hot
        })
    return JsonResponse(subjects, safe=False,json_dumps_params={'ensure_ascii':False})
    # json_dumps_params={'ensure_ascii':False} 可以在前端显示中文,否则显示为转义后的值 读者可以尝试去掉这个参数


上面的代码中,我们通过循环遍历查询学科得到的QuerySet对象,将每个学科的数据处理成一个字典,在将字典保存在名为subjects的列表容器中,最后利用JsonResponse完成对列表的序列化,向浏览器返回JSON格式的数据。由于JsonResponse序列化的是一个列表而不是字典,所以需要指定safe参数的值为False才能完成对subjects的序列化,否则会产生TypeError异常。


4.修改urls.py添加api/subjects/
from polls2 import views as polls2_views
urlpatterns = [
    # ...
    path('api/subjects',polls2_views.show_subjects), # 新增
]
5.运行项目并测试

运行项目

python manage.py runserver

测试

127.0.0.1:8000/api/subjects


未添加json_dumps_params={‘ensure_ascii’:False}参数

6e3471d61226869d649ef4573b58b99a_9a01fdac45dd4666b8b4dc12b3774102.png


添加 json_dumps_params={‘ensure_ascii’:False} 参数

image.png


6.基于bpmappers简化对象转字典操作

可能大家已经发现了,自己写代码将一个对象转成字典是比较麻烦的,如果对象的属性很多而且某些属性又关联到一个比较复杂的对象时,情况会变得更加糟糕。为此我们可以使用一个名为bpmappers的三方库来简化将对象转成字典的操作,这个三方库本身也提供了对Django框架的支持。


  1. 安装三方库bpmappers
pip install bpmappers
  1. 在polls2的views.py添加映射器代码(实现对象到字典转换)。
from bpmappers.djangomodel import ModelMapper
from polls.models import Subject # 复用polls中的models模型
class SubjectMapper(ModelMapper):
    class Meta:
        model = Subject
  1. 修改polls2应用下的views.py中的show_subjects函数
def show_subjects(request):
    queryset = Subject.objects.all()
    subjects = []
    for subject in queryset:
        # subjects.append({
        #     'no': subject.no,
        #     'name': subject.name,
        #     'intro': subject.intro,
        #     'isHot': subject.is_hot
        # })
        subjects.append(SubjectMapper(subject).as_dict())
    return JsonResponse(subjects, safe=False,json_dumps_params={'ensure_ascii':False})
  1. 运行与测试
127.0.0.1:8000/api/subjects

362b01048a73bc2e26fb7a3b99ec4523_26d0f1ec0b9441d4a2406cc620aa8b92.png

5.定制SubjectMapper映射器

如果希望将是否为热门学科对应的键取名为isHot(默认的名字是is_hot),如果希望在JSON数据中不显示原有的is_hot属性,可以在映射器中排除is_hot属性;也可以通过修改映射器来做到。具体的做法如下所示:


from bpmappers.djangomodel import ModelMapper
from polls.models import Subject # 复用polls中的models模型
from bpmappers import RawField # 新增
class SubjectMapper(ModelMapper):
    isHot = RawField('is_hot') # 新增
    class Meta:
        model = Subject
        exclude = ('is_hot', ) # 新增
  1. 运行与测试
127.0.0.1:8000/api/subjects

03897e19d96f6e027dd497ea73bb53f7_dc385b3cc6184874b19c864c3aabd0ec.png


关于bpmappers详细的使用指南,请参考它的官方文档,这个官方文档是用日语书写的,可以使用浏览器的翻译功能将它翻译成你熟悉的语言即可。


使用Vue.js渲染页面

在static/html目录下新建api_subjects.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>学科信息</title>
    <style>
    /* 此处省略层叠样式表 */
        #container {
            width: 80%;
            margin: 10px auto;
        }
        .user {
            float: right;
            margin-right: 10px;
        }
        .user>a {
            margin-right: 10px;
        }
        #main>dl>dt {
            font-size: 1.5em;
            font-weight: bold;
            border: 1px solid red;
        }
        #main>dl>dd {
            font-size: 1.2em;
        }
        a {
            text-decoration: none;
            color: darkcyan;
        }
    </style>
</head>
<body>
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.11/vue.min.js"></script>
    <div id="container">
        <h1>所有学科</h1>
        <hr>
        <div id="main">
            <dl v-for="subject in subjects">
                <dt>
                    <a :href="'/static/html/api_teachers.html?sno=' + subject.no">
                        [[subject.name]]  <!-- 原先为 {{subject.name}}-->
                    </a>
                    <img v-if="subject.isHot" src="/static/images/hot-icon-small.png">
                </dt>
                <dd>[[subject.intro]] </dd> <!-- 原先为 {{subject.intro}}-->
            </dl>
        </div>
    </div>
    <script>
        let app = new Vue({
            el: '#main',
            delimiters: ["[[", "]]"], // ***修改处*** vue 的与django模板语法冲突
            data: {
                subjects: []
            },
            created() {
                fetch('http://127.0.0.1:8000/api/subjects')
                    .then(resp => resp.json())
                    .then(json => {
                        console.log(json)
                        this.subjects = json
                    })
            }
        })
    </script>
</body>
</html>

运行测试

运行

python manage.py runserver

测试

http://127.0.0.1:8000/static/html/api_subjects.html


前后端分离的开发需要将前端页面作为静态资源进行部署,项目实际上线的时候,我们会对整个Web应用进行动静分离,静态资源通过Nginx或Apache服务器进行部署,生成动态内容的Python程序部署在uWSGI或者Gunicorn服务器上,对动态内容的请求由Nginx或Apache路由到uWSGI或Gunicorn服务器上。


在开发阶段,我们通常会使用Django自带的测试服务器,如果要尝试前后端分离,可以先将静态页面放在之前创建的放静态资源的目录下。


总结


本文主要是Django系列博客。本文是Django前后端分离开发。

步骤如下:


1.创建应用polls2

2.在settings.py中注册polls2

3.在polls2的views.py中添加视图函数

4.在urls.py中添加路由

5.运行测试

6.基于bpmappers简化对象转换为json

7.基于vue修改前端页面

8.把前端代码部署在服务器上

如果你看到这里,且博客有帮助,可以关注,点赞,收藏,评论哈💯

相关文章
|
2月前
|
存储 缓存 NoSQL
深入理解Django与Redis的集成实践
深入理解Django与Redis的集成实践
65 0
|
2月前
|
前端开发 JavaScript UED
探索Python Django中的WebSocket集成:为前后端分离应用添加实时通信功能
通过在Django项目中集成Channels和WebSocket,我们能够为前后端分离的应用添加实时通信功能,实现诸如在线聊天、实时数据更新等交互式场景。这不仅增强了应用的功能性,也提升了用户体验。随着实时Web应用的日益普及,掌握Django Channels和WebSocket的集成将为开发者开启新的可能性,推动Web应用的发展迈向更高层次的实时性和交互性。
86 1
|
1月前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
151 45
|
25天前
|
Java API 数据库
Django:从入门到精通
【11月更文挑战第18天】Django是一个由Python编写的高级Web应用框架,以其简洁性、安全性和高效性而闻名。Django最初由Adrian Holovaty和Simon Willison于2003年开发,旨在简化Web应用的开发过程。作为一个开放源代码项目,Django迅速吸引了大量的开发者和用户,成为了Python Web开发领域的重要工具之一。
42 1
|
2月前
|
IDE 关系型数据库 MySQL
Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
这篇文章是关于如何创建一个Django框架,介绍Django的项目结构和开发逻辑,并指导如何创建应用和编写“Hello, World!”程序的教程。
56 3
Django学习一:创建Django框架,介绍Django的项目结构和开发逻辑。创建应用,编写主包和应用中的helloworld
|
1月前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
51 2
|
2月前
|
存储 Shell 数据库
Python编程--Django入门:用户账户(二)
Python编程--Django入门:用户账户(二)
21 2
|
2月前
|
存储 数据库 Python
Python编程--Django入门:用户账户(一)
Python编程--Django入门:用户账户(一)
20 1
|
4月前
|
前端开发 关系型数据库 Python
Django入门到放弃之分页器
Django入门到放弃之分页器
|
4月前
|
数据库 开发者 Java
颠覆传统开发:Hibernate与Spring Boot的集成,让你的开发效率飞跃式提升!
【8月更文挑战第31天】在 Java 开发中,Spring Boot 和 Hibernate 已成为许多开发者的首选技术栈。Spring Boot 简化了配置和部署过程,而 Hibernate 则是一个强大的 ORM 框架,用于管理数据库交互。将两者结合使用,可以极大提升开发效率并构建高性能的现代 Java 应用。本文将通过代码示例展示如何在 Spring Boot 项目中集成 Hibernate,并实现基本的数据库操作,包括添加依赖、配置数据源、创建实体类和仓库接口,以及在服务层和控制器中处理 HTTP 请求。这种组合不仅简化了配置,还提供了一套强大的工具来快速开发现代 Java 应用程序。
249 0