1、烧瓶基础

[example 1] 编写第一个flash程序,代码如下:

from flask import Flask #1. 导入Flask类

"""

2.创建这个类的一个实例。第一个参数是应用程序模块或包的名称。如果使用单个模块(这样的地方),应该使用__name__。

模块的名称会有所不同,具体取决于它是作为单独的应用程序启动还是作为模块导入。这样的 Flask 只知道在哪里可以找到模板、静态文件等。

"""

应用程序 u003d 烧瓶(__name__)

@app.route("/") # 3. 使用 route() 装饰器函数告诉 Flask 什么样的 URL 可以触发执行的函数

def index(): # 4. 查看函数,返回用户浏览器中显示的信息。

返回“你好烧瓶!”

app.debug u003d True 第一种方式:开启调试模式

如果 __name__ u003du003d '__main__':

app.run(debugu003dTrue, portu003d8000) # 第二种方式:作为run()方法的参数传入。您还可以设置其他参数,例如端口号

程序执行结果如下:

然后在浏览器中输入网址:http://127.0.0.1:8000/,运行效果如下图:

2、路由

客户端(例如 Web 浏览器)向 Web 服务器发送请求后,Web 服务器将请求发送到 Flash 程序实例。程序实例需要知道每个 URL 请求运行什么代码,所以它保存了 URL 和 Python 函数的映射关系。处理 URL 和函数之间关系的程序称为路由。

在 flash 程序中定义路由最简单的方法是使用程序实例 Route 装饰器提供的应用程序,它将被装饰的函数注册为路由。路由映射关系如图:

说明:在@app 向route() 函数添加URL 时,URL 有时会发生变化。比如同一作者的不同文章的ID不同,如下:

https://blog.csdn.net/xw1680/article/details/117434720

https://blog.csdn.net/xw1680/article/details/117854388

在这种情况下,您可以构造带有动态部分的 URL,或者将多个规则附加到一个函数。要将变量部分添加到 URL,您可以将这些特殊字段标记为 <变量名>,它将作为命名参数传递给函数。如果要限制变量名的类型,可以用<变量类型:变量名>指定一个可选的类型转换器。

[example 2] 根据不同的用户名参数输出对应的用户信息。代码如下:

from flask import Flask # 导入 Flask 类

应用程序 u003d 烧瓶(__name__)

@app.route("/")

定义索引():

返回“你好烧瓶!”

@app.route("/user/<用户名>")

def 显示_user_info(用户名):

显示用户名的用户信息

return f"用户名为:{username}"

@app.route("/post/int:post\_id") # Int 转换器:接收整数。 float:与 int 相同,但接收浮点数。路径:类似于默认值,但也接收斜杠。

def 显示_post(帖子_id):

文章按照ID显示,为整数数据

返回 f"ID 是:{post_id}"

如果 __name__ u003du003d '__main__':

app.run(调试u003d真)

在浏览器中测试 1:

在浏览器中测试 2:

在浏览器中测试 3:

在浏览器中测试 4:

[示例3] 模拟登录成功后页面跳转到首页的效果。代码如下:

from flask import Flask, url_for, redirect # 导入 Flask 类

应用程序 u003d 烧瓶(__name__)

@app.route("/")

定义索引():

返回“你好烧瓶!”

@app.route("/登录")

定义登录():

模拟登录过程

标志 u003d 真

如果登录成功,跳转到首页

如果标志:

返回重定向(url_for(“索引”))

返回“登录页面”

如果 __name__ u003du003d '__main__':

app.run(调试u003d真)

运行效果如下图所示:

总结:使用URLs_for函数可以构造一个URL,所以经常与redirect()函数结合使用,跳转到构造好的URL页面。

# 返回索引函数对应的路由“/”

url_for('索引')

返回显示_post函数对应的路由“/post/2”

url_for('show\post', post_idu003d2)

返回显示_user_info函数对应的路由“/user/AmoXiang”

