赞
踩
Flask 是一个轻量级的WSGI Web 应用程序框架。它旨在使入门快速简便,并能够扩展到复杂的应用程序。它最初是对Werkzeug 和Jinja的简单包装,现已成为最流行的 Python Web 应用程序框架之一。
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("/<name>")
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 <variable_name>。然后,您的函数接收<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 字符串 |
以下两条规则在使用斜杠时有所不同。
@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/<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'))
访问以下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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。