Flask 用户指南 - 快速入门(2)
Flask 快速入门(2)
HTML 转义
返回 HTML(Flask 中的默认响应类型)时,必须转义输出中呈现的任何用户提供的值,以防止注入攻击。稍后介绍的使用 Jinja 呈现的 HTML 模板将自动执行此操作。
此处显示的 escape() 可以手动使用。为了简洁起见,在大多数示例中都省略了它,但您应该始终注意如何使用不受信任的数据。
from flask import Flask
from markupsafe import escape
app = Flask(__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
def show_user_profile(username):
# show the user profile for that user
return f'User {escape(username)}'
def show_post(post_id):
# show the post with the given id, the id is an integer
return f'Post {post_id}'
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
def index():
return 'index'
def login():
return 'login'
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/