静态文件及模板

news2024/11/20 8:41:30

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm=1001.2014.3001.5501

1  静态文件

动态Web应用也会需要静态文件,通常是CSS和JavaScript文件。Flask可以向已经配置好的Web服务器提供静态文件,只要在包或模块所在的目录中创建一个名为static的文件夹,在应用中使用 “/static”即可访问。

给静态文件生成URL,使用特殊的“static”端点名,可以应用如下代码:

url_for('static', filename='style.css')

这个文件应该存储在文件系统上的“static/style.css”中。

2  模板

模板是一个包含响应文本的文件,其中包含用占位变量表示的动态部分,其具体值只在请求的上下文中才能知道。使用真实值替换变量,再返回最终得到的响应字符串,这一过程称为渲染。为了渲染模板,Flask使用了一个名为Jinja2的强大模板引擎。

(1)渲染模板

默认情况下,Flask在程序文件夹中的templates子文件夹中寻找模板。下面通过一个实例学习如何渲染模板。

图标 (35)

  实例04  渲染模板

创建04文件夹,在该文件夹中创建templates文件夹,然后创建2个文件,分别命名为index.html和user.html。最后在04文件夹下创建render.py文件,渲染这些模板。目录结构如图11所示。

图11  目录结构

templates/index.html代码如下:

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

</head>

<body>

    <h1>Hello World!</h1>

</body>

</html>

templates/user.html代码如下:

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>Title</title>

</head>

<body>

    <h1>Hello, {{ name }}!</h1>

</body>

</html>

render.py代码如下:

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')

def hello_world():

    return render_template('index.html')

@app.route('/user/<username>')

def show_user_profile(username):

    # 显示该用户名的用户信息

    return render_template('user.html', name=username)

if __name__ == '__main__':

    app.run(debug=True)

Flask提供的render_template 函数把 Jinja2 模板引擎集成到了程序中。render_template函数的第一个参数是模板的文件名。随后的参数都是键值对,表示模板中变量对应的真实值。在这段代码中,第二个模板收到一个名为name的变量。上述代码中的“name=username”是关键字参数。左边的“name”表示参数名,就是模板中使用的占位符;右边的“username”是当前作用域中的变量,表示同名参数的值。

运行render.py文件,运行结果如图10和图11所示。

图10  首页

图11  获取用户信息

(2)变量

实例04在模板中使用的{{ name }}结构表示一个变量,它是一种特殊的占位符,告诉模板引擎这个位置的值从渲染模板时使用的数据中获取。Jinja2能识别所有类型的变量,甚至是一些复杂的类型,例如列表、字典和对象。在模板中使用变量的一些示例如下:

<p>从字典中取一个值: {{ mydict['key'] }}.</p>

<p>从列表中取一个值: {{ mylist[3] }}.</p>

<p>从列表中取一个带索引的值: {{ mylist[myintvar] }}.</p>

<p>从对象的方法中取一个值: {{ myobj.somemethod() }}.</p>

可以使用过滤器修改变量,过滤器名添加在变量名之后,中间使用竖线分隔。例如,下述模板以首字母大写形式显示变量name的值:

Hello, {{ name|capitalize }}

Jinja2提供的部分常用过滤器及其说明如表2所示。

表2  常用过滤器及其说明

名    称

说    明

safe

渲染值时不转义

capitalize

把值的首字母转换成大写,其他字母转换成小写

lower

把值转换成小写形式

upper

把值转换成大写形式

title

把值中每个单词的首字母都转换成大写

trim

把值的首尾空格去掉

striptags

渲染之前把值中所有的 HTML 标签都删掉

safe过滤器值需要特别说明一下。默认情况下,出于安全考虑,Jinja2 会转义所有变量。例如,一个变量的值为 '<h1>Hello</h1>' ,Jinja2 会将其渲染成'&lt;h1&gt;Hello&lt;/h1&gt;',浏览器能显示这个h1元素,但不会进行解释。很多情况下需要显示变量中存储的HTML代码,这时就可使用safe过滤器,如“{{content|safe}}”。

(3)控制结构

Jinja2提供了多种控制结构,可用来改变模板的渲染流程。本节使用简单的例子介绍其中最常用的控制结构。

下面这个例子展示了如何在模板中使用条件控制语句:

{% if user %}

Hello, {{ user }}!

{% else %}

Hello, Stranger!

{% endif %}

另一种常见需求是在模板中渲染一组元素。以下代码展示了如何使用 for 循环实现这一需求:

<ul>

{% for comment in comments %}

<li>{{ comment }}</li>

{% endfor %}

</ul>

Jinja2还支持宏,宏类似于Python代码中的函数。代码如下:

{% macro render_comment(comment) %}

<li>{{ comment }}</li>

{% endmacro %}

<ul>

{% for comment in comments %}

