我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

python也是可以用于httpserver的,其中比较简单的方式就是flask。如果对应到nodejs上的话,对标的就是express框架。那么,作为www容器的最基本功能,就是响应get或者post请求,并且获得参数,这也是本文中要讨论的问题。

苏南大叔:python代码,微型框架flask如何响应请求?如何获取参数? - flask-reponse
python代码,微型框架flask如何响应请求?如何获取参数?(图5-1)

大家好,这里是苏南大叔的平行空间笔记本博客,这里记录苏南大叔和计算机代码的故事。本文描述pythonflask微型框架。测试环境:win10python@3.6.8flask@2.0.3

安装flask

Flask是一个用Python编写的Web应用程序框架,Flask基于Werkzeug WSGI工具包和Jinja2模板引擎。flask英文翻译为一种长颈烧瓶,官方logo看起来像个辣椒。

Flask也被称为“microframework” ,因为它使用简单的核心,用extension增加其他功能。Flask没有默认使用的数据库、窗体验证工具。

官方网站是:

苏南大叔:python代码,微型框架flask如何响应请求?如何获取参数? - flask-logo
python代码,微型框架flask如何响应请求?如何获取参数?(图5-2)

安装方式是:

pip install flask

启动进程

使用flask框架的时候,最应该注意的地方,就是不能把文件命名为flask.py。这样的话,就会出现模块空间的引用错误。报错类似如下:

AttributeError: module 'flask' has no attribute 'Flask'

基本测试代码:

import flask
api = flask.Flask(__name__)
print(flask.__version__)

@api.route('/', methods=['get'])
def index():
    return "OK"

# 新的方法放这里,__main__之前

if __name__ == '__main__':
    api.run(port=8888, debug=True, host='127.0.0.1')

苏南大叔:python代码,微型框架flask如何响应请求?如何获取参数? - flask-code
python代码,微型框架flask如何响应请求?如何获取参数?(图5-3)

响应get请求

测试代码:

@api.route('/_get', methods=['get'])
def send_get():
    id = int(flask.request.args.get('id'))
    cookie = flask.request.headers.get("Cookie")
    _json = {'msg': 'get用户id为' + str(id), 'header': cookie}
    return json.dumps(_json, ensure_ascii=False)

访问方式:

苏南大叔:python代码,微型框架flask如何响应请求?如何获取参数? - flask-post-get
python代码,微型框架flask如何响应请求?如何获取参数?(图5-4)

响应post请求

测试代码:

@api.route('/_post', methods=['post'])
def send_post():
    id = int(flask.request.form.get('id'))
    user_agent = flask.request.headers.get("User-Agent")
    _json = {'msg': 'post用户id为' + str(id), 'header': user_agent}
    return json.dumps(_json, ensure_ascii=False)

访问方式:

表格对比

postget的区别:

method装饰器获取参数方式
GETmethods=['get']flask.request.args.get()
POSTmethods=['post']flask.request.form.get()

获得header的方式:

header语句
UAflask.request.headers.get("User-Agent")
Cookieflask.request.headers.get("Cookie")

特殊例子

这个有个特殊的例子,就是表单里面的同名表单项的服务器端处理问题。表单项里面有重名的input,比如两个checkboxflask能否拿到数据呢?

import flask
import json
from flask import render_template
from flask import request
from flask import jsonify

app = flask.Flask(__name__, template_folder="templates", static_folder="static", static_url_path="/static")
print(flask.__version__)
app.config["JSON_AS_ASCII"] = False

@app.route('/form.html', methods=['get'])
def send_get():
    return render_template("form.html")

@app.route('/form.php', methods=['post'])
def send_post():
    if request.method == 'POST':
        print(request.form)                      # ImmutableMultiDict() 
        print(request.form["skill"])             # nodejs
        print(request.form.getlist('skill'))     # ['nodejs', 'php']
        # b = request.form.to_dict()
        # b["skill"]=request.form.getlist('skill')
        # return json.dumps(b, ensure_ascii=False) 
        return jsonify(dict(request.form.lists()))

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

这里有两个要点:
第一、具有重复项目的ImmutableMultiDictdict。网上的教程都是说:

_dict = multidict.to_dict()

这个会丢失数据,真正的办法是:

_dict = dict(multidict.lists())

第二、jsonify输出中文,靠的是修改flask的配置。

app.config["JSON_AS_ASCII"] = False

form.html:

<form action="form.php" method="post">
    <input type="text" name="username" value="苏南大叔default">
    <input type="checkbox" id="a3" name="skill" value="nodejs" checked="checked">nodejs
    <input type="checkbox" id="a4" name="skill" value="php" checked="checked">php
    <input type="submit" value="Submit!">
</form>

苏南大叔:python代码,微型框架flask如何响应请求?如何获取参数? - 运行截图
python代码,微型框架flask如何响应请求?如何获取参数?(图5-5)

相关文档

因为本文的响应结果是json,所以使用json.dumps()输出了响应结果。涉及到中文文本输出的时候,需要设置特殊参数。具体可以参考文章:

如果想把这些flask代码包装成docker文件的话,可以参考下面的链接:

如果想看看nodejsexpress框架,如何实现类似的需求的话,请点击:

综述

本文主要描述python下的微型web框架flask,主要聚焦于响应最简单的post或者get请求。更多高级的flask经验文章,请点击下面的链接:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python    json