Python Flask实现蓝图Blueprint配置和模块渲染

news2024/11/27 9:58:30

 Python基础学习:

  • Pyhton 语法基础
  • Python 变量
  • Python控制流
  • Python 函数与类
  • Python Exception处理
  • Python 文件操作
  • Python 日期与时间
  • Python Socket的使用
  • Python 模块
  • Python 魔法方法与属性

Flask基础学习:

  • Python中如何选择Web开发框架?
  • Python Flask 入门开发
  • 如何使用virtualenv实现python环境的隔离?
  • Python中使用国内源头下载依赖
  • Python Flask 路由配置
  • Flask 使用Context上下文
  • Python Flask实现蓝图Blueprint配置和模块渲染 

蓝图(BluePrint)

蓝图(Blueprint)是Flask实现的应用模块化,通过模块化的方式分割视图,让应用的层次更加清晰,更加便于开发者开发和维护项目。通过蓝图,我们可以创建一组相同前缀的路由组合,可以用于分割应用不同的服务。如应用有两个服务:认证服务和用户服务,我们可以通过模块化分割服务,然后通过Flask注册不同前缀的蓝图。

创建main服务

先创建一个main服务,代码如下:

1、创建main.py文件

# main.py
# !/usr/bin/env python
# -*-coding:utf-8 -*-
from datetime import datetime
from flask import render_template,session,redirect,url_for,abort,request,Blueprint
main = Blueprint('main', __name__)



@main.route('/index')
def index(item_name="dashboard", **kwargs):
    return render_template('manager/index.html', item_name=item_name, kwargs=kwargs)


@main.route('/user/<username>')
def user(username):
    return render_template('user.html', user=user)

2、创建api.py文件

# !/usr/bin/env python
# -*-coding:utf-8 -*-
from flask import jsonify, request,make_response,Blueprint,Flask
from. import api


@api.route('/post/', methods=['POST'])
def post():
    json = request.json
    print(str(json))
    post1 = Post.from_json(json)
    db.session.add(post1)
    db.session.commit()
    return jsonify({
        "status": 1,
        "response": u"提交成功"
    })

3、注册Blueprint

# !/usr/bin/env python
# -*-coding:utf-8 -*-
from flask import Flask,render_template,Response
from flask_cors import CORS

def create_app(config_name):
    app = Flask(__name__)
     # 注册main服务
    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint, url_prefix='/manager')
    # 注册api服务
    from app.api import api as api_blueprint
    CORS(api_blueprint, supports_credentials=True)
    app.register_blueprint(api_blueprint, url_prefix='/api/v1.0')
    return app

 模块渲染(Template)

使用Flask可以直接在路由中返回Html文档,但处理起来比较麻烦。因此,Flask框架默认支持Jinja2末班引擎,可通过flask提供的内置方法render_template直接进行渲染,我们只需要提供html的相对路径即可,flask中默认模板目录为templates

如下通过一个示例看下flask中的模板渲染如何使用:

from flask import render_template,Flask

app = Flask(__name__)

@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
    return render_template('base.html', name=name)

if __name__ == '__main__':
    app.run()

Jinja2 模板引擎

Jinja2 是一个现代的,设计者友好的,仿照 Django 模板的 Python 模板语言。 它速度快,被广泛使用,并且提供了可选的沙箱模板执行环境保证安全:4

<title>{% block title %}{% endblock %}</title>
<ul>
{% for user in users %}
  <li><a href="{{ user.url }}">{{ user.username }}</a></li>
{% endfor %}
</ul>

变量使用

Flask可以通过Jinja2模板将Python中的变量传递到html模板中。如下通过py和html中来了解如何使用:

// demo.py
from flask import Flask, render_template
 
 
app = Flask(__name__)
 
 
@app.route('/args')
def temp_jinja2():
    data = {
        'Python': '编程语言',
        'Flask': 'Web 框架',
        'Jinja2': '模板引擎',
        'HTML': '前端语言'
    }
    return render_template('route_two.html', data=data)
 
 
if __name__ == '__main__':
    app.run(debug=True)

