1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 【小沐学Python】Python实现Web服务器(Ubuntu下调试Flask)

【小沐学Python】Python实现Web服务器(Ubuntu下调试Flask)

时间:2023-08-13 13:13:08

相关推荐

【小沐学Python】Python实现Web服务器(Ubuntu下调试Flask)

🍺基于Python的Web服务器系列相关文章编写如下🍺:

🎈【Web开发】Python实现Web服务器(Flask快速入门)🎈🎈【Web开发】Python实现Web服务器(Flask案例测试)🎈🎈【Web开发】Python实现Web服务器(Flask部署上线)🎈🎈【Web开发】Python实现Web服务器(Flask+Tornado+nginx)🎈🎈【Web开发】Python实现Web服务器(Ubuntu下安装Flask)🎈🎈【Web开发】Python实现Web服务器(Ubuntu下打包Flask)🎈🎈【Web开发】Python实现Web服务器(Ubuntu下调试Flask)🎈🎈【Web开发】Python实现Web服务器(Ubuntu下Flask使用MySQL)🎈

文章目录

1、简介2、ubuntu远程访问3、ubuntu进程管理3.1 top命令查看进程pid3.2 ps命令查看进程3.3 kill命令关闭进程3.4 nohup命令3.5 设置开机自启动 4、ubuntu网络端口管理4.1 查看端口是否被占用方法4.2 列出所有端口(包含TCP和UDP)4.3 列出所有TCP端口4.4 列出所有UDP端口4.5 列出所有处于监听状态的 Sockets4.6 只列出所有监听tcp端口4.7 只列出所有监听udp端口4.8 只列出所有监听UNIX端口4.9 输出中显示 PID 和进程名称4.10 输出中不显示主机,端口和用户名4.11 显示核心路由信息4.12 找出程序运行的端口4.13 找出运行在指定端口的进程 5、ubuntu防火墙设置5.1 查看防火墙状态5.2 开启和关闭防火墙5.3 打开或关闭某个端口 6、flask测试6.1 配置python开发环境6.2 创建虚拟环境venv6.3 安装flask库6.4 测试flask入门例子6.5 测试flask图表例子(pyecharts)6.6 127.0.0.1还是0.0.0.0? 结语

1、简介

本文介绍在ubuntu系统中如何远程开发,防火墙设置,配置python开发环境,以及使用flask框架进行web服务器的开发。

2、ubuntu远程访问

在虚拟机VMware Workstation Pro中安装了一个Ubuntu系统。

有人反映新装的Ubuntu竟然没有默认安装ssh。

更新一下软件源:

sudo apt-get update

下载ssh并安装:

安装命令:sudo apt-get install openssh-server

卸载命令:sudo apt-get remove openssh-server

sudo apt-get install openssh-server

查看是否开启了ssh服务 (没有开始的话使用命令sudo service ssh start)

sudo service ssh startsudo ps -e | grep ssh

看到sshd那说明ssh-server已经启动了。若没有则可以这样启动:sudo /etc/init.d/ssh start 或者 service ssh start。

进入Ubuntu,Ctrl+Alt+T打开终端,输入ifconfig命令查看IP情况,如下图:

ifconfig

首先要保证虚拟机和主机之间可以互相ping通,如果不能ping通则后续工作无法进行。

打开Putty客户端,出现以下界面,填入相关参数:

输入ubuntu系统的用户名和密码:

成功进入命令行界面:

putty连接Ubuntu虚拟机超时,Network error: Connection timed out?

网络能ping通,但是putty连接Ubuntu时却显示连接超时?

(1)如果仍然无法远程访问ubuntu系统,可能是ubuntu防火墙开了,关掉试试。

(2)也可以试试还原vmware的网络设置,当然ip等信息会自动变化。

点击还原默认设置即可,还原后,他的子网地址会改变,linux的ip地址也会改变。

3、ubuntu进程管理

3.1 top命令查看进程pid

top

3.2 ps命令查看进程

相关参数整理如下:

