首页 > 编程语言 >Python从0到100(四十五):从字符串到前后端分离

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

时间:2024-07-23 13:28:24浏览次数:18  
标签:customers 四十五 Python html HTML table 100 模板

在这里插入图片描述

前言: 零基础学Python:Python从0到100最新最全教程 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能相关知识,成为学习学习和学业的先行者!
欢迎大家订阅专栏:零基础学Python:Python从0到100最新最全教程!

一、代码直接生成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。
这样 界面完全交给前端开发人员去做, 后端开发只需要提供前端界面所需要的数据就行了。
前端 和 后端 之间的交互就完全是 业务数据了。这样需要 定义好 前端和后端 交互数据 的接口。

标签:customers,四十五,Python,html,HTML,table,100,模板
From: https://blog.csdn.net/weixin_51390582/article/details/140588269

相关文章

  • Python的运算符与条件表达式
    一、运算符Python数据是通过使用运算符来进行操作的,与数学运算符类似,主要运用于数字计算,比较大小和逻辑运算。Python中的运算符主要包括算术运算符、赋值运算符、比较运算符、逻辑运算符和位运算符。1.算术运算符算术运算符用在数字表达式中,作用和在数学中是一样的。Python......
  • 在尝试使用 docker 运行基于 pythonnet 的项目时,找不到 C# 运行时
    屏幕截图我不断收到此错误:RuntimeError:Failedtocreateadefault.NETruntime,whichwouldhavebeen"mono"onthissystem.Eitherinstallacompatibleruntimeorconfigureitexplicitlyvia......
  • Python 在模块中使用变量
    如何将一个文件中声明的变量调用到另一个文件中?大家好我已经在file1中声明了我的变量。我的函数位于file2中,它使用该变量。如何调用主文件中声明的变量。提前致谢当然可以!以下是如何在Python中跨文件使用变量:file1.py(包含变量的文件)#在file1.p......
  • Python 类型提示和 linter
    我一直在向我们的python项目添加静态类型检查,例如像这样:fromtypingimportListfromsomethingimportMyOtherClassclassMyClass:def__init__(self)->None:self.some_var=None#type:List[MyOtherClass]但是,现在我们使用的linter(flake8和......
  • eclipse如何写python程序
    本文主要介绍在Windows系统环境下,搭建能在Eclipse中运行python程序的环境。一、Eclipse下载与安装:Eclipse是写JAVA的IDE,下载地址为:http://www.eclipse.org/downloads/下载安装,网上教程很多,不赘述。二、pydev插件下载与安装:启动Eclipse,点击Help—>EclipseMarketplace......
  • 运行 python 3 代码时出现 python 2 语法错误
    我有一个如下所示的类classExperimentResult(BaseDataObject):def__init__(self,result_type:str,data:dict,references:list):super().__init__()self.type=result_typeself.references=referencesself.data=data......
  • 如何让 python 类型检查器知道它应该返回其类的新实例?
    我想使用classmethod返回当前类的新实例,并且我尝试了如下代码,但它引发了NameError('name'T'isnotDefined')PutthecodeT=TypeVar('T',bound=A)on|||以上也不起作用。classA有什么好主意来处理它吗?Isthereanygoodideatohandleit?......
  • 由于循环依赖而导致的Python注释错误
    我有两个相互依赖的类,并且无需注释即可正常工作。不幸的是,当我尝试注释返回值时,它会导致预期循环依赖错误。Network.pydefprocessors(self)->List[Processor]:#implementationProcessor.pydefnetwork(self)->Network:......
  • 如何在python中发送带有请求的“multipart/form-data”?
    如何在Python中使用multipart/form-data发送requests?如何发送文件,我明白,但是如何通过这种方法发送表单数据无法理解。可以使用Python中的requests库来发送multipart/form-data请求。说得对,requests库可以轻松发送文件,并且发......
  • 我安装了哪个版本的 Python?
    我必须在Windows服务器上运行Python脚本。我如何知道我拥有哪个版本的Python,这真的很重要吗?我正在考虑更新到最新版本的Python。确定在Windows服务器上安装的Python版本至关重要,因为它可以确定脚本的兼容性和可用库。以下是检查方法:使用命令提......