python sdk flask框架实现web访问时favicon.ico 404 这样解决

2020-03-26 01:53:36 浏览数 (1)

Django、Flask、Bottle都是Python Web框架,Django比较大众化、Flask比较轻量、Bottle比Flask还轻量。

创建空白Flask Web项目

注意看箭头所指,需要点一下创建虚拟环境

再注意看上图左下有个unresolved import flask的告警

这个告警的原因是还没有安装flask框架

如下图,通过PyPI安装,安装之前需要先配置pip国内源,要不然慢死了

输入包名自动出来安装命令,点一下命令自动安装

输入包名自动出来安装命令,点一下命令自动安装,安装过程在左下方输出栏有显示

安装完flask了,最初的那个unresolved import 'flask'的告警依旧在,但此时环境已配置好了,先忽略那个告警,点绿色小三角Web服务器图标进行调试

出来Hello World!说明环境配通了

至于那个unresolved import 'flask'的告警,你把项目保存、关闭、重新打开,发现那个告警自动消失了,但你注意看console最后一行的后半部分是 /favicon.ico 404

谷歌浏览器F12对网页刷新的时候,很多站点都没有favicon.ico,这无关紧要,但我就是别扭

查了很多资料,走了很多弯路,最终找到一篇文档完美解决了favicon.ico 404 not found的问题,文档:https://www.jianshu.com/p/02980943ed81

这篇里的第2种办法也有用https://flask.palletsprojects.com/en/1.1.x/patterns/favicon/

两种办法都可以

然后就是应用Python SDK了,把api explorer工具生成的python console代码全部粘贴到flask项目app.py的开头第一句话from flask import Flask的后面,然后调试发现console端已经出结果了,但我们要的是网页上出结果,而不是显示"Hello World!"

终端显示结果最关键的一句话是print(resp.to_json_string()) ,网页显示Hello World!是因为hello()里的return "Hello World!"

那我们用return resp.to_json_string()替换return "Hello World!"即可

如图,Web呈现结果的目标已经达成,美中不足的是/favicon.ico 404,我们把之前提到的解决/favicon.ico 404的代码加到下图2句话之间测试看看

代码语言:javascript复制
@app.route('/favicon.ico')
def favicon():
    return send_from_directory(os.path.join(app.root_path, 'static'),
                               'favicon.ico', mimetype='image/vnd.microsoft.icon')

注意分析代码里面的app.root_path,这个就是app.py所在目录,不用具体写出来,就用app.root_path表示,app.root_path有个static目录里面有个mimetype为'image/vnd.microsoft.icon'的favicon.ico

整个代码说白了就一句话,当访问/favicon.ico时,发送“根目录/static/favicon.ico”作为返回值

代码语言:javascript复制
def favicon():
    return send_from_directory(os.path.join(app.root_path, 'static'),
                               'favicon.ico', mimetype='image/vnd.microsoft.icon')

app.add_url_rule('/favicon.ico',view_func=favicon)

加上代码预览时报NameError: name 'send_from_directory' is not defined

需要参考https://flask.palletsprojects.com/en/1.1.x/patterns/favicon/

在开头加上

import os from flask import send_from_directory

加上后再预览发现不报刚才的错了,但是/favicon.ico 404依然存在?如果你没在app.py所在目录建static目录并在static目录里放favicon.ico的话肯定是404。

让./static/favicon.ico存在后再预览就正常了

注意看网页上出现ico图标了,但是还有个不完美的地方,端口是随机的,可代码里明明是写死的呀

这里的随机端口是调试器属性里给写死了host为localhost,端口没指定就是随机的

如果我们想要从代码指定,那需要做:界面最上排的调试→flask属性→调试→删掉localhost使整个调试配置为空

然后将最后一段代码做些修改,一段并一行,红框里的几行代码用app.run(host='0.0.0.0', port=80,debug=False)替代

debug=True或False都行,最终的结果如下,localhost或外网IP或127.0.0.1都可以,而且是固定端口,这才是我要的东西

最后,再强调一点--安全意识!

就在测试的当儿,Web服务就被刷了,网络攻击无处不在,云规则第一条:云是方便的、也是不安全的。

0 人点赞