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"] = 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>
相关文档
因为本文的响应结果是json
,所以使用json.dumps()
输出了响应结果。涉及到中文文本输出的时候,需要设置特殊参数。具体可以参考文章:
如果想把这些flask
代码包装成docker
文件的话,可以参考下面的链接:
如果想看看nodejs
的express
框架,如何实现类似的需求的话,请点击:
综述
本文主要描述python
下的微型web框架flask
,主要聚焦于响应最简单的post
或者get
请求。更多高级的flask
经验文章,请点击下面的链接:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。