vlambda博客
学习文章列表

Flask 用户指南 - 快速入门(2)

Flask 快速入门(2

 

HTML 转义

 

返回 HTMLFlask 中的默认响应类型)时,必须转义输出中呈现的任何用户提供的值,以防止注入攻击。稍后介绍的使用 Jinja 呈现的 HTML 模板将自动执行此操作。

 

此处显示的 escape() 可以手动使用。为了简洁起见,在大多数示例中都省略了它,但您应该始终注意如何使用不受信任的数据。

 

from flask import Flaskfrom markupsafe import escape
app = Flask(__name__)
@app.route("/<name>")def hello(name): return f"Hello, {escape(name)}!"

 

注意:

如果遇到错误:Error: Could not locate a Flask application. You did not provide the "FLASK_APP" environment variable, and a "wsgi.py" or "app.py" module was not found in the current directory.

 

可以先执行如下命令设置环境变量:$en

 

如果用户提交的名称(name)值为 <script>alert("bad")</script>,则转义会将其呈现为文本,而不是在用户浏览器中运行脚本。

 

路由中的 <name> URL 捕获一个值,并将其传递给视图函数。后面会解释这些变量规则。

 

路由

 

现代 web 应用程序使用有意义的 URL 来帮助用户。如果某个页面使用了一个有意义的 URL,用户更可能喜欢该页面,并返回该页面,他们可以记住并使用该 URL 直接访问该页面。

 

使用 route() 装饰器将函数绑定到 URL

 

@app.route('/')def index(): return 'Index Page'
@app.route('/hello')def hello(): return 'Hello, World'

 

还可以做得更多!我们可以使 URL 的某些部分成为动态的,并将多个规则附加到一个函数。

 

变量规则

 

通过使用 <variable_name> 标记,可以将可变部分添加到 URL。然后,函数将 <variable_name> 作为关键字参数接收。或者,可以使用转换器指定参数的类型,如 <converter:variable_name>

 

from markupsafe import escape
@app.route('/user/<username>')def show_user_profile(username): # show the user profile for that user return f'User {escape(username)}'
@app.route('/post/<int:post_id>')def show_post(post_id): # show the post with the given id, the id is an integer return f'Post {post_id}'
@app.route('/path/<path:subpath>')def show_subpath(subpath): # show the subpath after /path/ return f'Subpath {escape(subpath)}'

 

转换器类型

 

string

(默认)接受任何不带斜杠的文本

int

接受正整数

float

接受正的浮点值

path

类似于string,但也接受斜杠

uuid

接受UUID字符串

 

唯一URL / 重定向行为

 

以下两条规则在尾部斜杠的使用上有所不同。

 

@app.route('/projects/')def projects(): return 'The project page'
@app.route('/about')def about(): return 'The about page'

 

projects 端点的规范 URL 后面有一个斜杠。它类似于文件系统中的文件夹。如果访问 URL 时没有尾随斜杠(/projects),Flask 会将您重定向到带有尾随斜杠(/projects/)的规范 URL

 

about 端点的规范 URL 没有尾随斜杠。它类似于文件的路径名。使用尾随斜杠(/about/)访问 URL 会产生 404 Not Found” 错误。这有助于保持这些资源的 URL 的唯一性,有助于搜索引擎避免对同一页面进行两次索引。

 

构造 URL

 

要生成特定函数的 URL,请使用 url_for() 函数。它接受函数名作为第一个参数和任意数量的关键字参数,每个参数对应于 URL 规则的一个可变部分。未知变量部分作为查询参数附加到 URL

 

为什么要使用 URL 反向函数 url_for() 构建 URL,而不是将它们硬编码到模板中?

 

1. 反向构造通常比硬编码 URL 更具描述性。

 

2. 可以一次性更改所有 URL,而无需记住需要手动更改硬编码的 URL

 

3. 构造 URL 能透明地处理特殊字符的转义。

 

4. 生成的路径总是绝对的,避免了浏览器中暴露相对路径的意外行为。

 

5. 如果应用程序位于 URL 根目录之外,例如,在 /myapplication 而不是 /url_for() 会正确地处理该问题。

 

例如,这里我们使用 test_request_context() 方法来尝试 url_for()test_request_context() 告诉 Flask,即使在我们使用 Python shell 时,它也要像处理请求一样行事。

 

from flask import url_for
@app.route('/')def index(): return 'index'
@app.route('/login')def login(): return 'login'
@app.route('/user/<username>')def profile(username): return f'{username}\'s profile'
with app.test_request_context(): print(url_for('index')) print(url_for('login')) print(url_for('login', next='/')) print(url_for('profile', username='John Doe'))

 

 

 

原文:

https://flask.palletsprojects.com/en/2.0.x/quickstart/