FastAPI学习(二)——FastAPI+Jinjia2模板渲染网页(跳转返回渲染页面)

2023-10-30


通过前面的学习,现在我们来看看如何渲染网页,别总是一串原始字母。

官方文档位置:
https://fastapi.tiangolo.com/advanced/templates/
(B站学习网址https://www.bilibili.com/video/av93282315

一、简单实现

首先,必须注意的是,FastAPI这个Python Web框架并没有带渲染的网页模板引擎,但是也正因为如此,它可以使用任何网页模板。
官方例子是jinjia2 。

1、依赖库安装

pip install jinja2 aiofiles

aiofiles是静态网页需要的包

特别说明的是,Starlette 是一个轻量级 ASGI 框架/工具包,FastAPI一大特色。

然后,

2、建立目录

在这里插入图片描述
需要上图箭头目录和文件。注意,其他目录和文件都是我没找到官方这个案例时候,自己尝试拼接jinjia2的弯路。
萌新表示,仔细翻文档是硬道理!!!

然后,

3、item.html文件代码

<html>
<head>
    <title>Item Details</title>
    <link href="{{ url_for('static', path='/styles.css') }}" rel="stylesheet">
</head>
<body>
    <h1>Item ID: {{ id }}</h1>
</body>
</html>

然后,

4、main.py文件代码

from fastapi import FastAPI
import uvicorn as u
from starlette.requests import Request
from starlette.staticfiles import StaticFiles
from starlette.templating import Jinja2Templates

app = FastAPI()

app.mount("/static", StaticFiles(directory="static"), name="static")

# 创建一个templates(模板)对象,以后可以重用。
templates = Jinja2Templates(directory="templates")

# Request在路径操作中声明一个参数,该参数将返回模板。
# 使用templates您创建的渲染并返回TemplateResponse,并request在Jinja2“上下文” 中将用作键值对之一。
@app.get("/items/{id}")
async def read_item(request: Request, id: str):
    return templates.TemplateResponse("item.html", {"request": request, "id": id})


if __name__ == '__main__':
    u.run(app, host="127.0.0.1", port=8080)

最后跑起来,

5、浏览器输入

http://127.0.0.1:8080/items/888888

在这里插入图片描述
h1效果出来咯,剩下的就交给前端的框架啦。。。。

注意:看后台的话,这里没有加CSS样式错误。

二、借用bootstrap模板

1、目录结构与名称:

在这里插入图片描述

2、index.html代码:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
    <meta name="description" content="">
    <meta name="author" content="">
    <link rel="icon" href="../../../../favicon.ico">

    <title>Jumbotron Template for Bootstrap</title>

    <!-- Bootstrap core CSS -->
    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">


    <!-- Custom styles for this template -->
    <link href="../static/jumbotron.css" rel="stylesheet">

  </head>

  <body>

    <nav class="navbar navbar-inverse navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
          <a class="navbar-brand" href="#">Project name</a>
        </div>
        <div id="navbar" class="navbar-collapse collapse">
          <form class="navbar-form navbar-right">
            <div class="form-group">
              <input type="text" placeholder="Email" class="form-control">
            </div>
            <div class="form-group">
              <input type="password" placeholder="Password" class="form-control">
            </div>
            <button type="submit" class="btn btn-success">Sign in</button>
          </form>
        </div><!--/.navbar-collapse -->
      </div>
    </nav>

    <!-- Main jumbotron for a primary marketing message or call to action -->
    <div class="jumbotron">
      <div class="container">
        <h1>Item ID: {{ id }}</h1>
        <h1>Hello, world!</h1>
        <p>This is a template for a simple marketing or informational website. It includes a large callout called a jumbotron and three supporting pieces of content. Use it as a starting point to create something more unique.</p>
        <p><a class="btn btn-primary btn-lg" href="#" role="button">Learn more &raquo;</a></p>
      </div>
    </div>

    <div class="container">
      <!-- Example row of columns -->
      <div class="row">
        <div class="col-md-4">
          <h2>Heading</h2>
          <p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>
          <p><a class="btn btn-default" href="#" role="button">View details &raquo;</a></p>
        </div>
        <div class="col-md-4">
          <h2>Heading</h2>
          <p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>
          <p><a class="btn btn-default" href="#" role="button">View details &raquo;</a></p>
       </div>
        <div class="col-md-4">
          <h2>Heading</h2>
          <p>Donec sed odio dui. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Vestibulum id ligula porta felis euismod semper. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.</p>
          <p><a class="btn btn-default" href="#" role="button">View details &raquo;</a></p>
        </div>
      </div>

      <hr>

      <footer>
        <p>&copy; 2016 Company, Inc.</p>
      </footer>
    </div> <!-- /container -->


    <!-- Bootstrap core JavaScript
    ================================================== -->
    <!-- Placed at the end of the document so the pages load faster -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script>window.jQuery || document.write('<script src="../static/jquery.min.js"><\script>')</script>
    <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
  </body>
</html>

3、main.py代码:

from fastapi import FastAPI
import uvicorn as u
from starlette.requests import Request
from starlette.staticfiles import StaticFiles
from starlette.templating import Jinja2Templates

app = FastAPI()

app.mount("/static", StaticFiles(directory="static"), name="static")

templates = Jinja2Templates(directory="templates")


@app.get("/items/{id}")
async def read_item(request: Request, id: str):
    return templates.TemplateResponse("index.html", {"request": request, "id": id})


if __name__ == '__main__':
    u.run(app, host="127.0.0.1", port=8080)

4、浏览器输入

http://127.0.0.1:8080/items/super888888

这里使用在线css和js文件的方式,所以电脑没有联网是看不错效果的。需要本地css和js文件的方式,则按照bootstrap的开发方式即可。
在这里插入图片描述

5、总结

可以说,FastAPI在灵活性上非常nice,如果有更棒或者更喜欢的网页模板引擎,即可替换jinja2。由于,使用的是Starlette工具包,所以还有更加丰富的应用与功能,更多帮助,可以前往Starlette小星星(名字好可爱)官网帮助。
https://www.starlette.io/templates/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FastAPI学习(二)——FastAPI+Jinjia2模板渲染网页(跳转返回渲染页面) 的相关文章

  • TF map_fn 或 while_loop 用于不同形状的张量列表

    我想处理不同形状的张量序列 列表 并输出另一个张量列表 考虑每个时间戳上具有不同隐藏状态大小的 RNN 就像是 输入 tf ones 1 2 2 tf ones 2 2 3 tf ones 3 2 1 输出 tf zeros 1 2 4 t
  • 当我在 Pandas 中使用 df.corr 时,我的一些列丢失了

    这是我的代码 import numpy as np import pandas as pd import seaborn as sns import matplotlib pyplot as plt data pd read csv dea
  • Angular SlickGrid 对齐标题文本

    我正在使用角度SlickGrid并希望将列标题中的文本居中或右对齐 并非所有列都以相同的方式 我发现 有一个headerCssClass列定义中的属性 但我一直尝试 这种样式似乎从未被应用 对于列定义 id sourceNumber nam
  • Twitter Typeahead 上使用 Bootstrap 3 的 CSS 问题

    随着 Bootstrap 3 的发布 Typeahead 已被删除 取而代之的是 https github com twitter typeahead js https github com twitter typeahead js 我已经
  • 可以用 Django 制作移动应用程序吗?

    我想知道我是否可以在我的网站上使用 Django 代码 并以某种方式在移动应用程序 Flutter 等框架中使用它 那么是否可以使用我现在拥有的 Django 后端并在移动应用程序中使用它 所以就像models views etc 是的 有
  • 如何将 self 传递给装饰器?

    我该如何通过self key下面进入装饰器 class CacheMix object def init self args kwargs super CacheMix self init args kwargs key func Cons
  • Python Pandas 根据另一列的总计从另一个数据帧中选择值

    我下面有一个 DataFrame 但我需要根据取消和订单列从每个代码中选择行 假设代码 xxx 的阶数为 6 1 5 1 阶数为 11 我需要一种算法 可以选择满足总共 11 行的行 阶数为 6 5 如果没有行匹配 则选择最接近的 id 并
  • python 中的 Johansen 协整检验

    我找不到任何有关在处理统计和时间序列分析 pandas 和 statsmodel 的 Python 模块中执行 Johansen 协整检验的功能的参考 有谁知道是否有一些代码可以执行时间序列之间的协整测试 现在 这已在 Python 的 s
  • Apache Spark 中的高效字符串匹配

    我使用 OCR 工具从屏幕截图中提取文本 每个大约 1 5 句话 然而 当手动验证提取的文本时 我注意到时不时会出现一些错误 鉴于文本 你好 我真的很喜欢 Spark 我注意到 1 像 I 和 l 这样的字母被 替换 2 表情符号未被正确提
  • 全高全宽 CSS 布局

    我正在寻找一种方法来创建具有 5 个区域的纯 CSS 无 JavaScript 布局 如下所示 H A B C F
  • 如何使用 Django 项目设置 SQLite?

    我已阅读 Django 文档 仅供参考 https docs djangoproject com en 1 3 intro tutorial01 https docs djangoproject com en 1 3 intro tutor
  • 在Python中计算内存碎片

    我有一个长时间运行的进程 不断分配和释放对象 尽管正在释放对象 但 RSS 内存使用量会随着时间的推移而增加 如何计算发生了多少碎片 一种可能性是计算 RSS sum of allocations 并将其作为指标 即便如此 我该如何计算分母
  • PyTorch DataLoader 对并行运行的批次使用相同的随机种子

    有一个bug https tanelp github io posts a bug that plagues thousands of open source ml projects 在 PyTorch Numpy 中 当并行加载批次时Da
  • 将文本注释到轴并对齐为圆

    我正在尝试在轴上绘制文本并将该文本与圆对齐 更准确地说 有一些具有不同坐标 x y 的点位于该圆内 并使用以下命令创建 ax scatter x y s 100 我想用圆圈连接并标记每个点 Cnameb 文本的坐标由 xp yp 定义 因此
  • 如何从 CSS 选择器中提取类名?

    故事 我目前正在构建一个 ESLint 规则 以警告在 CSS 选择器定位器中使用引导布局导向和角度技术类 目前我在字符串方法中使用简单的子字符串 for var i 0 i lt prohibitedClasses length i if
  • Python 声音(“铃声”)

    我想让一个 python 程序在完成任务时通过发出嘟嘟声来提醒我 目前 我使用import os然后使用命令行语音程序说 进程完成 我更愿意它是一个简单的 铃 我知道有一个函数可以用于Cocoa apps NSBeep 但我认为这与此没有太
  • 如何将回溯/sys.exc_info() 值保存在变量中?

    我想将错误名称和回溯详细信息保存到变量中 这是我的尝试 import sys try try print x except Exception ex raise NameError except Exception er print 0 s
  • 我应该创建一个块还是一个元素 BEM CSS?

    Bem官网说 创建一个块如果一段代码可以被重用并且它不依赖于正在实现的其他页面组件 创建一个元素如果一段代码在没有父实体 块 的情况下无法单独使用 我有一个 关于部分 块 它的元素依赖于父级并且不能在网站中重复使用 如何根据 bem 这段代
  • 对数据帧的每 2 小时数据进行 Groupby

    我有一个数据框 Time T201FN1ST2010 T201FN1VT2010 1791 2017 12 26 00 00 00 854 69 0 87 1792 2017 12 26 00 20 00 855 76 0 87 1793
  • python sklearn中的fit方法

    我问自己关于 sklearn 中拟合方法的各种问题 问题1 当我这样做时 from sklearn decomposition import TruncatedSVD model TruncatedSVD svd 1 model fit X

随机推荐

  • linux调用海康.so

    1 下载SDK 2 把 so包放到一个目录 然后 pro包含 3 把头文件放进去 然后包含 4 上面做的qtcreato可以调用编辑了 如果在源目录下运行需要把库放到 usr lib 5 如果用gnome seiion开机启动还要把hc的文
  • 拉链表...

    目录 什么是拉链表 拉链表的作用 拉链表的形成 什么是拉链表 一张表存储的每一条信息就是一条记录的一个生命周期 这样的表格即为拉链表 拉链表的作用 用于记录一些 会发生变化但是变换频率不高的数据 比如某人的某个手机号使用情概况 通过对于日期
  • java IO学习笔记

    Java 流在处理上分为字符流和字节流 字符流处理的单元为 2 个字节的 Unicode 字符 分别操作字符 字符数组或字符串 而字节流处理单元为 1 个字节 操作字节和字节数组 Java 内用 Unicode 编码存储字符 字符流处理类负
  • 任务五-模型参数优化

    模型参数优化 使用网格搜索法对模型进行调优 调参时采用五折交叉验证的方式 并进行模型评估 网格搜索 网格搜索 其实可以叫穷举搜索 就是在所有候选的参数中 将不同参数组合起来 找出表现最好的一组参数 eg 以有两个参数的模型为例 参数a有3种
  • 导入别人的android studio项目

    在导入别人的android studio项目 假设为项目A 时 会遇到gradle不一致的情况 以下简短介绍解决方法 1 打开要导入的项目的目录 删除下图红框中的文件 2 找到自己以前在自己的android studio的任一项目 假设为项
  • 使用MATLAB快速搭建神经网络实现分类任务(模式识别)(附源码)

    使用神经网络能执行几种典型的任务 聚类 拟合 分类 模式识别 以及时间序列预测 其中分类任务可以说是最常应用的场景之一 在之前的文章里也使用了分类任务作为案例对神经网络进行了入门讲解 时常遇到想要使用神经网络快速地实现分类的同学 今天就讲一
  • Javascript中的shift() 、unshift() 和 pop()、push()区别

    定义一组数据 对其进行添加删除操作 unshift 从头部插入数据 向数组的开头添加一个或更多元素 并返回新的长度 shift 从头部删除数据 把数组的第一个元素从其中删除 并返回第一个元素的值 push 从尾部插入数据 向数组的末尾添加一
  • echarts饼图相关配置及效果展示

    const valData xAxis series data name item typeName value item ylFee feeRatio item feeRatio circleRatio item circleRatio
  • 网络编程6——多线程并发服务器实现(线程分离

    recall一下 代码实现 还是要先封装wrap h 1 socket 2 bind 绑定端口 注意参数 定义初始化强转化 3 listen函数 限定同时访问数 4 loop中 accept等待连接 注意参数 第三个参数长度的类型是sock
  • [lammps教程]OVITO绘制原子应力云图

    在我们用分子动力学模拟力学性能时 应力应变云图是我们模拟结果中常常出现的 如下图为分子动力学的铜铅合金拉伸变形特性的研究一文中铜铅合金剪应力云图 本文介绍如何利用OVITO软件绘制原子应力云图 图参考自 韩浏淼 基于分子动力学的铜铅合金拉伸
  • (附源码)计算机毕业设计SSM基于Eclipse的大学生自我管理系统

    附源码 计算机毕业设计SSM基于Eclipse的大学生自我管理系统 项目运行 环境配置 Jdk1 8 Tomcat7 0 Mysql HBuilderX Webstorm也行 Eclispe IntelliJ IDEA Eclispe My
  • mybatis中 #{}和${}的区别

    简明的解释 是预编译处理 是字符串替换 当做占位符来用 mybatis在处理 时 会将sql中的 替换为 号 调用PreparedStatement的 set方法来赋值 mybatis在处理 时 就是把 替换成变量的值 使用 可以有效的防止
  • AD20元件重叠绿色报错的解决方法,距离太近绿色报错

    有时因为元件靠的太近而导致绿色的报错 但在实际中这样使用是没有问题的 可以人为的消除掉元件间距离检查 距离太近报错的修改方法 设计 规则 将 ComponentClearance 中的 最小间距 都改为 0 最小间距设置为0后 要人为仔细检
  • 四、mybatis第四节

    一 分页插件PageHelper 在我们日常使用中 缺少不了分页查询 就好比你百度时 那么多的数据 肯定需要分页来处理 那么我们就可以用分页插件来帮我们快速实现分页查询操作 首先了解一下分页查询的sql语句 select from 表名 w
  • Docker入门教程(非常详细)从零基础入门到精通,看完这一篇就够了

    目录 一 Docker概述 1 1 Docker 为什么出现 1 2 Dorker历史 1 3 能做什么 虚拟机技术 通过 软件 模拟的具有完整 硬件 系统功能的 运行在一个完全 隔离 环境中的完整 计算机系统 容器化技术 容器化技术不是模
  • PCB走线线宽电流对照表

    在PCB设计的过程中 大电流电路需要特别留意其参数 其几个个决定性因数包括 材质 厚度和宽度 下表为普通铜电路板计算参考
  • LayUI框架——选项卡

    目录 前言 1 动态实现选项卡 1 1 优化dao类 1 2 优化前端JSP页面 1 3 引入头部hand jsp页面 1 4 优化后台主界面js 2 运行效果图 前言 首先效果展示 1 动态实现选项卡 继 上篇博客 实现的导航栏 本篇实现
  • c语言分支结构程序设计教学设计 赛课,《分支结构程序设计》教学设计.doc

    分支结构程序设计 教学设计 潮州市饶平县华侨中学 邮编515700 张远航 Email zyuanhang 教学分析与教学设计思路 一 教学对象分析与教学设计 本教案适用于高中二年级学生 这一阶段的学生具备一定的数学基础和具有一定的比较 归
  • 利用python编程,制作自己的游戏“外挂”!

    Python简介及应用领域 Python是一种解释型脚本语言 可以应用于以下领域 Web 和 Internet开发 科学计算和统计 人工智能 教育 桌面界面开发 软件开发 后端开发 网络爬虫 编程用的好 不仅可以提高工作效率 还能让玩游戏变
  • FastAPI学习(二)——FastAPI+Jinjia2模板渲染网页(跳转返回渲染页面)

    文章目录 一 简单实现 1 依赖库安装 2 建立目录 3 item html文件代码 4 main py文件代码 5 浏览器输入 二 借用bootstrap模板 1 目录结构与名称 2 index html代码 3 main py代码 4