url_for('show\user\info', 用户名u003d'AmoXiang')

HTTP(与 Web 应用程序会话的协议)有许多不同的方式来访问 URL。默认情况下,路由只响应 GET 请求,但可以通过 route() 装饰器传递方法参数来更改此行为。例如:

@app.route("/login", methodsu003d["GET", "POST"])

定义登录():

如果 request.method u003du003d "POST":

做\the\login()

其他:

显示\the\login\form()

HTTP 方法(通常也称为谓词)可以告诉服务器客户端想要对请求的页面做什么。常用方法如下:

方法名称

解释

得到

浏览器告诉服务器:只获取页面上的信息并发送给我。这是最常用的方法

浏览器告诉服务器它想要获取信息,但只关心消息头。

邮政

浏览器告诉服务器它想在 URL 上发布新信息。此外,服务器必须确保数据只存储和存储一次。这就是 HTML 表单通常向服务器发送数据的方式

类似于 POST,但服务器可能会多次触发存储过程并多次覆盖旧值。考虑到传输过程中可能会丢失连接,在这种情况下,浏览器和服务器之间的系统可以安全地接收到第二次请求,而不会损坏其他任何东西。因为 POST 只触发一次,所以需要使用 PUT

删除

删除给定位置的信息

选项

为客户端提供一种敏捷的方式来确定此 URL 支持哪些 HTTP 方法。从flash 0.6开始,实现自动处理

动态 Web 应用程序还需要静态文件,这些文件通常是 CSS 和 JavaScript 文件。默认情况下,只要在包中或者模块所在目录下创建一个名为static的文件夹,就可以在应用程序中使用/static访问。比如flask_demo文件夹就是flash中的应用程序目录_demo目录下创建一个静态文件夹。目录结构如下图所示:

要为静态文件生成 URL,您可以使用特殊的静态端点名称。在浏览器中测试如下:

三、模板

模板是包含响应文本的文件,其中包含由占位符变量表示的动态部分。它的具体值只有在请求的上下文中才能知道。用实际值替换变量并返回结果响应字符串称为渲染。为了呈现模板,Flask 使用了一个名为 Jinja2 的强大模板引擎。

默认情况下,Flask 在程序文件夹的模板子文件夹中查找模板。 Flash 使用 render_template() 函数渲染一个模板。语法如下:

def 渲染_template(模板_name_or_list,**context):

注意:render_模板函数需要从Flask包中导入。它的第一个参数是渲染模板的名称,其他参数是模板中变量的值。例如:

返回渲染_template('user.html',usernameu003dname)

如果在视图函数中调用了上述代码,则用户。在模板目录中将被呈现。 HTML 模板文件,并将模板文件中的 {{username}} 替换为 name 的值。

[example 4] 渲染主页模板。在flask_demo目录下创建一个templates文件夹,并新建一个索引。在templates文件夹中的HTML模板文件,如下图所示:

指数。 html中的代码如下:

<!DOCTYPE html>

<HTML浪u003d"恩">

<头部>

<元字符集u003d"UTF-8">

<title>Flask Render 模板案例演示</title>

</head>

<正文>

<h1>AMO的Python日常实践</h1>

<ul idu003d"实践_list">

<li>{{value1}}</li>

<li>{{value2}}</li>

<li>{{value3}}</li>

<li>{{value4}}</li>

</ul>

</正文>

</html>

模板_ 演示。 py中的代码如下:

从烧瓶导入烧瓶,渲染_template

应用程序 u003d 烧瓶(__name__)

@app.route('/')

定义索引():

value1 u003d 《Python日常实践(二十)——使用Python make mini翻译器》

value2 u003d 《Python日常实践(十九)-爬虫GitHub实现网页模拟登录》

value3 u003d 《Python日常实践(十八)-抓小说目录和全文》

value4 u003d 《Python日常实践(十七)-通过正则表达式快速获取电影的下载地址》

