我正在开发一个用python运行的应用程序(始终是热泵系统的控制器),我使用flask提供一个用户界面来控制应用程序。
烧瓶应用程序有不同的控制项,例如打开或关闭系统的按钮。
我试图从python模块执行一个特定的功能,以响应按钮上的“单击”(最终目标是更改mmap资源中的一个值,该值将在另一个模块中读取以更改系统的状态)。
在flask应用程序中,我有如下内容:
@app.route('/cntr_hpauto',methods=['GET','POST'])
@basic_auth.required
def cntr_hpauto():
manage_globals.set_from_web()
return render_template('control.html',cur_hp_mode="auto")
但是,这会产生“内部服务器错误”
完整的烧瓶应用程序是(manage_globals是我要导入的*. py文件,其中包含我要调用的函数):
from flask import Flask, request, render_template
from flask_basicauth import BasicAuth
import sys
import os
import mmap
import manage_globals
app = Flask(__name__)
app.config['BASIC_AUTH_USERNAME'] = '***'
app.config['BASIC_AUTH_PASSWORD'] = '***'
basic_auth = BasicAuth(app)
@app.route('/')
def splash():
return render_template('splash.html')
@app.route('/dashboard', methods=['GET','POST'])
@basic_auth.required
def dashboard():
return render_template('dashboard.html')
@app.route('/control',methods=['GET','POST'])
@basic_auth.required
def control():
return render_template('control.html',cur_hp_mode="none")
@app.route('/cntr_hpauto',methods=['GET','POST'])
@basic_auth.required
def cntr_hpauto():
manage_globals.set_from_web()
return render_template('control.html',cur_hp_mode="auto")
@app.route('/cntr_hpon',methods=['GET','POST'])
@basic_auth.required
def cntr_hpon():
return render_template('control.html',cur_hp_mode="on")
@app.route('/cntr_hpoff',methods=['GET','POST'])
@basic_auth.required
def cntr_hpoff():
return render_template('control.html',cur_hp_mode="off")
if __name__ == '__main__':
app.run(ssl_context=('/home/groenhol/certs/groenhol.pem', '/home/groenhol/certs/groenhol.key'))
模块(例如,仅将map文件写入日志文件)是:
# 14/08/2017 henk witte / groenholland
# part of geotech project, ann controller dual source heat pump
# this module maintains the global database with mmap
import mmap
""" the mmap file is position dependent!
use readlines and split
line 1: heatpump auto/on/off
line 2: userpump off
line 3: srcselect air
"""
def init_conf_file():
dummy="a"
def set_from_web():
with open("geotech.conf", "r+b") as f:
mm = mmap.mmap(f.fileno(), 0)
for line in iter(mm.readline, b''):
with open("globals.log","ab") as f2:
f2.write(line)
f2.close()
mm.close()
if __name__ == '__main__':
init_conf_file()
烧瓶应用程序在没有函数调用的情况下运行良好,我自己导入的模块也运行良好。
任何帮助非常感谢!
亨克
根据凯文·帕斯夸雷拉的建议,我添加了这个应用程序。调试=true。然而,当apache已经加载到主启动页面时,就会发生错误(apache服务器错误),这没有帮助。但我随后查看了apache错误日志:
[Tue Aug 15 21:33:14.638580 2017] [mpm_event:notice] [pid 959:tid 3067240448] AH00489: Apache/2.4.18 (Ubuntu) OpenSSL/1.0.2g mod_wsgi/4.5.17 Python/3.4 configured -- resuming normal operations
[Tue Aug 15 21:33:14.639152 2017] [core:notice] [pid 959:tid 3067240448] AH00094: Command line: '/usr/sbin/apache2'
[Tue Aug 15 21:33:19.825211 2017] [wsgi:error] [pid 2461:tid 3031819312] [remote 192.168.178.85:9676] mod_wsgi (pid=2461): Target WSGI script '/home/groenhol/py_control/ui/webapp/main.wsgi' cannot be loaded as Python module.
[Tue Aug 15 21:33:19.826502 2017] [wsgi:error] [pid 2461:tid 3031819312] [remote 192.168.178.85:9676] mod_wsgi (pid=2461): Exception occurred processing WSGI script '/home/groenhol/py_control/ui/webapp/main.wsgi'.
[Tue Aug 15 21:33:19.967421 2017] [wsgi:error] [pid 2461:tid 3031819312] [remote 192.168.178.85:9676] Traceback (most recent call last):
[Tue Aug 15 21:33:19.970377 2017] [wsgi:error] [pid 2461:tid 3031819312] [remote 192.168.178.85:9676] File "/home/groenhol/py_control/ui/webapp/main.wsgi", line 4, in <module>
[Tue Aug 15 21:33:19.970581 2017] [wsgi:error] [pid 2461:tid 3031819312] [remote 192.168.178.85:9676] from main import app as application
[Tue Aug 15 21:33:19.971031 2017] [wsgi:error] [pid 2461:tid 3031819312] [remote 192.168.178.85:9676] File "/home/groenhol/py_control/ui/webapp/main.py", line 41
然后我搜索了mod_wsgi不能作为python模块加载
答案表明,我使用的python版本(3.4)和wsgi版本之间存在差异。
所以我在 /etc/apache2/mods-enabled/mod-wsgi.load检查了wsgi版本:
LoadModulewsgi_module"/home/groenol/mincon da3/lib/python3.4/site-pack/mod_wsgi/server/mod_wsgi-py34.cpython-34m.so"WSGIPythonHome"/home/groenol/mincon da3"
所以似乎使用python 3.4版本。
为了确保我使用搜索过程中找到的ldd:
groenhol@arm:~/mod_wsgi-4.5.15$ ldd LoadModule wsgi_module "/home/groenhol/miniconda3/lib/python3.4/site-packages/mod_wsgi/server/mod_wsgi-py34.cpython-34m.so"
LoadModule:
ldd: ./LoadModule: No such file or directory
wsgi_module:
ldd: ./wsgi_module: No such file or directory
/home/groenhol/miniconda3/lib/python3.4/site-packages/mod_wsgi/server/mod_wsgi-py34.cpython-34m.so:
linux-vdso.so.1 => (0xbee90000)
libpython3.4m.so.1.0 => /home/groenhol/miniconda3/lib/libpython3.4m.so.1.0 (0xb6d40000)
libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0xb6d0f000)
libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6c23000)
/lib/ld-linux-armhf.so.3 (0x7f64d000)
libdl.so.2 => /lib/arm-linux-gnueabihf/libdl.so.2 (0xb6c10000)
libutil.so.1 => /lib/arm-linux-gnueabihf/libutil.so.1 (0xb6bfd000)
libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0xb6b85000)
libgcc_s.so.1 => /lib/arm-linux-gnueabihf/libgcc_s.so.1 (0xb6b5c000)
groenhol@arm:~/mod_wsgi-4.5.15$ WSGIPythonHome "/home/groenhol/miniconda3"
-bash: WSGIPythonHome: command not found
据我所知(http://modwsgi.readthedocs.io/en/develop/user-guides/checking-your-installation.html#python-共享库)这似乎可以吗?
好的,那么下一步呢?
解决方案非常简单:mod_wsgi不喜欢使用空格和制表符进行标识。我将所有标识更改为选项卡,然后代码运行!
我通过将代码更改为非常简单的代码来发现这一点,只需返回一个字符串并将其打印在由flask模板创建的网页上。然后我可以在apache日志中看到wsgi故障。在完整的代码中,其他故障正在发生,因此很难找出错误的确切原因。
我还注意到Graham Dumpleton的评论(apache无法写入目录),我创建了一个共享目录(/home/py_shared),并将其添加到www数据组(python用户和apache都是该组的成员)。然后,我将文件夹组设置为www data,并使用chmod g w py\u shared和chmod g s py\u shared设置正确的权限。
该主题在几页上进行了讨论,例如:
https://unix.stackexchange.com/questions/154776/create-files-that-both-www-data-and-myuser-can-edit
谢谢你的建议!
代码:
def set_from_web():
with open("geotech.conf", "r+b") as f:
mm = mmap.mmap(f.fileno(), 0)
for line in iter(mm.readline, b''):
with open("globals.log","ab") as f2:
f2.write(line)
f2.close()
mm.close()
这将是一个问题,因为您正在使用文件的相对路径名。
进程的当前工作目录将不在代码所在的位置,也无法写入Apache用户。您需要使用绝对路径,并确保Apache用户对文件具有写入权限。
见:
在过去的几周里,我花了太多的时间试图让它发挥作用。我的目标是使用烧瓶框架创建一个简单的网络应用程序,但我不断收到错误,几个小时的谷歌搜索和搜索stackoverflow也没有帮助。 我正在学习一个教程,该教程要求我运行:$python3 routes.py 只有我才能得到以下错误: 回溯(最近的最后一次调用):文件“routes.py”,第1行,从flask导入flask中,呈现\u模板导入错误:
我试图设置NGINX,uWSGI和烧瓶。我目前正在得到, uWSGI错误 找不到Python应用程序 我得到了一些奇怪的错误在我的uwsgi错误文件,你可以在我的文章底部找到。 我会直截了当地说,这是在运行Ubuntu 13.04 64位的新VPS上,这些是我运行的命令。 sudo apt-get更新 sudo apt-get安装构建基本 sudo apt-get安装python-dev sudo
我试图在python中构建一个可以从XAMPP的Apache运行的应用程序,因此我安装了flask(),并按照以下说明进行mod_wsgi安装http://modwsgi.readthedocs.io/en/develop/user-guides/quick-installation-guide.html.我使用XAMPP的Apache,版本2.4.29和anaconda的python 3.6.4
我希望能够运行我的破折号应用程序从我的烧瓶应用程序,当我去一个特定的网址/破折号。然而,我得到以下错误。TypeError:视图函数没有返回有效的响应。该函数要么返回无,要么结束时没有返回语句。' flaskapp.py dashapp。派克 如果我对我的flaskapp.py做以下更改, 我得到了以下错误,AttributeError:“非类型”对象没有属性“遍历”
2020-10-05 17:59:33,327:异常/[GET]Traceback(最近一次调用最后一次): File"/home/parshuram/. Virtualenvs/myVirtualenv/lib/python3.8/site-pack/flask/app.py",第2446行,wsgi_app响应=self.full_dispatch_request()File"/home/pa
我在应用程序帐户下有一个linux apache 2.4.12和mod_wsgi4.5.2(mod_wsgi.so安装到apache中)。Apache在应用程序帐户下的端口8050下运行。按照这个链接测试mod_wsgi工作:http://modwsgi.readthedocs.org/en/develop/user-guides/quick-configuration-guide.html#ws