如上,通过render_template传递jinja2参数。html使用变量如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Jinja2 Args</title>
</head>
<body>
<h2 style="color: red">获取 data 中的数据:</h2>
<p style="color: blue"> {{ data['Python'] }} </p>
<p style="color: blue"> {{ data['Flask'] }} </p>
<p style="color: blue"> {{ data.Jinja2 }} </p>
<p style="color: blue"> {{ data.HTML }} </p>
<br/>
{% if data %}
    {{ data.keys() }}
{% else %}
    <p style="color: blue"> Hello Jinja2 ! </p>
{% endif %}
<br/>
<br/>
{% for key in data.keys() %}
    <div>
        <p style="color: rebeccapurple"> {{ key }} : {{ data[key] }} </p>
    </div>
{% endfor %}
</body>
</html>

过滤器

Flask中模板过滤器的使用是通过管道符(|)分割,也 可以用圆括号传递可选参数。多个过滤器可以链式调用,前一个过滤器的输出会被作为 后一个过滤器的输入。如 {{ name|striptags|title }} 会移除 name 中的所有 HTML 标签并且改写 为标题样式的大小写格式。其使用格式如下:

// 使用格式
{% 变量 | 过滤器名 %} 

// 示例
{# 关闭HTML自动转义 #}
<p>{{ '<em>name</em>' | safe }}</p> 

常见的内置过滤器:

  • abs(number):返回参数的绝对值。
  • attr(objname):获取对象的属性。 foo|attr(‘bar’) 像 foo[‘bar’] 一样工作,只是总是返回一个属性并且不查找项目。
  • batch(valuelinecountfill_with=None):批处理项目的过滤器。它的工作原理与 slice 非常相似,只是反过来。它返回具有给定项目数的列表列表。如果您提供第二个参数,则该参数用于填充缺失的项目。
  • capitalize(s):大写一个值。第一个字符将是大写的,所有其他字符都是小写的。
  • center(valuewidth=80):将给定宽度的字段中的值居中。
  • default(valuedefault_value=u”boolean=False):如果该值未定义,它将返回传递的默认值,否则返回值。
  • dictsort(valuecase_sensitive=Falseby=’key’):对 dict 和 yield (key, value) 对进行排序。
  • escape(s):将字符串 s 中的字符 &、 、 、 ‘ 和 ” 转换为 HTML 安全序列。如果您需要在 HTML 中显示可能包含此类字符的文本,请使用此选项。将返回值标记为标记字符串。
  • filesizeformat(valuebinary=False):将值格式化为“人类可读”的文件大小(即 13 kB、4.1 MB、102 字节等)。默认使用十进制前缀(Mega、Giga 等),如果第二个参数设置为 True,则使用二进制前缀(Mebi、Gibi)
  • first(seq):返回序列的第一项。
  • float(valuedefault=0.0):将值转换为浮点数。如果转换不起作用,它将返回 0.0。您可以使用第一个参数覆盖此默认值。
  • forceescape(value):强制 HTML 转义。这可能会使转义变量加倍。
  • format(value*args**kwargs):在对象上应用 python 字符串格式。
  • groupby(valueattribute):按公共属性对一系列对象进行分组。
  • indent(swidth=4indentfirst=False):返回传递的字符串的副本,每行缩进 4 个空格。第一行没有缩进。
  • int(valuedefault=0):将值转换为整数。如果转换不成功,它将返回 0。
  • join(valued=u”attribute=None):返回一个字符串,它是序列中字符串的串联。
  • last(seq):返回序列的最后一项。
  • length(object):返回序列或映射的项目数。
  • list(value):将值转换为列表。如果它是一个字符串,则返回的列表将是一个字符列表。
  • lower(s):将值转换为小写。
  • map():对一系列对象应用过滤器或查找属性。这在处理对象列表时很有用,但您实际上只对它的某个值感兴趣。
  • pprint(valueverbose=False):漂亮地打印一个变量。对调试很有用。
  • random(seq):从序列中返回一个随机项。
  • reject():通过对对象或属性应用测试并拒绝测试成功的对象来过滤一系列对象。
  • rejectattr():通过对对象或属性应用测试并拒绝测试成功的对象来过滤一系列对象。
  • replace(soldnewcount=None):返回值的副本,所有出现的子字符串都替换为新的子字符串。
  • reverse(value):反转对象或返回一个迭代器,以相反的方式迭代它。
  • round(valueprecision=0method=’common’):将数字四舍五入到给定的精度。
  • safe(value):将该值标记为安全的,这意味着在启用了自动转义的环境中,该变量将不会被转义。
  • select():通过对对象或属性应用测试并仅选择测试成功的对象来过滤一系列对象。
  • selectattr():通过对对象或属性应用测试并仅选择测试成功的对象来过滤一系列对象。
  • slice(valueslicesfill_with=None):切片迭代器并返回包含这些项目的列表列表。
  • sort(valuereverse=Falsecase_sensitive=Falseattribute=None):对可迭代对象进行排序。默认情况下它按升序排序,如果您将它作为第一个参数传递 true 它将反转排序。
  • string(object):如果还没有,请创建一个字符串 unicode。这样标记字符串就不会转换回 unicode。
  • striptags(value):去除 SGML/XML 标签并将相邻的空格替换为一个空格。
  • sum(iterableattribute=Nonestart=0):返回数字序列加上参数“start”的值(默认为 0)的总和。当序列为空时,它返回开始。
  • title(s):返回值的标题版本。 IE。单词将以大写字母开头,所有其余字符均为小写字母。
  • trim(value):去除前导和尾随空白。
  • truncate(slength=255killwords=Falseend=’…’):返回字符串的截断副本。长度由第一个参数指定,默认为 255。
  • upper(s):将值转换为大写。
  • urlencode(value):用于 URL 的转义字符串(使用 UTF-8 编码)。它接受字典和常规字符串以及成对的可迭代对象。
  • urlize(valuetrim_url_limit=Nonenofollow=False):将纯文本的 URL 转换为可点击的链接。
  • wordcount(s):计算该字符串中的单词。
  • wordwrap(swidth=79break_long_words=Truewrapstring=None):返回传递给过滤器的字符串副本,在 79 个字符后换行。
  • xmlattr(dautospace=True):根据字典中的项目创建 SGML/XML 属性字符串。

示例代码

视图函数:

from flask import Flask, render_template

# todo 初始化Flask项目的服务
app = Flask(__name__)

student = {'name': 'kobe', 'age': 14, 'gender': '男'}

@app.route('/str')
def test1():
    return render_template('04-字符串的过滤器.html',**student)  #为了方便在模板中使用,可以把字典打伞


if __name__ == '__main__':
    # 0.0.0.0:代表当前的系统的所有的ip地址,
    # 设置端口为8080,
    # flask的debug模式:把错误的信息显示到页面中
    app.run(host='0.0.0.0', port=8080, debug=True)

模板文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>字符串的过滤器</title>
</head>
<body>

{# 当变量数据没有传入数据的时候,可以给变量设置默认值 #}
<p>{{ name | default('自律') }}</p>
<P>{{ name1 | default('自爱') }}</P>

{# 单词首字母大写 #}
<p>{{ 'hello world' | capitalize }}</p> 

{# 单词全小写 #}
<p>{{ 'XML' | lower }}</p> 

{# 去除字符串前后的空白字符 #}
<p>{{ ' hello ' | trim }}</p> 

{# 字符串反转,返回"olleh" #}
<p>{{ 'hello' | reverse }}</p> 

{# 格式化输出,返回"Number is 99" #}
<p>{{ '%s is %d' | format("Number", 99) }}</p> 

{# 关闭HTML自动转义 #}
<p>{{ '<em>name</em>' | safe }}</p> 

{% autoescape false %}{# HTML转义,即使autoescape关了也转义,可以缩写为e #}
<p>{{ '<em>name</em>' | escape }}</p>
{% endautoescape %}
</body>
</html>

 静态文件配置

Flask框架默认静态文件的目录为根目录下的static目录,默认模板文件目录为templates,或者也可以通过Flask来设置静态文件目录、模板目录、以及静态访问前缀。Flask支持的设置参数如下:

    def __init__(
        self,
        import_name: str,  
        static_url_path: t.Optional[str] = None,
        static_folder: t.Optional[t.Union[str, os.PathLike]] = "static",
        static_host: t.Optional[str] = None, 
        host_matching: bool = False,
        subdomain_matching: bool = False,
        template_folder: t.Optional[str] = "templates",
        instance_path: t.Optional[str] = None,
        instance_relative_config: bool = False,
        root_path: t.Optional[str] = None,
    )

如下,我们可以通过一个示例来看一下如何设置:

from flask import Flask

app = Flask(import_name=__name__,
            static_url_path='/',
            static_folder='static',
            template_folder='templates')

如下,通过一个示例来看下如何配置静态文件。

创建main.py

from flask import Flask, render_template


app = Flask(import_name=__name__, static_url_path='/',
            static_folder='static', template_folder='templates')


# 添加html访问路由
@app.route('/')
def blog():
    return render_template('index.html')


if __name__ == "__main__":
    app.run()  # 默认设置host:0.0.0.0 port:5000

创建静态文件和模板文件

如下所示,在模板中我们可以通过url_for来访问获取静态文件,格式如下:

url_for(<static-folder>,<static-relative-path) # 社会静态目录和相对静态目录的静态文件地址

访问结果

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

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

相关文章

《大道平渊》· 拾 —— 身心的“肥胖”与我们不知饥渴的病:追求中的丰盈与节制

《平渊》 拾 "水满则溢&#xff0c;月盈则亏。" 《道德经》有言&#xff1a;"水满则溢&#xff0c;月盈则亏"。 意思是&#xff1a;水满了就会溢出&#xff0c;月亮最圆的时候就会走向亏的状态。 这揭示了自然界和人类社会中一切事物的内在规律 —— 任…

经典算法 - 回溯法

文章目录 1. 基本概念2. 组合问题3. 组合总和Ⅲ4. 电话号码的字母组合5. 分割回文串6. 复原IP地址7. 子集8. 全排列9. 全排列Ⅱ10. N皇后11. 解数独 1. 基本概念 递归和回溯相辅相成。只要有递归&#xff0c;就会有回溯。 回溯法是一种纯暴力的搜索&#xff0c;并不是一种高效…

特征选择|模型解释|Pearson相关系数|JS散度|SHAP算法

文章目录 1 特征工程2 特征选择3 相关性分析3.1 皮尔逊相关系数3.2 皮尔逊相关系数 - python实现3.3 JS散度3.4 JS散度 - python实现 4 模型解释算法4.1 SHAP4.2 SHAP - python实现4.3 SHAP值解读4.4 SHAP 瀑布图4.5 SHAP 柱状图4.6 SHAP 蜂巢图4.7 SHAP其他图像形式4.7.1 单点…

selenium非全新的方式同时启动多个浏览器又互不影响的一种实现方法,欢迎讨论!

最近在做模拟浏览器批量定时自动点击实现批量操作功能&#xff0c;主要使用selenium&#xff0c;但是发现selenium直接调用本地浏览器&#xff0c;启动的是一个全新的&#xff08;与手动打开的不一致&#xff09;&#xff0c;网站可以检测到&#xff0c;每次都要双重验证(密码登…

Elasticsearch 管道查询语言 ES|QL 现已正式发布

作者&#xff1a;Costin Leau, George Kobar 今天&#xff0c;我们很高兴地宣布 ES|QL&#xff08;Elasticsearch 查询语言&#xff09;全面上市&#xff0c;这是一种从头开始设计的动态语言&#xff0c;用于转换、丰富和简化数据调查。在新的查询引擎的支持下&#xff0c;ES|Q…

14_Node.js和NPM入门指南

文章目录 NodeJS1.nodejs下载2.NPM的配置和使用3.NPM对一个项目进行初始化操作4.NPM本地仓库进行依赖下载5.查看当前项目有哪些依赖 https://www.npmjs.com/package NodeJS JS代码运行在哪里 1.浏览器2.nodejs 内置谷歌浏览器v8引擎 nodejs具有io磁盘 读写能力。类似java代码和…

找嵌入式软件工作,freertos要掌握到什么程度?

对于嵌入式软件工程师来说&#xff0c;掌握RTOS&#xff08;实时操作系统&#xff09;的程度并不是决定性因素&#xff0c;而更重要的是工程思维和解决问题的能力。我这里有一套嵌入式入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习嵌入式…

AI炒股:用kimi获取美股实时行情数据并保存到Excel

在kimi中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个编写Python脚本的任务&#xff0c;具体步骤如下&#xff1a; 获取美股实时美股行情数据&#xff0c;然后保存在F盘的Excel文件中&#xff0c;Excel文件名为&#xff1a;usstock20240605.xlsx 实…

创新实训2024.06.03日志:完善Baseline Test框架、加入对Qwen-14B的测试

1. Baseline Test框架重构与完善 在之前的一篇博客中&#xff08;创新实训2024.05.29日志&#xff1a;评测数据集与baseline测试-CSDN博客&#xff09;&#xff0c;我介绍了我们对于大模型进行基线测试的一些基本想法和实现&#xff0c;包括一些基线测试的初步结果。 后来的一…

双指针问题1

文章目录 1. 移动零&#xff08;283&#xff09;2. 复写零&#xff08;1089&#xff09;3. 快乐数&#xff08;202&#xff09;4. 盛最多水的容器&#xff08;11&#xff09; 1. 移动零&#xff08;283&#xff09; 题目描述&#xff1a; 算法原理&#xff1a; 设置两个指针…

​​​​【动手学深度学习】残差网络(ResNet)的研究详情

目录 &#x1f30a;1. 研究目的 &#x1f30a;2. 研究准备 &#x1f30a;3. 研究内容 &#x1f30d;3.1 残差网络 &#x1f30d;3.2 练习 &#x1f30a;4. 研究体会 &#x1f30a;1. 研究目的 了解残差网络&#xff08;ResNet&#xff09;的原理和架构&#xff1b;探究残…

javaweb的新能源充电系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;充电桩管理&#xff0c;报修管理&#xff0c;新能源公告管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;充电桩&#xff0c;新…

快速了解JVM机制

1.JVM 简介 JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java虚拟机。 虚拟机是指通过软件模拟的具有完整硬件功能的、运⾏在⼀个完全隔离的环境中的完整计算机系统。 常⻅的虚拟机&#xff1a;JVM、VMwave、Virtual Box。 JVM 和其他两个虚拟机的区别&#xff1a; V…

基于SpringBoot+Vue电影院选票系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还…

查询SQL02:寻找用户推荐人

问题描述 找出那些 没有被 id 2 的客户 推荐 的客户的姓名。 以 任意顺序 返回结果表。 结果格式如下所示。 题目分析&#xff1a; 这题主要是要看这null值会不会用&#xff0c;如果说Java玩多了&#xff0c;你去写SQL时就会有问题。在SQL中判断是不是null值用的是is null或…

(CVPRW,2024)可学习的提示:遥感领域小样本语义分割

文章目录 相关资料摘要引言方法训练基础类别新类别推理 相关资料 论文&#xff1a;Learnable Prompt for Few-Shot Semantic Segmentation in Remote Sensing Domain 代码&#xff1a;https://github.com/SteveImmanuel/OEM-Few-Shot-Learnable-Prompt 摘要 小样本分割是一项…

Nvidia Jetson/Orin +FPGA+AI大算力边缘计算盒子:公路智能巡检解决方案

项目背景 中国公路网络庞大&#xff0c;总里程超过535万公里&#xff0c;高速公路里程位居世界前列。面对基础设施存量的不断增长&#xff0c;公路养护管理已迈入“建管养并重”的新时代。随着养护支出的逐年攀升&#xff0c;如何提升养护效率、降低管理成本&#xff0c;成为亟…

JWT及单点登录实现

JWT发展简史 JWT Token JSON Web Token (JWT&#xff0c;RFC 7519 (opens new window))&#xff0c;是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准&#xff08;(RFC 7519)。 ID Token OIDC (OpenID Connect) 协议 (opens new window)对 OAuth 2.0 协议 …

Nginx编译安装+nginx模块

一、I/O模型 处理高并发的时候用 1.1I/O模型简介 同步/异步&#xff08;消息反馈机制&#xff09;&#xff1a;关注的是消息通信机制&#xff0c;即调用者在等待一件事情的处理结果时&#xff0c;被调用者是否提供完成状态的通知。 同步&#xff1a;synchronous&#xff0c;…

【kubernetes】探索k8s集群的配置资源(secret和configma)

目录 一、Secret 1.1Secret 有四种类型 1.2Pod 有 3 种方式来使用 secret 1.3应用场景&#xff1a;凭据 1.4创建 Secret 1.4.1用kubectl create secret命令创建Secret 1.4.2内容用 base64 编码&#xff0c;创建Secret 1.4.2.1Base64编码 1.4.2.2创建YAML文件 1.4.2.3…