jidesheng6 发表于 2019-12-5 19:45

基于python的flask应用实践

前言

前段时间写了一个皮皮虾无水印解析的帖子,但是想了想局限性太大了,因为是用python写出来的,就算编译成EXE文件,现在大多数人都是用手机,做APP么,也不会,更不用提IOS的APP了,突然想到在IOS上有捷径,于是就有了以下的想法:自己做一个网页的API,在后面跟上特定的参数实现无水印解析,前面校验链接的事情交给捷径,后面获取数据主要用API来完成,于是就想到了Python的Flask框架,简单说下Flask框架是什么:大致我们就可看成是一个集成了web服务器的应用程序,通过规定的语法,让我们用平时只能在有python环境的机器上运行的结果,能在网页上做出来,我说的有点乱,大概意思就是用python来做一个简易的网站(我这里做的是一个简单的API)。

https://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.pnghttps://static.52pojie.cn/static/image/hrline/line8.png0x01:准备工作

https://static.52pojie.cn/static/image/hrline/2.gifhttps://static.52pojie.cn/static/image/hrline/2.gifhttps://static.52pojie.cn/static/image/hrline/2.gifhttps://static.52pojie.cn/static/image/hrline/2.gif

家里有一台吃灰的树莓派,就打算在这上面搭建这个API服务了,如果自己有合适的服务器的也可以根据实际情况进行部署,配置这服务器的过程特别繁琐我就挑几个点讲一下:如果是linux的系统最好开启SSH登录,配置文件在/etc/ssh/sshd_config下,记住要安装pip和python环境,因为我装的镜像是buster,几乎就是最小的安装包了,连vim我都是自己装的,其次准备nginx,用来配置反向代{过}{滤}理,让机器的80端口和flask➕gunicorn部署的服务通过nginx来进行代{过}{滤}理,最后就是要准备flask和gunicorn了,前一个用pip安装后一个用apt安装就可以了,nginx也是用apt安装,准备工作就这些,细节后面我会再提到。
https://static.52pojie.cn/static/image/hrline/2.gifhttps://static.52pojie.cn/static/image/hrline/2.gifhttps://static.52pojie.cn/static/image/hrline/2.gifhttps://static.52pojie.cn/static/image/hrline/2.gif
0x02:实践开发
https://static.52pojie.cn/static/image/hrline/2.gifhttps://static.52pojie.cn/static/image/hrline/2.gifhttps://static.52pojie.cn/static/image/hrline/2.gifhttps://static.52pojie.cn/static/image/hrline/2.gif

因为是要准备一个api,所以前面判断是不是特定链接交给捷径来完成。
首先要熟悉flask的文档:http://docs.jinkan.org/docs/flask/

从上面可以看到官方给的最小的例子就是一个主页面,所以自己可以先写一个试试看(flask中可以用requests等模块,注意其只能返回str dict tuple 等类型信息 如果是Unicode或者response信息就会出现报错)

首先我们先去写一个函数,就是皮皮虾的无水印解析函数,让他对传入来的链接进行分析最后给出下载链接

第一句话中WApplication里面传入的__name__是必须的,后面的static_url_path=""参数的意思是,当在当前页面中需要引用某些文件会从当前目录下的static目录中去寻找,而且static是作为资源根目录来使用的,也就是说加上了这个参数就不需要写上完整路径了,比如<audio src="111.mp3"></audio>,如果不加那个参数就要把路径写完整,类似static/111.mp3。


然后我们可以看到这段代码,设置路由,比如我的内网IP是192.168.3.51,这段代码意思就是,当用户访问了192.168.3.51的时候,就会开始获取其中的get请求里面的url参数,如果没有url参数的话会返回最下面的一个简单主页,其他错误代码意思是啥我忘记了,总之如果url传入正确,便会返回无水印解析的结果。


接下来考虑到用户有时候会访问一个不存在的页面 比如/xxx,这个页面我是没有定义的,这时候页面便会反馈错误,所以加入一个处理404错误的函数,如果发生了404错误,那么在3秒后返回主页面



最后一个路由是自己写的一个html文件,用其函数渲染,如果细讲实在是很麻烦,所以建议去看flask官方文档,我只是做一个简单的流程和思路





