我正在开发一个用python运行的应用程序(总是-它是热泵系统的控制器),我使用flask提供一个用户界面来控制应用程序。在
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")
但是,这会生成“内部服务器错误”
完整的flask应用程序是(manage_globals是我要导入的*.py文件,其中包含我要调用的函数):
^{pr2}$模块(例如,只将映射文件写入日志文件)是:
# 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()
flask应用程序在没有函数调用的情况下运行良好,我自己导入的模块也运行良好。在
非常感谢任何帮助!在
母鸡
正如凯文·帕斯夸雷拉建议的那样,我补充道应用程序调试=正确。但是,当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 cannot loaded as python module
答案表明我使用的python版本(3.4)和wsgi版本之间存在差异。在
所以我检查了/etc/apache2/mods enabled/mod中的wsgi版本-wsgi.load文件公司名称:
LoadModule wsgi_module“/home/groenhol/miniconda3/lib/python3.4/site packages/mod_wsgi/server/mod_wsgi-py34.cpython-34m.so” WSGIPythonHome“/home/groenhol/miniconda3”
所以似乎使用了python3.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
{a1}据我所知,可以吗?在
好吧,那么下一步呢?在
结果发现这个解决方案非常简单:mod乩wsgi不喜欢使用空格和制表符进行标识。我把所有的标识改为制表符,然后代码运行!在
我通过将代码更改为非常简单的代码,只需返回一个字符串并将其打印在由flask模板创建的网页上,我就发现了这一点。然后我可以在apache日志中看到wsgi错误。在完整的代码中,其他错误正在发生,因此很难找出错误的确切原因。在
我还处理了Graham Dumpleton的评论(apache不能写入目录),我创建了一个共享目录(/home/py_shared),并将其添加到www数据组(python用户和apache都是该组的成员)。然后,我将文件夹的组设置为www data,并使用chmodg+wpy-shared和chmod g+spy_shared设置正确的权限。在
本主题在几页中讨论,例如:
https://unix.stackexchange.com/questions/154776/create-files-that-both-www-data-and-myuser-can-edit
谢谢你的建议!在
代码:
将成为一个问题,因为您正在使用文件的相对路径名。在
进程的当前工作目录将不在您的代码所在的位置,并且也不可写入Apache用户。您需要使用绝对路径并确保Apache用户对文件具有写权限。在
参见:
相关问题 更多 >
编程相关推荐