静态文件及模板

2024-06-24 09:20
文章标签 模板 静态

本文主要是介绍静态文件及模板,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

自学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.chinasem.cn/article/1089749

相关文章

C++的模板(八):子系统

平常所见的大部分模板代码,模板所传的参数类型,到了模板里面,或实例化为对象,或嵌入模板内部结构中,或在模板内又派生了子类。不管怎样,最终他们在模板内,直接或间接,都实例化成对象了。 但这不是唯一的用法。试想一下。如果在模板内限制调用参数类型的构造函数会发生什么?参数类的对象在模板内无法构造。他们只能从模板的成员函数传入。模板不保存这些对象或者只保存他们的指针。因为构造函数被分离,这些指针在模板外

记录AS混淆代码模板

开启混淆得先在build.gradle文件中把 minifyEnabled false改成true,以及shrinkResources true//去除无用的resource文件 这些是写在proguard-rules.pro文件内的 指定代码的压缩级别 -optimizationpasses 5 包明不混合大小写 -dontusemixedcaseclassnames 不去忽略非公共

C++标准模板库STL介绍

STL的六大组成部分 STL(Standard Template Library)是 C++ 标准库中的一个重要组成部分,提供了丰富的通用数据结构和算法,使得 C++ 编程变得更加高效和方便。STL 包括了 6 大类组件,分别是算法(Algorithm)、容器(Container)、空间分配器(Allocator)、迭代器(Iterator)、函数对象(Functor)、适配器(Adapter)

HTML5文旅文化旅游网站模板源码

文章目录 1.设计来源文旅宣传1.1 登录界面演示1.2 注册界面演示1.3 首页界面演示1.4 文旅之行界面演示1.5 文旅之行文章内容界面演示1.6 关于我们界面演示1.7 文旅博客界面演示1.8 文旅博客文章内容界面演示1.9 联系我们界面演示 2.效果和源码2.1 动态效果2.2 源代码2.3 源码目录 源码下载万套模板,程序开发,在线开发,在线沟通 作者:xcLeigh

周末设计高端企业_集团官网主题Discuz模板

风格名称: 周末设计_高端企业_集团官网 适用版本: Discuz! X3.0、X3.1、X3.2、X3.3、F1.0 风格编码: 使用语言包结构,适合全部编码 周末设计高端企业_集团官网主题Discuz模板

在WinCE的C#编程中,需要静态调用C++的动态库,需要添加using System.Runtime.InteropServices

using System.Runtime.InteropServices;         [DllImport("Win32DLL.dll", EntryPoint = "WriteREG_SZToRegTCHAR")]         private static extern bool WriteREG_SZToRegTCHAR(int iFlag, string regKeyP

【c2】编译预处理,gdb,makefile,文件,多线程,动静态库

文章目录 1.编译预处理:C源程序 - 编译预处理【#开头指令和特殊符号进行处理,删除程序中注释和多余空白行】- 编译2.gdb调试:多进/线程中无法用3.makefile文件:make是一个解释makefile中指令的命令工具4.文件:fprint/fgets/fwrite/fread,ftell/rewind/fseek/fflush4.1 文本文件:FILE结构体4.2 二进制文件:没

如何使用STL中的模板类

在C++中,标准模板库(STL)提供了大量的模板类,这些类可以处理各种类型的数据,从而极大地提高了代码的复用性和灵活性。要使用STL中的模板类,你需要遵循一些基本的步骤和约定。 以下是一些使用STL模板类的基本步骤: 包含头文件: 首先,你需要包含相应的STL头文件,以便能够使用其中的模板类。例如,要使用std::vector,你需要包含<vector>头文件。 cpp复制代码 #incl

PHP中静态(static)调用非静态方法详解

1.PHP中可以静态调用非静态方法么? 今天我被问到PHP中可不可以使用 className::methodName() 的方法来调用一个没有声明static的方法。在我的印象中,我好像是见过这种用法,但又有些不确定。大家都知道,在手册或者教程里,方法被分为静态方法 和非静态方法,通常我们静态调用的方法,肯定是静态方法。 那如果我们调用了非静态方法会怎么样呢?首先做测试。 1

模板的概念及其在C++中的应用

模板是C++中一个强大的特性,它允许程序员定义与类型无关的函数或类,从而在编译时根据具体类型生成特定的代码。模板的出现极大地提高了C++代码的可重用性和灵活性。 模板的概念 模板是C++实现泛型编程的一种工具。泛型编程是一种编程范式,其中算法和数据结构被编写为与特定数据类型无关,从而可以在各种数据类型上重用。模板分为函数模板和类模板两种。 函数模板:允许程序员编写一个函数定义,该函数可以接受