• 【Flask】静态文件与模板渲染


    前序文章:
    Flask启程与实现一个基于Flask的最小应用程序

    静态文件Static Files

    静态文件主要是web应用中会使用一些图片,css文件,js文件等去实现一个优雅的网页。这也是动态网站不可或缺的内容。那么Flask会为你解决它。

    用Flask文档来说: Just create a folder called static in your package or next to your module and it will be available at /static on the application. 也就是说,在项目路径中创建static文件夹,或者在模块同一级创建/static文件夹即可,flask会在这些路径去寻找静态文件内容。
    静态文件在系统中也是会有一个路径,假如应用中有个static/style.css的文件。 那么就可以使用如下方式去定位:

    url_for('static', filename='style.css')
    
    • 1

    模板渲染Rendering Templates

    如果使用Python去通过字符串拼接等等方式去构建一个HTML页面,恐怕会把人累死。除此之外,你还不得不考虑注入攻击等。有了这个需求后,就出现了一个模板引擎的概念,通俗的说:这个玩意能够在页面端将html代码以及flask应用返回的数据进行动态整合,然后渲染成html代码在浏览器端展示。如果了解过Java中JSP、Thymeleaf应该就懂了。Flask默认使用到模板渲染引擎是Jinja2.

    渲染一个模板(一个html)使用的是render_template()方法。那么我们所要做的就是提供模板的名称和要作为关键字参数传递给模板引擎的变量。下面是一个如何渲染模板的简单示例:

    from flask import render_template
    
    @app.route('/hello/')
    @app.route('/hello/<name>')
    def hello(name=None):
        return render_template('hello.html', name=name)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    Flask将会从templates文件夹中查找对应的文件,这个templates存放地址与static类似。可以参考如下理解:

    1. 模块
      /application.py
      /templates
          /hello.html
      
      • 1
      • 2
      • 3
    /application
        /__init__.py
        /templates
            /hello.html
    
    • 1
    • 2
    • 3
    • 4

    那么对于模板,我们可以使用 Jinja2 模板的全部功能。这也不得不去了解一下Jinja2的文档了:Jinja2.
    下面就是一个模板使用案例:

    <!doctype html>
    <title>Hello from Flask</title>
    {% if name %}
      <h1>Hello {{ name }}!</h1>
    {% else %}
      <h1>Hello, World!</h1>
    {% endif %}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在模板中,我们还可以访问 config、request、session 和 g 这些对象以及 url_for()get_flashed_messages() 函数。这些是什么玩意后面再继续介绍,总之可以在模板里直接使用。

    一些页面有公共的部分,如页眉、导航和页脚,如果能够把公共的部分放到一个模板里,其他的模板能够简单复用就好了。这就是模板的继承(inheritance)。这个是需要深入了解的,可以参考官方。

    启用了自动转义,因此如果name包含 HTML,它将自动转义。如果我们可以信任一个变量并且知道它是安全的 HTML(例如,因为它来自将 wiki 标记转换为 HTML 的模块),我们可以使用 Markup 类或使用 | safe 过滤器将其标记为安全模板。

    Markup类使用的简单介绍:

    from markupsafe import MarkUp
    print(Markup('<strong>Hello %s!</strong>') % '<blink>hacker</blink>')
    # Markup('<strong>Hello &lt;blink&gt;hacker&lt;/blink&gt;!</strong>')
    print(Markup.escape('<blink>hacker</blink>'))
    # Markup('&lt;blink&gt;hacker&lt;/blink&gt;')
    print(Markup('<em>Marked up</em> &raquo; HTML').striptags())
    # Marked up » HTML
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    总结

    好了,今天就了解这么多了。去看看论文咯。

  • 相关阅读:
    【Nodejs】使用robotjs控制鼠标键盘 自动点击屏幕上指定位置的图标 实现连接wifi等操作
    【实操记录】Oracle数据整库同步至Apache Doris
    MCU如何选型?
    二阶段day1
    “熊猫视图”.Net图形控件功能介绍 [五]:视图平移
    盛会落幕,精彩延续 | 云扩科技入选《2022中国AI商业落地市场研究报告》
    接口自动化框架
    linux 安装 Anaconda3
    【Python计算机视觉】Python全栈体系(二十四)
    Vue3 + ts +vite + elementplus
  • 原文地址:https://blog.csdn.net/meiqi0538/article/details/125565277