-aux 以BSD风格显示进程 常用-efH 以System V风格显示进程-e , -A 显示所有进程a 显示终端上所有用户的进程x 显示无终端进程u 显示详细信息f树状显示w 完整显示信息l显示长列表

ps

ps aux

ps aux| grep pyheat

3.3 kill命令关闭进程

kill -9 pid #用来强制终止指定pid进程(推荐使用此方法)kill -9 -1#终止你拥有的全部进程

kill -9 15494

pkill firefox

3.4 nohup命令

nohup 命令是英语词组 no hangup 的缩写,意思是不挂断,也就是指程序不退出。这个命令会使程序忽略 HUP 信号,保证程序能够正常进行。

1、nohup 是 no hang up 的缩写,就是不挂断的意思。2、nohup命令:在系统上运行一个进程的时候,不想让其在你退出账号时关闭,即可用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。3、nohup在不规定的情况下,所以输出内容会到nohup.out中。

nohup python3 demo.py >/dev/null 2>&1 &

run.py为Flask项目的启动脚本,在python环境中不间断的运行run.py,并且将标准内容和错误内容输出到flask.log这个日志文件中,即请求api若出现报错信息即可通过日志定位到问题。

nohup python3 run.py >> /www/wwwroot/log/flask.log 2>&1 &

2>&1的意思:

0 表示stdin标准输入,用户键盘输入的内容1 表示stdout标准输出,输出到显示屏的内容2 表示stderr标准错误,报错内容2>&1是一个整体,>左右不能有空格,即将错误内容重定向输入到标准输出中去。

nohup和&的区别:

1、&才是后台运行

2、nohup : 不挂断的运行,注意并没有后台运行的功能,,就是指,用nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,例如我们断开SSH连接都不会影响他的运行,注意了nohup没有后台运行的意思;

3.5 设置开机自启动

在/usr/lib/systemd/system目录下包含了各种unit文件,有service后缀的服务unit,有target后缀的开机级别unit等,这里介绍关于service后缀的文件。因为systemd在开机要想执行自启动,都是通过这些*.service 的unit控制的,服务又分为系统服务(system)和用户服务(user)。

系统服务目录:/usr/lib/systemd/system/,开机不登录就能运行的程序(常用于开机自启)。

用户服务目录:/usr/lib/systemd/user/,需要登录以后才能运行的程序。

(づ ̄ 3 ̄)づ(づ ̄ 3 ̄)づ(づ ̄ 3 ̄)づ(づ ̄ 3 ̄)づ(づ ̄ 3 ̄)づ(づ ̄ 3 ̄)づ(づ ̄ 3 ̄)づ(づ ̄ 3 ̄)づ(づ ̄ 3 ̄)づ(づ ̄ 3 ̄)づ

在/usr/lib/systemd/system目录下新建my1225.service文件:

[Unit]#服务描述#Description=test Service#指定了在systemd在执行完那些target之后再启动该服务After=network.target[Service]#定义Service的运行类型,这种一般是开机自启动文件就是可执行文件Type=simple#Type=forking,这种一般是开机自启动文件为shell脚本文件,脚本文件里面可能写了多个需要#开机自启动的程序,forking代表子进程的方式,就是脚本里的程序以子进程后台运行。#定义systemctl start|stop|reload *.service 的执行方法(具体命令需要写绝对路径)ExecStart=/home/tomcat/Desktop/test.sh -start#-start加不加都行#创建私有的内存临时空间PrivateTmp=True[Install]#多用户WantedBy=multi-user.target

重载系统服务:systemctl daemon-reload设置开机启动:systemctl enable *.service启动服务:systemctl start *.service停止服务:systemctl stop *.service重启服务:systemctl restart *.service

d=====( ̄▽ ̄*)bd=====( ̄▽ ̄*)bd=====( ̄▽ ̄*)bd=====( ̄▽ ̄*)bd=====( ̄▽ ̄*)bd=====( ̄▽ ̄*)bd=====( ̄▽ ̄*)b

