在预设情况下 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 %}
© 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 内容塞进父模板里渲染页面
>>: [NestJS 带你飞!] DAY04 - Controller (下)
在前几天的 App Engine 与 K8S 中,或许我已经大致的提过 Micro Services...
全球付Globalcash是虚拟信用卡,支持Visa/MasterCard。为了自己账户的安全,在境...
今天要来体验的工具是Wifite,标榜只要简单的指令,不需繁琐的步骤或额外的参数就能自动完成扫描、破...
来理解一下lambda 以下简单介绍lambda的演进 我们一般写一个function: fun s...
前言 每次接触新的技巧先是感到陌生、好奇,当然一定会有许多不理解的地方,不知到该如何处理,但是随着慢...