大致结构:


这时候我们用python直接运行可以在本地实现调试,但是这不适于正式投入使用,所以接下来要部署,然后正式发布出去。

https://static.52pojie.cn/static/image/hrline/2.gifhttps://static.52pojie.cn/static/image/hrline/2.gifhttps://static.52pojie.cn/static/image/hrline/2.gifhttps://static.52pojie.cn/static/image/hrline/2.gif
0x03:部署
https://static.52pojie.cn/static/image/hrline/2.gifhttps://static.52pojie.cn/static/image/hrline/2.gifhttps://static.52pojie.cn/static/image/hrline/2.gifhttps://static.52pojie.cn/static/image/hrline/2.gif
个人综合比较下来觉得还是nginx+flask+gunicorn实现部署是最简单,快捷的方式了
首先写好flask应用之后,来配置nginx

cd /etc/nginx/conf.d/
vim default.conf
写入以下内容:


server_name那里填入自己的域名或者内网和公网ip,用空格分开
最后
systemctl restart nginx
这样就算配置好了
然后用gunciron来开启服务

-w参数表示几条线程运行这个服务
-b表示绑定的地址 这里要和在nginx中的proxy_pass值一致
最后Webmain表示文件名称
WApplication表示在文件中实例化flask的名称


可以配合screen来一起使用

最后需要让公网也可以访问了 这里根据大家实际情况 因为我家路由器自带NAT转发
所以需要配置的有两个 把内网的80端口映射到公网的5000端口上去(因为封了所有带80的端口)

把22端口也映射出去,方便远程管理(大家在这里可以试着用网络唤醒结合,快要到家的时候把电脑远程启动,我目前就是这么做的)


我把代码也给大家看一下吧(MAC代表自己电脑的MAC,把-去除拼在一起就可以了):
import socket,binascii
mac = "3085A9997334"
magic_data = 'FF'*6 + mac *16
send_data = binascii.unhexlify(magic_data)
address='255.255.255.255'
port=9
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)
s.sendto(send_data,(address,port))
print("send success")




实在是不会排版大家将就看吧,还请大佬手下留情,我还在努力,目前还很菜,不要喷我,感谢。

pangdong697 发表于 2019-12-7 13:55

jidesheng6 发表于 2019-12-6 11:48
uwsgi我当时也试过,我感觉还是gunicorn方便,效率高,uwsgi又要弄配置文件啥的,太麻烦了。。

uwsgi的效率比不上gunicorn,它只是flask自带的一个调试服务器,还是用gunicorn比较稳定点 搭配

jidesheng6 发表于 2019-12-6 20:55

羽天狂龙 发表于 2019-12-6 12:22
用树莓派搭建的flask+gunicorn+nginx这套web服务,性能怎样,访问延迟高不高

因为我是api,没有做什么完整的,延迟不咋样,没什么感觉,大型项目我就不知道了,得看你部署的服务器性能如何

xunan007 发表于 2019-12-5 19:55

谢谢分享,学习了

zzgaot 发表于 2019-12-5 20:05

今天开始学习flask ,膜拜大神。

白泽1994 发表于 2019-12-5 20:07

膜拜大神

AzZ丶咖灰 发表于 2019-12-5 20:15

考完研开始学,膜拜一下

729 发表于 2019-12-5 20:22

慢慢来啦,我也学习这flask 用的很多东西,可以学习更高级的语法装饰器什么的。自己也弄了一个博客 不过弄着弄着暂时没弄了,部署的话用的是ngnix+uwsgi

jidesheng6 发表于 2019-12-5 20:35

729 发表于 2019-12-5 20:22
慢慢来啦,我也学习这flask 用的很多东西,可以学习更高级的语法装饰器什么的。自己也弄了一个博客 不过弄 ...

自从弄了这东西老感觉少了点什么

pp125109139 发表于 2019-12-5 20:36

谢谢分享~~

山园小梅 发表于 2019-12-5 20:51

感谢楼主的分享

xubo 发表于 2019-12-5 20:52

多谢分享感谢感谢
页: [1] 2 3 4
查看完整版本: 基于python的flask应用实践