value1u003dvalue1 关键字参数

Value1 u003d u003d > 左边的参数名,对应模板中的占位符

value1 u003d u003d> 右边的当前作用域中的变量代表这个参数的值

返回渲染_template("index.html", value1u003dvalue1, value2u003dvalue2, value3u003dvalue3, value4u003dvalue4)

如果 __name__ u003du003d '__main__':

app.run(调试u003d真)

运行效果如下图所示:

Jinja2 可以识别所有类型的变量,甚至是一些复杂的类型,例如列表、字典和对象。在模板中使用变量的一些示例如下:

<li>从列表中取一个值:{{value5[2]}}</li>

<li>从列表中获取一个索引值:{{value5[index]}}</li>

<li>从字典中取一个值:{{my_dict['key']}}</li>

<li>从对象的方法中取值:{{obj.method()}}</li>

您可以使用过滤器来修改变量。过滤器名称添加在变量名称之后,以竖线分隔。例如,以下模板以大写形式显示变量名称的值:

<li>你好,{{name|capitalize}}</li>

Jinja2 提供的一些常用过滤器如下表所示:

姓名

解释

安全的

渲染值时不要转义

大写

将值的第一个字母转换为大写,其他字母转换为小写

降低

将值转换为小写

将值转换为大写

标题

将值中每个单词的首字母转换为大写

修剪

删除值的前导和尾随空格

脱衣舞标签

渲染前删除值中的所有 HTML 标签

默认()

设置默认值。默认值作为参数传入,别名为d

逃脱

转义 HTML 文本,别名 e

第一个 (seq)

返回序列的第一个元素

最后(序列)

返回序列的最后一个元素

长度(对象)

返回变量的长度

随机(序列)

返回序列中的随机元素

最大限度()

返回序列中的最大值

分钟()

返回序列中的最小值

独特的()

返回序列中不重复的值

字数

数单词

tojson()

将变量值转换为 JSON 格式

截短()

截断字符串常用于显示文章摘要,length参数设置截断长度

killwords 参数设置是否截断单词,end 参数设置末尾的符号

[example 5] 计算文章的长度。在templates文件夹中新建文章HTML模板文件,代码如下:

<!DOCTYPE html>

<HTML浪u003d"恩">

<头部>

<元字符集u003d"UTF-8">

<title>统计文章的长度</title>

</head>

<正文>

<p styleu003d"color: red">全文总{{content|count_length}}字</p>

<p styleu003d"color: blue">全文总{{content |长度()}}字</p>

<p>{{内容}}</p>

</正文>

</html>

模板_ demo2。 py中的代码如下:

从烧瓶导入烧瓶,渲染_template

应用程序 u003d 烧瓶(__name__)

def count_length(arg): # # 实现一个可以求长度的函数

返回 len(arg)

app.add\template\filter(count\length, 'count\length')

@app.template_filter() # 使用装饰器

def count_length(arg): # 实现一个可以求长度的函数

返回 len(arg)

@app.route('/')

定义索引():

内容 u003d """

Flask 是一个使用 Python 编写的轻量级 Web 应用程序框架,基于 Werkzeug WSGI Toolbox 和 Jinja2 模板引擎。 Flask 称为微框架,

因为它使用一个简单的核心,并使用扩展来添加其他功能。 Flask 没有默认的数据库、表单验证工具等。但是,Flask 保留了放大的弹性,

可以使用 Flask Extend 并添加这些功能,例如:ORM、表单验证工具、文件上传、各种开放认证技术等等。

"""

返回渲染_template("article.html", contentu003dcontent)

如果 __name__ u003du003d '__main__':

app.run(调试u003d真)

运行效果如下图所示:

Jinja2 提供了多种控制结构,可以用来改变模板的渲染过程。在模板中使用条件控制语句。代码如下:

{% 如果用户 %}

你好,{{用户}}!

{% 其他 % }

你好,保罗!

