Python从0到100(四十五):从字符串到前后端分离

举报
是Dream呀 发表于 2024/07/26 11:31:23 2024/07/26
【摘要】 一、代码直接生成HTML在Python Web开发中,我们可以直接使用Python代码来生成HTML。这种方式简单直接,但随着项目的复杂度增加,维护成本也会随之上升。 1.直接生成HTML的优势简单直接:对于小型项目或原型开发,直接生成HTML可以快速实现功能。完全控制:开发者可以完全控制HTML的生成过程,易于调试和修改。 2.直接生成HTML的劣势维护困难:随着HTML内容的增加,代码...

一、代码直接生成HTML

在Python Web开发中,我们可以直接使用Python代码来生成HTML。这种方式简单直接,但随着项目的复杂度增加,维护成本也会随之上升。

1.直接生成HTML的优势

  1. 简单直接:对于小型项目或原型开发,直接生成HTML可以快速实现功能。
  2. 完全控制:开发者可以完全控制HTML的生成过程,易于调试和修改。

2.直接生成HTML的劣势

  1. 维护困难:随着HTML内容的增加,代码的复杂度也会增加,维护变得困难。
  2. 缺乏灵活性:每次修改HTML结构都需要修改Python代码,不够灵活。
from django.http import HttpResponse

# 定义HTML模板
html_template = '''
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <style>
        table { width: 100%; border-collapse: collapse; }
        th, td { padding: 8px; text-align: left; border-bottom: 1px solid #ddd; }
    </style>
</head>
<body>
    <table>
        <tr>
            <th>ID</th>
            <th>姓名</th>
            <th>电话号码</th>
            <th>地址</th>
        </tr>
        {table_rows}
    </table>
</body>
</html>
'''

def generate_table_rows(customers):
    table_rows = ''
    for customer in customers:
        table_rows += f"<tr><td>{customer['id']}</td><td>{customer['name']}</td><td>{customer['phonenumber']}</td><td>{customer['address']}</td></tr>"
    return table_rows

def listcustomers(request):
    customers = [
        {'id': 1, 'name': 'Alice', 'phonenumber': '1234567890', 'address': 'Wonderland'},
        # 更多客户数据...
    ]
    table_rows = generate_table_rows(customers)
    return HttpResponse(html_template.format(table_rows=table_rows))

将其放在我们的sales/views文件中:
在这里插入图片描述

我们用一个变量 html_template 存储html模板, 然后 代码中生成html 里面需要插入的表格记录的内容,这个内容是html片段,也就是 html 表格的每行 。
最后填入到 html_template 模板里面,就产生了完整的HTML 字符串。最后返回该 html 文档 字符串 即可。修改后,再次访问 http://127.0.0.1:8080/sales/customers/

二、使用模板引擎

随着项目的扩展,直接在Python代码中拼接HTML变得越来越复杂。这时,我们可以使用模板引擎来简化这个过程。

1.模板引擎的优势

  1. 代码分离:HTML模板与Python代码分离,易于维护。
  2. 灵活性高:模板可以重复使用,易于修改和扩展。
  3. 易于阅读:模板中的逻辑更清晰,易于理解和阅读。

2.模板引擎的劣势

  1. 学习曲线:需要学习模板引擎的语法和使用方法。
  2. 性能影响:模板渲染可能会对性能产生一定影响,尤其是在高并发场景下。
from django.shortcuts import render
from .models import Customer

def listcustomers(request):
    customers = Customer.objects.values()
    context = {'customers': customers}
    return render(request, 'customers.html', context)

customers.html模板中:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <!-- 样式省略,与上文相同 -->
</head>
<body>
    <table>
        <tr>
            <th>ID</th>
            <th>姓名</th>
            <th>电话号码</th>
            <th>地址</th>
        </tr>
        {% for customer in customers %}
        <tr>
            <td>{{ customer.id }}</td>
            <td>{{ customer.name }}</td>
            <td>{{ customer.phonenumber }}</td>
            <td>{{ customer.address }}</td>
        </tr>
        {% endfor %}
    </table>
</body>
</html>

对比 Python直接产生 HTML,大家可以发现,使用模板引擎的好处,就是产生HTML的代码更简单方便了
因为我们可以直接把要生成的 HTML片段 写在 HTML模板 里面。
然后,只需要传入渲染模板所需要的参数就可以了,模板引擎会自动化帮我们生成的HTML
上面只是一种模板用法的简单演示。

三、前后端分离架构

随着Web应用的发展,前后端分离架构成为了一种趋势。这种架构允许前端开发者专注于用户界面和用户体验,而后端开发者则专注于业务逻辑和数据。

1.优势

  • 解耦前后端开发:前后端开发者可以独立工作,提高开发效率。
  • 统一数据接口:前后端通过RESTful API或GraphQL等接口进行通信,数据格式通常为JSON或XML。
  • 提升性能:前端渲染可以减轻服务器的负担,提高响应速度。

假设我们有一个RESTful API端点/api/customers/,后端返回JSON格式的数据:

from django.http import JsonResponse
from .models import Customer

def api_listcustomers(request):
    customers = Customer.objects.values()
    data = list(customers)
    return JsonResponse(data, safe=False)

前端可以使用AJAX请求此API,并使用框架如React或Vue.js来渲染数据。

现在随着 浏览器中javascript 解释器性能的突飞猛进,以及一些前端模板库和框架的流行。很多架构师将 页面的html 内容生成 的任务放到前端。
这样 服务端就只负责提供数据, 界面的构成全部在前端(浏览器前端或者手机前端)进行,称之为前端渲染。只是这个工作在前端执行, 使用前端的 框架库去完成,比如 Angular,React,Vue。
这样 界面完全交给前端开发人员去做, 后端开发只需要提供前端界面所需要的数据就行了。
前端 和 后端 之间的交互就完全是 业务数据了。这样需要 定义好 前端和后端 交互数据 的接口。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。