PythonWeb–flask部署问题
以前在云服务器上都是用root
权限部署的,很流畅…这次用了活动室电脑是管理员权限apollo3d
…于是出现了很大的问题…
内网穿透
活动室电脑的IP是通过路由器分配的IP,如192.168.1.145
,这是一个局域网,别人是不可能通过这个IP访问到你的服务器的.(访问都是通过公网的。除非两台电脑在同一个局域网内)。
于是想到直接连活动室的网不就行了吗(如果活动室的是公网IP,只要对路由器设置个端口映射就行了),但发现,活动室的IP也是校园网分配的,已经经过了多次的NAT,于是这个方法也没用。
搜了下网上关于“内网中的电脑当做服务器”,找到了方案就是“内网穿透”,而能实现这个功能的软件不少如花生壳
、frp
…在此,我用花生壳
达成了目的,花了6元…
花生壳
注册账号后会送给你一个域名,而“内网穿透”的功能是需要买的。他实现的原理大致是将动态变化的IP绑定在了这个域名上,每次IP变换的时候就重新DNS解析,所以达成了“IP跟随”
设置好后,就可以直接通过域名访问到内网下的电脑了!
frp
见另外一篇博客的配置方法《frp结合nginx实现内网web服务和tcp的转发》
非root权限——管理员权限
之前都是部署在/var/www
目录下的,这次也没多想,也照样…结果踩了坑,弄了几小时.
先是pip install virtualenv
安装了virtualenv
库,然后用virtualenv env
新建了个虚拟环境
但问题来了,windows下的目录结构跟linux下的有些小小的不同,导致运行uwsgi
报错No module flask
时一直没找到原因
linux下结构:
1 | --|env |
正常情况下只要激活了虚拟环境
,那么pip安装的库应该都是在该虚拟环境下的,这次出了什么问题呢?
1.猜测没有site-packages
当时因为linux终端显示的原因没看到site-packages
,于是就以为没有linux下建立的虚拟环境没有site-packages
,但事实证明这个是没有关系的…
2.uwsgi.ini
没有指定虚拟环境
网上给出的都是因为没有进入虚拟环境执行或者是配置中没有指定虚拟环境路径
3.加了sudo
根据报错显示知道,sudo pip install -r requirements.txt
的库都安装到了默认python目录下了…原因是因为加了sudo
.
▲一定不要使用sudo pip … ,这里是在虚拟环境中安装python包,如果使用了sudo权限,python包会被安装在主机非虚拟环境下,在虚拟环境中找不到这个包。
永远不要使用sudo pip install; 你可以在不知情的情况下覆盖重要的东西。使用pip install --user代替
于是那就不加吧,命令改为pip install -r requirements.txt
,此时有报错Could not install packages due to anEnvironmentError: [Error 13] Permission denied:...,consider using '--user' options
,既然提示用--user
参数那就试试吧.
结果返回的是Can not perform a '--user' install. User site-packages are not visible in this virtualenv
,这是为什么还是不行呢?
pip install --user
遵循四条规则:
-
当全局安装的软件包位于python路径上,并且它们 与安装要求冲突时,它们将被忽略,而不会被 卸载。
-
当全局安装的软件包位于python路径上并且它们满足 安装要求时,pip什么都不做,并报告满足要求(类似于在
--system-site-packages
virtualenv中安装软件包时全局软件包如何满足要求)。 -
由于用户站点不在python路径上,因此pip不会
--user
在--no-site-packages
的virtualenv(即默认类型的virtualenv)中执行安装。安装没有意义。1
2
3import sys
print(sys.path)
'C:\\Users\\10630\\Desktop', 'D:\\python\\python36.zip', 'D:\\python\\DLLs', 'D:\\python\\lib', 'D:\\python', 'C:\\Users\\10630\\AppData\\Roaming\\Python\\Python36\\site-packages', 'D:\\python\\lib\\site-packages', 'D:\\python\\lib\\site-packages\\win32', 'D:\\python\\lib\\site-packages\\win32\\lib', 'D:\\python\\lib\\site-packages\\Pythonwin'] [ -
在
--system-site-packages
virtualenv中,pip不会安装与virtualenv site-packages中的包冲突的包。-user安装缺少sys.path优先级并且毫无意义。
那应该就是3的原因了…需要在当前的env
虚拟环境中将权限开放,我的做法是sudo chmod 777 -R *
最终解决方式:
于是我并没有再纠结这个,而是选择了不在/var/www
这个目录下,因为这个目录下的权限关系非常严格,于是我在~/Documents/env
新建了个虚拟环境,一切又如以前一样解决了.
Ubuntu下使用matplotlib
库,需要安装python3-tk
解决方案:sudo apt-get install python3-tk
(如果没更新源,最好更新下源)
附录:
sudo-pip-install-vs-pip-install-user:
回答1:
sudo pip install可能意味着您要在系统范围内安装软件包。对于某些软件包,例如virtualenvwrapper,这可能是有用的,但除此之外,我将避免安装系统范围的软件包并为每个应用程序创建virtualenv并将pip安装到该virtualenv(可以在没有sudo的情况下完成)。
回答2:
1 | $ sudo pip install |
在python安装中全局安装包,即对所有用户安装。
1 | $ pip install --user |
安装到本地用户目录,即〜/ .local / lib / python - 只是你。
例:
1 | $ sudo pip install jupyter |
将运行jupyter,打开Web浏览器,允许您使用笔记本。
1 | $ pip install --user jupyter |
在将本地目录添加到PATH之前,将不执行任何操作。
最近pypi中包含了恶意代码。切勿使用sudo来安装pip。这与以root身份运行病毒相同。将本地文件夹添加到PATH或使用virtualenv。
Author: Mrli
Link: https://nymrli.top/2018/12/21/PythonWeb-flask部署内网电脑/
Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.