{% endif %}

使用 for 循环在模板中呈现一组元素。代码如下:

<ul>

{% for comment in comments %}

<li>{{评论}}</li>

{% endfor %}

</ul>

Flask 框架有上下文,Jinja2 模板也有上下文。通常,渲染模板时会调用 render_ template() 函数将变量传递到模板中。此外,您可以使用 set 标签在模板中定义变量,例如:

{% 设置导航 u003d [('/', 'home'), ('/about', '关于')] %}

您还可以将一些模板数据定义为变量,并使用 set 和 endset 标签声明开始和结束,例如:

{% 设置导航 %}

<li><a hrefu003d"/">首页</a></li>

<li><a hrefu003d"/about">关于我们</a></li>

{% 结束集 %}

Flask 在模板上下文中提供了一些内置的全局变量,可以直接在模板中使用。内置全局变量及其说明如下表所示:

属性

解释

配置

当前配置对象

要求

当前请求对象在激活的请求环境中可用

会议

当前会话对象在活动请求环境中可用

G

请求绑定的全局变量,在激活的请求环境中可用

模板继承类似于 Python 中的类继承。 Jinja2允许你定义一个基础模板(也称为父模板),将网页的导航栏、页脚等通用内容放在基础模板中,每个继承基础模板的子模板都会自动包含这些部分渲染时。这样,您可以避免在多个模板中编写重复的代码。在 jinja2 中,子模板使用 extensions 标签从父模板继承。父模板,代码如下:

{% 包括 '_nav.html' %}

{% 块内容 %}

{% 端块 %}

{% 包括 '_footer.html' %}

注意:以上代码中,include标签用于引入_nav.html导航栏和_footer.html文件,如html底部的信息栏。然后使用块标记作为占位符并将其命名为内容。父模板中的占位符将替换为子模板中名为 content 的块标签的内容。

子模板,代码如下:

{% 扩展 'base.html' %}

{% 块内容 %}

在父模板内容内容中使用块标签替换。

{% 端块 %}

在开发过程中,经常需要提示用户当前操作成功或失败。比如在添加商品信息页面,如果添加成功,则提示添加成功,否则提示添加失败。为了满足这个需求,flash 提供了一个非常有用的 flash() 函数,可以用来闪现需要展示给用户的消息。 flash() 函数的语法格式如下:

flash(消息,类别)

参数说明:

1.留言:留言内容。

  1. category:消息类型,用于对不同消息内容进行分类。

flash() 函数通常在视图函数中调用,在引入消息内容时会闪现一条消息。当然,它不会在用户的浏览器中弹出消息。实际上,使用 flash() 函数发送的消息将存储在 Session 中。您需要使用模板中的全局函数get_ flashed_ Messages() 获取消息列表并显示它。

注意:通过flash()函数发送的消息会保存在session对象中,所以需要给程序设置key。您可以使用应用程序 SECRET_KEY 属性或配置变量 SECRET_KEY 设置。

[example 6] 注册错误处理函数,自定义错误页面。 404.html模板内容代码如下:

<!DOCTYPE html>

<HTML浪u003d"恩">

<头部>

<元字符集u003d"UTF-8">

<title>404 页面</title>

</head>

<正文>

<img srcu003d"{{url_for('static',filenameu003d'images/404.png')}}" altu003d"404 page">

</正文>

</html>

错误。 py中的代码如下:

从烧瓶导入烧瓶,渲染_template

应用程序 u003d 烧瓶(__name__)

app.secret_key u003d "amoxiang" # 设置密码_key

@app.route('/')

定义索引():

返回渲染_template("index.html")

@app.errorhandler(404)

定义页面_not_found(e):

返回渲染_template('404.html')

如果 __name__ u003du003d '__main__':

app.run(debugu003dTrue) # 运行程序

运行效果如下图所示:

Logo

Python社区为您提供最前沿的新闻资讯和知识内容

更多推荐