python代码,微型框架flask如何响应请求?如何获取参数?
发布于 作者:苏南大叔 来源:程序如此灵动~
python也是可以用于httpserver的,其中比较简单的方式就是flask。如果对应到nodejs上的话,对标的就是express框架。那么,作为www容器的最基本功能,就是响应get或者post请求,并且获得参数,这也是本文中要讨论的问题。

大家好,这里是苏南大叔的程序如此灵动博客,这里记录苏南大叔和计算机代码的故事。本文描述python的flask微型框架。测试环境:win10,python@3.6.8,flask@2.0.3。
安装flask
Flask是一个用Python编写的Web应用程序框架,Flask基于Werkzeug WSGI工具包和Jinja2模板引擎。flask英文翻译为一种长颈烧瓶,官方logo看起来像个辣椒。
Flask也被称为“microframework” ,因为它使用简单的核心,用extension增加其他功能。Flask没有默认使用的数据库、窗体验证工具。
官方网站是:

安装方式是:
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')
响应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)访问方式:

响应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)访问方式:
表格对比
post和get的区别:
| method | 装饰器 | 获取参数方式 |
|---|---|---|
| GET | methods=['get'] | flask.request.args.get() |
| POST | methods=['post'] | flask.request.form.get() |
获得header的方式:
| header | 语句 |
|---|---|
| UA | flask.request.headers.get("User-Agent") |
| Cookie | flask.request.headers.get("Cookie") |
特殊例子
这个有个特殊的例子,就是表单里面的同名表单项的服务器端处理问题。表单项里面有重名的input,比如两个checkbox。flask能否拿到数据呢?
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')这里有两个要点:
第一、具有重复项目的ImmutableMultiDict转dict。网上的教程都是说:
_dict = multidict.to_dict()这个会丢失数据,真正的办法是:
_dict = dict(multidict.lists())第二、jsonify输出中文,靠的是修改flask的配置。
app.config["JSON_AS_ASCII"] = Falseform.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>
相关文档
因为本文的响应结果是json,所以使用json.dumps()输出了响应结果。涉及到中文文本输出的时候,需要设置特殊参数。具体可以参考文章:
如果想把这些flask代码包装成docker文件的话,可以参考下面的链接:
如果想看看nodejs的express框架,如何实现类似的需求的话,请点击:
综述
本文主要描述python下的微型web框架flask,主要聚焦于响应最简单的post或者get请求。更多高级的flask经验文章,请点击下面的链接: