Flask的主要特点包括:
Flask的文档非常丰富,提供了广泛的指南和教程,以及强大的扩展支持。Flask是一个流行的Web框架,广泛应用于Web开发、API开发和数据可视化等领域。
可以使用 pip 工具来安装 Flask:
pip install Flask
创建一个 Python 文件,并导入 Flask 模块:
from flask import Flask
app = Flask(__name__)
在上面的代码中,我们创建了一个 Flask 应用,并将其存储在名为 app 的变量中。
在 Flask 中,可以使用 @app.route() 装饰器来定义 URL 路由,让应用响应特定的 URL 请求。例如:
@app.route('/')
def hello():
return 'Hello, World!'
上面的代码定义了一个根路由 /,当用户访问该路由时,将调用 hello() 函数,该函数返回一个字符串 ‘Hello, World!’。
在 Flask 应用中,可以使用 app.run() 方法来启动应用程序。例如:
if __name__ == '__main__':
app.run()
上面的代码判断当前文件是否作为入口程序运行,如果是,就启动 Flask 应用。启动后,应用将监听本地的默认端口(5000),并在浏览器中显示 Hello, World!。
可以使用 @app.route() 装饰器来添加更多的路由和视图函数。例如:
@app.route('/')
def index():
return 'Index Page'
@app.route('/hello')
def hello():
return 'Hello, World'
上面的代码定义了两个路由:/ 和 /hello,当用户访问这些路由时,分别调用 index() 和 hello() 函数,返回相应的字符串。
可以使用
的语法来在路由中传递参数。例如:
@app.route('/user/' )
def show_user_profile(username):
return f'User {username}'
@app.route('/post/' )
def show_post(post_id):
return f'Post {post_id}'
上面的代码定义了两个路由:/user/
和 /post/
,其中
和
是路由参数。当用户访问这些路由时,参数将传递给相应的视图函数,可以在函数中使用。
下面是一个简单的示例,它使用 Flask 开发一个返回当前时间的 API:
from flask import Flask, jsonify
from datetime import datetime
app = Flask(__name__)
@app.route('/time')
def get_time():
now = datetime.now()
return jsonify({'time': now.strftime('%Y-%m-%d %H:%M:%S')})
if __name__ == '__main__':
app.run(debug=True)
在这个示例中,我们创建了一个 Flask 应用对象 app
,定义了一个路由 /time
,在这个路由下定义了一个视图函数 get_time()
,它返回一个 JSON 格式的响应,其中包含当前的时间。最后,我们使用 app.run()
启动了应用。
这个示例中,我们使用了 Flask 的 jsonify
函数将字典对象转换为 JSON 格式的响应。这个函数自动将响应的 MIME 类型设置为 application/json
,并使用 Flask 的内置 JSON 编码器将字典对象转换为 JSON 格式。
可以使用 Postman 或其他工具来测试这个 API,例如发送 GET 请求到 http://127.0.0.1:5000/time
,将会得到类似于以下的响应:
{
"time": "2023-02-17 11:23:42"
}
在实际应用中,可以根据需要添加身份认证、访问控制、异常处理、日志记录等功能。Flask 有大量的扩展库可以帮助实现这些功能。例如,Flask-RESTful 可以简化 RESTful API 的开发,Flask-Security 可以提供基本的身份认证和访问控制功能。
假设我们有一个 URL 是 http://example.com/user?name=John&age=25
,其中有两个查询参数 name
和 age
,分别表示用户的姓名和年龄。我们可以使用如下代码来接收这两个查询参数的值,并返回 JSON 格式的响应数据:
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/user')
def get_user():
name = request.args.get('name')
age = request.args.get('age')
response_data = {'name': name, 'age': age}
return jsonify(response_data)
if __name__ == '__main__':
app.run()
假设我们的客户端使用 HTTP POST 方法向 URL http://example.com/user 发送一个包含 name 和 age 参数的请求。我们可以使用如下代码来接收这两个参数的值,并返回 JSON 格式的响应数据:
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/user', methods=['POST'])
def create_user():
name = request.form.get('name')
age = request.form.get('age')
response_data = {'name': name, 'age': age}
return jsonify(response_data)
if __name__ == '__main__':
app.run()
假设我们的客户端使用 HTTP POST 方法向 URL http://example.com/user 发送一个包含 name 和 age 参数的 JSON 格式的请求。我们可以使用如下代码来接收这两个参数的值,并返回 JSON 格式的响应数据:
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/user', methods=['POST'])
def create_user():
request_data = request.get_json()
name = request_data.get('name')
age = request_data.get('age')
response_data = {'name': name, 'age': age}
return jsonify(response_data)
if __name__ == '__main__':
app.run()
from flask import Flask, jsonify, request
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'GET':
name = request.args.get('name')
age = request.args.get('age')
data = {'name': name, 'age': age}
return jsonify(data)
elif request.method == 'POST':
name = request.json.get('name')
age = request.json.get('age')
data = {'name': name, 'age': age}
return jsonify(data)
if __name__ == '__main__':
app.run(debug=True)
#GET 参数的默认值设置
name = request.args.get('name', 'world')
#POST 参数的默认值设置
name = request.form.get('name', 'world')
# JSON 参数的默认值设置
data = request.get_json(default={})
name = data.get('name', '张三')
在 Flask 中request.json
和 request.get_json()
都是用来获取请求体中的 JSON 数据的方法,二者的区别在于获取方式不同。
request.json
是通过访问 request.data 属性来获取请求体数据,然后将其解析为 JSON 格式,返回一个 Python 字典。该方法只适用于请求头中的 Content-Type 是 application/json
的情况,如果请求头中的 Content-Type 是其他类型,该方法将会返回 None。
request.get_json()
方法是一个更为灵活的方法,它可以同时支持多种 Content-Type 类型,例如 application/json
、application/vnd.api+json
等等。该方法会根据请求头中的 Content-Type 来判断请求体的类型,然后将其解析为 JSON 格式,并返回一个 Python 字典。如果请求头中的 Content-Type 不是 JSON 类型,该方法将会返回 None。
另外,如果请求体中的 JSON 数据不合法,两个方法都会抛出异常。具体来说,如果请求体无法被解析为 JSON 格式,两个方法都会抛出 BadRequest 异常;如果请求头中的 Content-Type 不是 application/json
,request.get_json()
方法会抛出 UnsupportedMediaType 异常。
总的来说,如果你确定请求头中的 Content-Type 是 application/json,可以直接使用 request.json
方法;如果需要支持多种 Content-Type,可以使用 request.get_json()
方法。不过,无论使用哪种方法,都需要对请求体中的 JSON 数据进行合法性检查,以确保程序的稳定性和安全性。
Flask 默认监听的端口是 5000。如果要修改监听的端口,可以在调用 Flask 的 run 方法时传递一个 port 参数:
from flask import Flask
app = Flask(__name__)
if __name__ == '__main__':
app.run(port=8000)
这个例子中,我们将 Flask 监听的端口改为 8000。
如果要开启调试模式,可以在调用 Flask 的 run 方法时传递一个 debug 参数,并将它设置为 True:
from flask import Flask
app = Flask(__name__)
if __name__ == '__main__':
app.run(debug=True)
开启调试模式后,Flask 会输出调试信息,并在代码发生异常时显示调试界面,方便开发和调试。需要注意的是,调试模式不应该在生产环境中使用,因为它会暴露应用程序的内部信息,可能导致安全问题。
默认情况下,Flask 应用程序只绑定到本地回环接口(localhost,127.0.0.1)上,这意味着只能从本地访问应用程序。要使应用程序对任何IP地址都可见,可以通过将host
参数设置为0.0.0.0
来实现,如下所示:
from flask import Flask
app = Flask(__name__)
if __name__ == '__main__':
app.run(host='0.0.0.0')