Ubuntu 20.04的服务管理是基于systemd的,因此设置服务自启动最推荐的方法是在/etc/systemd/user目录下创建一个systemd服务文件,配置好要执行的服务。

(1)创建我们需要开机自启动的脚本,例如test.sh

#!/bin/bash -e # source /home/tomcat/venv_demo/bin/activate flask_test# source命令进行conda环境激活,需要使用绝对路径打开acvatie目录指定。cd /home/tomcat/flask_testgunicorn -w 4 -b 127.0.0.1:8000 flask_test:app &exit 0

(2)在/etc/systemd/user目录下创建一个systemd服务文件, 命名为my1225.service

[Unit]After=network.service# After表示在哪个服务启动后启动我们的程序,After=network.service 表示网络连接完成后,启动我们的程序[Service]ExecStart=/home/tomcat/test.sh # 此处只能绝对路径# ExecStart表示我们的脚本(步骤1中的test.sh)的执行路径[Install]WantedBy=default.target# WantedBy默认填default.target,表示我们程序所在的服务组。

# vi /etc/systemd/system/flaskapp.service[Unit]Description=A Gunicorn example to serve Flask AppAfter=network.target[Service]WorkingDirectory=/home/tomcatExecStart=/home/tomcat/python/bin/gunicorn -w 3 -b 0.0.0.0:8888 wsgi:app --timeout 120[Install]WantedBy=multi-user.target

(3)将systemd服务文件和我们的脚本更改权限,使其可执行。

sudo chmod 744 ~/test.shsudo chmod 664 /etc/systemd/user/my1225.service

(4)重新加载系统的systemd服务文件,并启用我们自己写的my1225.service文件。

sudo systemctl daemon-reloadsystemctl --user enable my1225.service

(5)取消开机自启动

systemctl --user disable my1225.servicecd /etc/systemd/userrm my1225.service

(。・∀・)ノ (。・∀・)ノ (。・∀・)ノ (。・∀・)ノ (。・∀・)ノ (。・∀・)ノ (。・∀・)ノ (。・∀・)ノ (。・∀・)ノ (。・∀・)ノ

创建一个systemd单元文件将允许Ubuntu的init系统自动启动uWSGI并在服务器启动时为Flask应用程序提供服务。

在/etc/systemd/system目录创建一个以.service为结尾的单元文件开始:

sudo nano /etc/systemd/system/myproject.service

[Unit]Description=uWSGI instance to serve myprojectAfter=network.target​[Service]User=sammyGroup=www-dataWorkingDirectory=/home/sammy/myprojectEnvironment="PATH=/home/sammy/myproject/myprojectenv/bin"ExecStart=/home/sammy/myproject/myprojectenv/bin/uwsgi --ini myproject.ini​[Install]WantedBy=multi-user.target

这样,我们的systemd服务文件就完成了。立即保存并关闭它。

我们现在可以启动我们创建的uWSGI服务并启用它,以便它在启动时启动:

sudo systemctl start myprojectsudo systemctl enable myprojectsudo systemctl status myproject

