Flask Web | HTTP 方法

使用装饰器传参可以改变路由只回应 GET 请求的行为

Posted by Haauleon on November 16, 2022

本篇所有操作均在基于 Ubuntu 16.04 LTS 的虚拟机下完成,且使用 Vagrant 来操作虚拟机系统,虚拟机系统 VirtualBox Version: 7.0



一、HTTP 方法

环境准备:
Python 2.7.11+
pip==9.0.3
flask==0.11.1
werkzeug==0.11.10

  HTTP 有多个访问 URL 方法,默认情况下,路由只回应 GET 请求,但是通过 app.route 装饰器传递 methods 参数可以改变这个行为。如下使用 methods=['GET', 'POST'] 可以实现既支持 GET 请求也支持 POST 请求,但如果请求方法不在 methods 的可选范围内则返回 405 Method Not Allowed。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# -*- coding: utf-8 -*-#
from flask import Flask

app = Flask(__name__)


@app.route('/login', methods=['GET', 'POST'])
def login():
    return 'Login Index Page!'


@app.route('/j/item/<id>', methods=['DELETE', 'POST'])
def item(id):
    return 'Update: {}'.format(id)


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=9000, debug=True)


执行结果如下:

  1. 访问 GET http://127.0.0.1:9000/login
  2. 访问 POST http://127.0.0.1:9000/login
  3. 访问 POST http://127.0.0.1:9000/j/item/9999999
  4. 访问 DELETE http://127.0.0.1:9000/j/item/9999999
  5. 访问 GET http://127.0.0.1:9000/j/item/3
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
     > http GET http://127.0.0.1:9000/j/item/3  
     HTTP/1.0 405 METHOD NOT ALLOWED
     Allow: POST, OPTIONS, DELETE
     Content-Length: 178
     Content-Type: text/html; charset=utf-8
     Date: Tue, 13 Dec 2022 14:40:28 GMT
     Server: Werkzeug/1.0.1 Python/2.7.18
    
     <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
     <title>405 Method Not Allowed</title>
     <h1>Method Not Allowed</h1>
     <p>The method is not allowed for the requested URL.</p>
    



1、HTTP 方法和使用场景

  如果存在 GET 请求方法,那么也会自动添加 HEAD 方法,无需干预无需指定。它会确保遵照 HTTP RFC(描述 HTTP 协议的文档)处理 HEAD 请求,所以完全可以忽略这部分的 HTTP 规范。从 Flask 0.6 起,它也实现了 OPTIONS 的自动处理。以下简要介绍 HTTP 方法和使用场景:

HTTP 方法 使用场景
GET 获取资源,GET 操作应该是幂等的
HEAD 想要获取信息,但是只关心信息头。应用应该像处理 GET 请求一样来处理它,但是不返回实际内容
POST 创建一个新的资源
PUT 完整地替换资源或者创建资源。PUT 操作虽然有副作用,但应该是幂等的
DELETE 删除资源。DELETE 操作有副作用,但也是幂等的
OPTIONS 获取资源支持的所有 HTTP 方法
PATCH 局部更新,修改某个已有的资源



2、幂等

  幂等表示在相同的数据和参数下,执行一次或多次产生的效果是一样的。