当前位置:   article > 正文

【python】flask-Web 应用程序框架_flask web

flask web

简介

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

这段代码做了什么?

  • 1、首先我们导入了Flask类。此类的一个实例将是我们的 WSGI 应用程序。

  • 2、接下来我们创建这个类的一个实例。第一个参数是应用程序模块或包的名称。__name__是适用于大多数情况的便捷快捷方式。这是必需的,以便 Flask 知道在哪里寻找资源,例如模板和静态文件。

  • 3、然后我们使用route()装饰器告诉 Flask 哪个 URL 应该触发我们的函数。

  • 4、该函数返回我们希望在用户浏览器中显示的消息。默认内容类型为 HTML,因此字符串中的 HTML 将由浏览器呈现。

在这里插入图片描述

二、Flask详细使用总结

1、HTML 转义

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

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

from markupsafe import escape

@app.route("/<name>")
def hello(name):
    return f"Hello, {escape(name)}!"
  • 1
  • 2
  • 3
  • 4
  • 5

如果用户设法提交了 name ,转义会导致它呈现为文本,而不是在用户的浏览器中运行脚本。

在路由中从 URL 中捕获一个值并将其传递给视图函数。下面解释这些变量规则。

2、路由

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

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

@app.route('/')
def index():
    return 'Index Page'

@app.route('/hello')
def hello():
    return 'Hello, World'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2.2、变量规则

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

例如<converter:variable_name>.
  • 1
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)}'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

转换器类型:

转换器类型含义
string(默认)接受任何不带斜线的文本
int接受正整数
float接受正浮点值
path喜欢string但也接受斜线
uuid接受 UUID 字符串

2.3、唯一的 URLs / 重定向行为

以下两条规则在使用斜杠时有所不同。

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

@app.route('/about')
def about():
    return 'The about page'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

端点的规范 URLabout没有尾部斜杠。它类似于文件的路径名。使用尾部斜杠 ( /about/) 访问 URL 会产生 404“未找到”错误。这有助于使这些资源的 URL 保持唯一性,从而帮助搜索引擎避免将同一页面编入两次索引。

2.4、网址构建

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

为什么要使用 URL 反转功能 url_for()而不是将它们硬编码到模板中来构建 URL?

  • 反转通常比对 URL 进行硬编码更具描述性。
  • 您可以一次性更改 URL,而无需记住手动更改硬编码的 URL。
  • URL 构建透明地处理特殊字符的转义。
  • 生成的路径总是绝对的,避免了浏览器中相对路径的意外行为。
  • 如果您的应用程序位于 URL 根目录之外,例如 in /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'))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

访问以下path:

/
/login
/login?next=/
/user/John%20Doe
  • 1
  • 2
  • 3
  • 4

2.5、HTTP 方法

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'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

如果GET存在,Flask 会自动添加对该方法的支持并根据HTTP RFCHEAD处理请求。同样, 为您自动实施。HEADOPTIONS

2.5、有json体返回的HTTP GET请求示例(请求中不带参数)

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

执行该文件后,访问 http://127.0.0.1:5000/users
在这里插入图片描述

2.6、有json体返回的HTTP GET请求示例(请求中带参数)

@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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

访问下面的网址:

http://127.0.0.1:5000/getInfo?name=张三&age=18

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/467856
推荐阅读
相关标签
  

闽ICP备14008679号