[05] [Flask 快速上手笔记] 04. HTTP 方法x静态文件x渲染模板

HTTP 方法

在预设情况下 Flask 路由的 HTTP 方法只允许 GET
可以透过route()装器的methods参数来处理不同的 HTTP 方法

from flask import request

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return do_the_login()
    else:
        return show_the_login_form()

静态档案

如果你有静态档案,例如 CSS 或是 JavaScript 档案
虽然我只打算写个只回 JSON 格式的纯後端 API,但是因为这是 Flask 的功能还是提一下

只要在专案下建立一个叫做static的资料夹
就可以使用「static」建立生成 URL

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

於是就会产生一个连接到专案中static/style.css的网址

渲染模板

在 python 产生 HTML 并不好玩,不像 PHP
所以 Flask 自动配置了 Jinja 模板引擎,跟 Laravel 的Blade 有 87% 像

可以使用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)

接着 Flask 会在主程序同阶层的templates资料夹里面寻找模板
资料夹结构会像底下这样

/application.py
/templates
    /hello.html

而模板档案内容会长得像底下这样
templates/hello.html

<title>Hello from Flask</title>
{% if name %}
  <h1>Hello {{ name }}!</h1>
{% else %}
  <h1>Hello, World!</h1>
{% endif %}

接着启动 Flask 服务看看画面,的确是依照我们设定的路由规则渲染了模板

更多使用方式可以参考:Jinja 模板文件

重复使用模板元件

可以在文件的:模板继承 找到使用方法
基本上还是跟 Laravel 的 blade 很像

首先在 templates 资料夹中建立共用模板 layout.html

<!doctype html>
<html>
  <head>
    {% block head %}
    <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
    <title>{% block title %}{% endblock %} - My Webpage</title>
    {% endblock %}
  </head>
  <body>
    <div id="content">{% block content %}{% endblock %}</div>
    <div id="footer">
      {% block footer %}
      &copy; Copyright 2021 by <a href="https://tech.ray247k.com/">ray247k</a>.
      {% endblock %}
    </div>
  </body>
</html>

再把刚刚的 hello.html 内容改成

{% extends "layout.html" %}
{% block title %}Index{% endblock %}
{% block head %}
  {{ super() }}
  <style type="text/css">
    .important { color: #336699; }
  </style>
{% endblock %}
{% block content %}
  <h1>Index</h1>
  <p class="important">
    Welcome on my awesome homepage.
{% endblock %}

测试执行结果

在 layout.html 中定义了四个可以被子模板填充的 {% block %} 区块,并给与区块名称

而子模板,也就是原本的 hello.html 中
开头使用{% extends %}声明了他是继承於另一个模板
当使用到这个模板的时候就会先找到他父层的模板,这个宣告必须加在模板最前面!

{{ super() }}则是让我们使用父模板中的内容
在 layout.html 的{% block head %} 区块中,有加入了内容
若是在子模板中不使用{{ super() }}宣告,则不会出现在子模板渲染的内容里

最後就是一个萝卜一个坑,把子模板中相同名称的 block 内容塞进父模板里渲染页面


<<:  D05 - 准备前端环境

>>:  [NestJS 带你飞!] DAY04 - Controller (下)

[Day26] Micro Services

在前几天的 App Engine 与 K8S 中,或许我已经大致的提过 Micro Services...

全球付虚拟信用卡被盗刷余额

全球付Globalcash是虚拟信用卡,支持Visa/MasterCard。为了自己账户的安全,在境...

Day 27 Wireless Attacks - 无线攻击 (Wifite)

今天要来体验的工具是Wifite,标榜只要简单的指令,不需繁琐的步骤或额外的参数就能自动完成扫描、破...

[Day3] Android - Kotlin笔记:高阶函式与 lambda

来理解一下lambda 以下简单介绍lambda的演进 我们一般写一个function: fun s...

[Day 16] JavaScript 网页事件处理

前言 每次接触新的技巧先是感到陌生、好奇,当然一定会有许多不理解的地方,不知到该如何处理,但是随着慢...