{{ render_comment(comment) }}

{% endfor %}

</ul>

为了重复使用宏,我们可以将其保存在单独的文件中,然后在需要使用的模板中导入如下代码:

{% import 'macros.html' as macros %}

<ul>

{% for comment in comments %}

{{ macros.render_comment(comment) }}

{% endfor %}

</ul>

需要在多处重复使用的模板代码片段可以写入单独的文件,再包含在所有模板中,以避免重复:

{% include 'common.html' %}

另一种重复使用代码的强大方式是模板继承,它类似于 Python 代码中的类继承。首先,创建一个名为base.html的基模板:

<html>

<head>

{% block head %}

<title>{% block title %}{% endblock %} - My Application</title>

{% endblock %}

</head>

<body>

{% block body %}

{% endblock %}

</body>

</html>

block标签定义的元素可在衍生模板中修改。在本实例中,我们定义了名为head、title和body的块。注意,title包含在head中。下面这个示例是基模板的衍生模板:

{% extends "base.html" %}

{% block title %}Index{% endblock %}

{% block head %}

{{ super() }}

<style>

</style>

{% endblock %}

{% block body %}

<h1>Hello, World!</h1>

{% endblock %}

extends指令声明这个模板衍生自base.html。在extends指令之后,基模板中的3个块被重新定义,模板引擎会将其插入适当的位置。注意新定义的head块,在基模板中其内容不是空的,所以使用super()获取原来的内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1855356.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI大模型企业应用实战(18)-“消灭”LLM幻觉的利器 - RAG介绍

大模型在一定程度上去改变了我们生活生工作的思考的方式&#xff0c;然后也越来越多的个人还有企业在思考如何将大模型去应用到更加实际的呃生产生活中去&#xff0c;希望大语言模型能够呃有一些更多企业级别生产落地的实践&#xff0c;然后去帮助我们解决一些业务上的问题。目…

大模型续写评测

环境准备 通过remote-ssh连接云AI服务器&#xff0c;配置文件如下&#xff0c;供参考 # Read more about SSH config files: https://linux.die.net/man/5/ssh_config Host deepseekv1HostName rootconnect.bjc1.seetacloud.comUser rootPort 52984Password xxx # 密码从申请…

国产数据库 - 内核特性 - CloudberryDB中的Runtime Filter

国产数据库 - 内核特性 - CloudberryDB中的Runtime Filter 今年5月份GreenPlum官方将GitHub仓库代码全部删除&#xff0c;各个分支的issues和bugs讨论等信息全部清除&#xff0c;仅将master分支代码进行归档。对于国内应用GPDB的用户来说&#xff0c;这是一个挑战性事件&#x…

JWT介绍及其基本使用

JWT介绍及其基本使用 官网&#xff1a;https://jwt.io/ 什么是JWT 全称&#xff1a;JSON Web Token&#xff08;JSON Web令牌&#xff09; 一个开放标准(RFC 7519) &#xff0c;它定义了一种紧凑和自包含的方式&#xff0c; 用于作为 JSON 对象在各方之间安全地传输信息。此信…

捷云等保一体机 产品服务一站式等保合规交付解决方案

等保2.0的变化 2019 年 5 月 13 日&#xff0c;网络安全等级保护制度 2.0 国家标准&#xff08;简称“等保 2.0”&#xff09;正式发布&#xff0c;将等保 2.0 基本要求、测评要求、安全设计技术要求框架统一为安全管理中心支持下的三重防护结构框架。定级对象在按照等保 2.0 …

任务5.1 初识Spark Streaming

实战概述&#xff1a;使用Spark Streaming进行词频统计 1. 项目背景与目标 背景: Spark Streaming是Apache Spark的流处理框架&#xff0c;用于构建可伸缩、高吞吐量的实时数据处理应用。目标: 实现一个实时词频统计系统&#xff0c;能够处理流式数据并统计文本中的单词出现频…

DP:二维费用背包问题+似包非包

二维费用的背包问题&#xff1a;大多以01背包为基础&#xff0c;存在两个限制条件&#xff01; 一、一和零 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public: //需要满足两个条件的我们称之为二位费用的背包问题int findMaxForm(vector<string>&…

在 IntelliJ IDEA 中使用 Java 和 Selenium 模拟 Chrome 浏览器教程

在 IntelliJ IDEA 中使用 Java 和 Selenium 模拟 Chrome 浏览器教程 1. 前言2. 环境准备3. 关闭谷歌自动更新通过服务禁用更新服务通过任务计划程序禁用更新任务 4. 项目添加 Maven 依赖项5. 编写自动化脚本6. 项目运行效果7. 代码示例8.常用方法示例页面请求定位标签获取内容操…

Python低溫半导体电子束量子波算法计算

