猿哥带你了解flash框架
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.留言:留言内容。
- 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) # 运行程序
运行效果如下图所示:

更多推荐

所有评论(0)