Flask 是一个轻量级的WSGI Web 应用程序框架。它旨在使入门快速简便,并能够扩展到复杂的应用程序。它最初是对Werkzeug 和Jinja的简单包装,现已成为最流行的 Python Web 应用程序框架之一。
Flask 源码
Flask使用指南
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello, World!"
@app.route("/index")
def index():
return 'Index Page'
if __name__ == '__main__':
app.run(host='127.0.0.1',port=5000)
这段代码做了什么?
1、首先我们导入了Flask类。此类的一个实例将是我们的 WSGI 应用程序。
2、接下来我们创建这个类的一个实例。第一个参数是应用程序模块或包的名称。__name__是适用于大多数情况的便捷快捷方式。这是必需的,以便 Flask 知道在哪里寻找资源,例如模板和静态文件。
3、然后我们使用route()装饰器告诉 Flask 哪个 URL 应该触发我们的函数。
4、该函数返回我们希望在用户浏览器中显示的消息。默认内容类型为 HTML,因此字符串中的 HTML 将由浏览器呈现。
返回 HTML(Flask 中的默认响应类型)时,必须对输出中呈现的任何用户提供的值进行转义,以防止注入攻击。稍后介绍的使用 Jinja 呈现的 HTML 模板将自动执行此操作。
escape(),显示在这里,可以手动使用。为简洁起见,在大多数示例中都省略了它,但您应该始终注意您如何使用不受信任的数据。
from markupsafe import escape
@app.route("/")
def hello(name):
return f"Hello, {escape(name)}!"
如果用户设法提交了 name ,转义会导致它呈现为文本,而不是在用户的浏览器中运行脚本。
在路由中从 URL 中捕获一个值并将其传递给视图函数。下面解释这些变量规则。
现代 Web 应用程序使用有意义的 URL 来帮助用户。如果该页面使用他们可以记住并用于直接访问页面的有意义的 URL,用户更有可能喜欢该页面并返回。
@app.route('/')
def index():
return 'Index Page'
@app.route('/hello')
def hello():
return 'Hello, World'
您可以通过使用 标记部分来将可变部分添加到 URL
例如.
from markupsafe import escape
@app.route('/user/')
def show_user_profile(username):
# show the user profile for that user
return f'User {escape(username)}'
@app.route('/post/')
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/')
def show_subpath(subpath):
# show the subpath after /path/
return f'Subpath {escape(subpath)}'
转换器类型:
转换器类型 | 含义 |
---|---|
string | (默认)接受任何不带斜线的文本 |
int | 接受正整数 |
float | 接受正浮点值 |
path | 喜欢string但也接受斜线 |
uuid | 接受 UUID 字符串 |
以下两条规则在使用斜杠时有所不同。
@app.route('/projects/')
def projects():
return 'The project page'
@app.route('/about')
def about():
return 'The about page'
端点的规范 URLprojects有一个尾部斜杠。它类似于文件系统中的文件夹。如果您访问的 URL 没有尾部斜杠 ( /projects),Flask 会将您重定向到带有尾部斜杠 ( ) 的规范 URL /projects/。
端点的规范 URLabout没有尾部斜杠。它类似于文件的路径名。使用尾部斜杠 ( /about/) 访问 URL 会产生 404“未找到”错误。这有助于使这些资源的 URL 保持唯一性,从而帮助搜索引擎避免将同一页面编入两次索引。
要构建特定函数的 URL,请使用该url_for()函数。它接受函数的名称作为其第一个参数和任意数量的关键字参数,每个关键字参数对应于 URL 规则的可变部分。未知的可变部分作为查询参数附加到 URL。
为什么要使用 URL 反转功能 url_for()而不是将它们硬编码到模板中来构建 URL?
比如这里我们用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/')
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'))
访问以下path:
/
/login
/login?next=/
/user/John%20Doe
Web 应用程序在访问 URL 时使用不同的 HTTP 方法。在使用 Flask 时,您应该熟悉 HTTP 方法。默认情况下,路由只GET响应请求。您可以使用装饰器的methods参数来处理不同的 HTTP 方法。route()
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()
def do_the_login():
return 'login'
def show_the_login_form():
return 'show_the_login_form'
如果GET存在,Flask 会自动添加对该方法的支持并根据HTTP RFCHEAD处理请求。同样, 为您自动实施。HEADOPTIONS
flask_test.py
from flask import Flask,make_response,jsonify
from flask import request
import json
app = Flask(__name__)
data = [
{"id": 1, "username": "小明", "password": "123456", "role": 0, "sex": 0, "telephone": "10086", "address": "北京市海淀区"},
{"id": 2, "username": "李华", "password": "abc", "role": 1, "sex": 0, "telephone": "10010", "address": "广州市天河区"},
{"id": 3, "username": "大白", "password": "666666", "role": 0, "sex": 1, "telephone": "10000", "address": "深圳市南山区"}
]
@app.route("/users", methods=["GET"])
def get_all_users():
"""获取所有用户信息"""
return jsonify({"code":"0", "data":data, "msg":"操作成功"})
if __name__ == '__main__':
app.run(host='127.0.0.1',port=5000)
执行该文件后,访问 http://127.0.0.1:5000/users
@app.route("/getInfo",methods=["GET"])
def get_info():
# 默认返回内容
return_dict = {'return_code': '200', 'return_info': '处理成功', 'result': None}
# 判断入参是否为空
if len(request.args) == 0:
return_dict['return_code'] = '5004'
return_dict['return_info'] = '请求参数为空'
return json.dumps(return_dict, ensure_ascii=False)
# 获取传入的params参数
get_data = request.args.to_dict()
name = get_data.get('name')
age = get_data.get('age')
return_dict['result'] = "%s今年%s岁:%s" %(name,age,datetime.datetime.now())
return json.dumps(return_dict, ensure_ascii=False)
访问下面的网址:
http://127.0.0.1:5000/getInfo?name=张三&age=18