(o=^•ェ•)o┏━┓(o=^•ェ•)o┏━┓(o=^•ェ•)o┏━┓(o=^•ェ•)o┏━┓(o=^•ェ•)o┏━┓(o=^•ェ•)o┏━┓(

(1)创建系统服务

vim /usr/lib/systemd/system/robot.service

[Unit]Description=robotAfter=network.target[Service]Type=forkingExecStart=/usr/local/python3/bin/ENV/bin/python /usr/local/python3/bin/ENV/p3.py &PrivateTmp=true[Install]WantedBy=multi-user.target

ExecStart为服务启动时执行的命令,不能用相对路径, 一定要全路径。

这里也可以将命令写到任意的.sh文件中。

(2)启用自定义系统服务

systemctl enable robotsystemctl start robotps aux|grep robot

4、ubuntu网络端口管理

netstat命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。

-a或–all:显示所有连线中的Socket;-A<网络类型>或–<网络类型>:列出该网络类型连线中的相关地址;-c或–continuous:持续列出网络状态;-C或–cache:显示路由器配置的快取信息;-e或–extend:显示网络其他相关信息;-F或–fib:显示FIB;-g或–groups:显示多重广播功能群组组员名单;-h或–help:在线帮助;-i或–interfaces:显示网络界面信息表单;-l或–listening:显示监控中的服务器的Socket;-M或–masquerade:显示伪装的网络连线;-n或–numeric:直接使用ip地址,而不通过域名服务器;-N或–netlink或–symbolic:显示网络硬件外围设备的符号连接名称;-o或–timers:显示计时器;-p或–programs:显示正在使用Socket的程序识别码和程序名称;-r或–route:显示Routing Table;-s或–statistice:显示网络工作信息统计表;-t或–tcp:显示TCP传输协议的连线状况;-u或–udp:显示UDP传输协议的连线状况;-v或–verbose:显示指令执行过程;-V或–version:显示版本信息;-w或–raw:显示RAW传输协议的连线状况;-x或–unix:此参数的效果和指定"-A unix"参数相同;–ip或–inet:此参数的效果和指定"-A inet"参数相同。

4.1 查看端口是否被占用方法

netstat -anp |grep 40001

4.2 列出所有端口(包含TCP和UDP)

netstat -a

4.3 列出所有TCP端口

netstat -at

4.4 列出所有UDP端口

netstat -au

4.5 列出所有处于监听状态的 Sockets

netstat -l

4.6 只列出所有监听tcp端口

netstat -lt

4.7 只列出所有监听udp端口

netstat -lu

4.8 只列出所有监听UNIX端口

netstat -lx

4.9 输出中显示 PID 和进程名称

netstat -pt

4.10 输出中不显示主机,端口和用户名

netstat -an

4.11 显示核心路由信息

netstat -r# ornetstat -rn

显示网络接口列表:

netstat -i

4.12 找出程序运行的端口

netstat -tunlp | grep ssh

4.13 找出运行在指定端口的进程

netstat -an | grep ":3306"

通过端口找进程ID:

netstat -tunlp | grep 80 | awk '{print $7}' | cut -d/ -f1

netstat -nltp#或者netstat -nltp | grep python#或者netstat -apn | grep 10010

5、ubuntu防火墙设置

5.1 查看防火墙状态

由于LInux原始的防火墙工具iptables过于繁琐,所以ubuntu默认提供了一个基于iptable之上的防火墙工具ufw。

ubuntu 9.10默认的便是UFW防火墙,它已经支持界面操作了。在命令行运行ufw命令就可以看到提示的一系列可进行的操作。

Ubuntu20.04一般都默认安装了UFW(Uncomplicated Firewall),它是一款轻量化的工具,主要用于对输入输出的流量进行监控。

如果没有安装,请用下面的命令安装:

sudo apt install ufw

正常情况安装以后应该是默认禁止状态的,输入如下命令查看状态:

sudo ufw status verbose

这表示防火墙没有开启,下面启用防火墙。

sudo ufw status

5.2 开启和关闭防火墙

只需设置如下三条命令:

sudo apt install ufwsudo ufw enablesudo ufw default deny

sudo ufw default allow/deny:外来访问默认允许/拒绝。

sudo ufw enable/disable:打开/关闭ufw。

sudo ufw status:查看已经定义的ufw规则。

sudo ufw delete allow/deny 20:删除以前定义的"允许/拒绝访问20端口"的规则。

sudo ufw disable

5.3 打开或关闭某个端口

sudo ufw allow 53 允许外部访问53端口(tcp/udp)sudo ufw allow 3690 允许外部访问3690端口(svn)sudo ufw allow from 192.168.1.111 允许此IP访问所有的本机端口sudo ufw allow proto tcp from 192.168.0.0/24 to any port 22 允许指定的IP段访问特定端口sudo ufw delete allow smtp 删除上面建立的某条规则,比如删除svn端口就是 sudo ufw delete allow 3690

sudo ufw allow 40001sudo ufw delete allow 40001

6、flask测试

以 Flask 项目为例,Flask作为Web框架,它的作用主要是为了开发Web应用程序。

一个Web应用程序包含了三个部分,前端,服务端,数据库。

数据库负责存储数据,作为数据存储和查询的引擎;前端网站作为用户直接查看的页面,负责展示数据。Flask 负责对数据库进行操作,将数据库中的数据渲染至前端。

6.1 配置python开发环境

python

python3# orpython3 -V

pip list

sudo apt install python3-pip

pip list

6.2 创建虚拟环境venv

# 新建测试文件夹mkdir testcd test# 注意:python3 内置了venv,所以不用再pip安装virtualenv了。# venv_demo 就是虚拟环境的名字python -m venv venv_demo # 激活虚拟环境venv_demo/Scripts/activate

创建虚拟环境失败,系统提示需要装工具。安装虚拟环境库venv工具。

sudo apt install python3.8-venv

安装成功,再继续创建虚拟环境如下:

python -m venv venv_demo

激活虚拟环境如下:

source venv_demo/bin/activate

pythonpython -Vpip list

6.3 安装flask库

pip install flask

安装一步到位,安装成功如上。

6.4 测试flask入门例子

编写测试脚本demo.py如下:

demo.py:

from flask import Flaskapp = Flask(__name__)@app.route('/')def hello_world():return 'Hello World!小沐!'if __name__ == '__main__':app.run()

运行命令如下:

python demo.py

运行结果,跨电脑无法访问。即使防火墙允许了端口5000。

修改测试脚本demo.py如下:

demo.py:

from flask import Flaskapp = Flask(__name__)@app.route('/')def hello_world():return 'Hello World!小沐!'if __name__ == '__main__':app.run(host="0.0.0.0")

运行命令如下:

python demo.py

运行结果,跨电脑可以访问。

6.5 测试flask图表例子(pyecharts)

新建一个项目flask_pyecharts

(1)安装pyecharts库

pip install pyecharts

pip list

(2)拷贝 pyecharts 模板

将链接中的以下模板

├── jupyter_lab.html

├── jupyter_notebook.html

├── macro

├── nteract.html

├── simple_chart.html

├── simple_page.html

└── table.html

全部拷贝到 tempaltes 文件夹中

/pyecharts/pyecharts/tree/master/pyecharts/render/templates

(3)编写测试脚本demo_echart.py如下:

from flask import Flask# from jinja2 import Markupfrom markupsafe import Markupfrom pyecharts import options as optsfrom pyecharts.charts import Barapp = Flask(__name__, static_folder="templates")def bar_base() -> Bar:c = (Bar().add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]).add_yaxis("商家A", [5, 20, 36, 10, 75, 90]).add_yaxis("商家B", [15, 25, 16, 55, 48, 8]).set_global_opts(title_opts=opts.TitleOpts(title="Bar-基本示例", subtitle="我是副标题")))return c@app.route("/")def index():c = bar_base()return Markup(c.render_embed())if __name__ == "__main__":app.run(host="0.0.0.0")

6.6 127.0.0.1还是0.0.0.0?

可能遇到的问题:flask接口只能用127.0.0.1访问,用内网或者外网都不能访问?

(1)采用直接运行flask文件的方式,那么host地址应该写“0.0.0.0”。

如果写“127.0.0.1”的话就无法用内网地址或者外网地址。(2)如果通过gunicorn(wsgi)运行flask,那么就是gunicorn配置文件里面的bind = ‘0.0.0.0:5000’。

如果写127.0.0.1,那么就只能在本机通过127.0.0.1::port来访问,

如果写0.0.0.0,那就就可以用127.0.0.1:port、内网:port、外网:port来访问flask接口。

# 内外网均正常访问的写法app.run(host='0.0.0.0', port=5000, debug=True)

结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭

如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???

如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)

感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。