从flask app调用python函数

2024-10-01 09:21:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个用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}据我所知,可以吗?在

好吧,那么下一步呢?在


Tags: pymodwsgihomelinuxliblinepid
2条回答

结果发现这个解决方案非常简单: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

谢谢你的建议!在

代码:

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用户对文件具有写权限。在

参见:

相关问题 更多 >