&#x1f3af;要点 &#x1f3af;任意维度求解器&#xff0c;绘制三维投影结果 | &#x1f3af;解二维静电场、静磁场 | &#x1f3af;狄利克雷、诺依曼条件几何矩阵算子 | &#x1f3af;算法模拟低溫半导体材料 | &#x1f3af;计算曲面达西流 | &#x1f3af;电子结构计算和…

学习VXLAN -- 报文结构、原理和配置

目录 VXLAN背景什么是VXLANVXLAN的优势VXLAN报文结构一些特定名词BDVBDIFVAPVSIVSI-InterfaceAC VXLAN的实现原理图VXLAN MAC地址表项MAC地址动态学习 VXLAN隧道VXLAN隧道工作模式L2 GatewayIP Gateway VXLAN隧道的建立与关联VXLAN隧道建立的方式VXLAN对到与VXLAN关联的方式 配…

系统思考与创新解决

圆满结束了为期两天的《系统思考》课程。在这次学习中&#xff0c;大家积极使用系统环路图来分析并呈现跨部门的业务协同问题&#xff0c;以及探讨了推动成长环路背后的限制因素。这不仅增强了团队之间的理解和合作&#xff0c;也帮助我们一起识别阻碍组织发展的关键挑战。期待…

obsidian中用check list 打造待办清单

背景 在快节奏的现代生活中&#xff0c;有效管理个人时间和任务成为提升生活与工作效率的关键。 Obsidian&#xff0c;作为一款强大的知识管理和笔记应用&#xff0c;通过其丰富的插件生态&#xff0c;为我们提供了高度自定义的任务管理解决方案。本文旨在详细介绍如何在Obsid…

AI应用带你玩系列之SadTalker

前段时间我刷微信视频&#xff0c;我无意间点开了一个&#xff0c;画面缓缓展开&#xff0c;是一幅精致的水墨画&#xff0c;画中人物皆是古代装束&#xff0c;衣袂飘飘&#xff0c;仿佛能闻到墨香。然而&#xff0c;这宁静的画面突然被打破了&#xff0c;画中的人物开始动了起…

自动驾驶仿真Carla -ACC功能测试

我将详细说明如何使用Carla进行ACC&#xff08;自适应巡航控制&#xff09;测试&#xff0c;确保每个步骤贴合实际的Carla自动驾驶仿真标准&#xff0c;并提供相应的代码示例。 使用Carla进行ACC测试的步骤&#xff1a; 1. 环境设置和启动Carla 首先&#xff0c;确保你已经安装…

在vue项目中集成cesium

首先创建一个新的vue项目 安装vite中cesium插件 https://github.com/nshen/vite-plugin-cesium 安装插件 npm i cesium vite-plugin-cesium vite -D配置插件 注释原有样式 修改代码 效果

重学java 79.JDK新特性 ⑤ JDK8之后的新特性

别怕失败&#xff0c;大不了重头再来 —— 24.6.20 一、接口的私有方法 Java8版本接口增加了两类成员: 公共的默认方法 公共的静态方法 Java9版本接口又新增了一类成员: 私有的方法 为什么IDK1.9要允许接口定义私有方法呢? 因为我们说接口是规范&#xff0c;规范是…

AI 大模型企业应用实战(08)-LangChain用prompts模板调教LLM的输入输出

超越chatGPT:学习使用prompts模板来调教LLM的输入输出&#xff0c;打造自己版本的"贾维斯" 1 Model I/O&#xff1a;LLM的交互接口 任何语言模型应用程序的核心要素都是......模型。LangChain 为您提供了与任何语言模型连接的构件。 即 Prompts -> Language mod…

免费ddns工具,快解析DNS解析使用教程

DDNS&#xff08;Dynamic Domain Name Server&#xff09;,中文叫动态域名解析&#xff0c;主要用于没有固定公网ip的网络环境下&#xff0c;使用一个固定的域名&#xff0c;解析动态变化的ip地址&#xff0c;达到远程访问的目的。 众所周知&#xff0c;目前公网ip资源非常紧缺…

昇思25天学习打卡营第6天|使用静态图加速

学AI还能赢奖品&#xff1f;每天30分钟&#xff0c;25天打通AI任督二脉 (qq.com) 背景介绍 AI编译框架分为两种运行模式&#xff0c;分别是动态图模式以及静态图模式。MindSpore默认情况下是以动态图模式运行&#xff0c;但也支持手工切换为静态图模式。两种运行模式的详细介…

MySQL数据库(三):读取数据库数据

上一节&#xff0c;我们介绍了数据库的基本操作&#xff0c;以及最后演示了如何使用库来连接数据库&#xff0c;在实际应用中&#xff0c;我们通常需要按照指定的条件对数据库进行操作&#xff0c;即增删改查操作&#xff0c;这是非常重要的&#xff01;这一节我们继续通过一个…