Flask仅在调试模式下按预期工作

时间:2017-01-14 21:46:01

标签: javascript python flask electron

我正在使用电子和烧瓶创建桌面应用程序。当我尝试发送一个选定的路径时(由用户通过文件夹选择对话框选择。使用电子我能够获得完整路径而不是像C:/ fake_path。这是因为电子通过.files提供完整路径[ 0] .path)使用flask的python,我从未收到响应或捕获错误(在rq之后的任一分支中都不会调用main.logPython函数)。

但是,如果我在python文件中包含app.debug = True以打开Flask调试器,它将按预期运行并打印出路径。基本上,除非我把它放入调试模式,否则甚至无法访问python代码。

编辑:我知道这是真的,因为我试图运行python代码而不仅仅是返回(比如创建一个新文件)并且它永远不会运行。

编辑#2:看来这个问题与admin.js文件有关。如果我尝试在main.js文件中建立类似的连接,我会得到我期望的结果,但是如果我在admin.js文件中使用相同的代码,我没有得到如上所述的响应。

希望我提供了足够的信息。如果您还有其他需要,请告诉我。

很抱歉JavaScript代码存在任何格式问题,我对它很新,所以我只是把它扔进了脏标记中来清理它。

调用JavaScript代码(admin.js)

const remote = require("electron").remote;
const main = remote.require("./main.js");
var importButton = document.getElementById("importButton");
if (importButton.addEventListener) {
    importButton.addEventListener("click", importPackages, false);
} else if (importButton.attachEvent) {
    importButton.attachEvent("onclick", importPackages);
}

function importPackages() {
    var importDirectory = document.getElementById("importDirectory").files[0].path;
    var rq = require('request-promise');
    var mainAddr = 'http://localhost:5000';
    rq(mainAddr + "/import_packages/" + importDirectory).then(function(htmlString) {
        if (htmlString != "false") {
            main.logPython(htmlString);
        }
    }).catch(function(err) {
        main.logPython('request not sent');
    })
}

python代码(database_handler.py)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from flask import Flask, request
import sqlite3

app = Flask(__name__)
# app.debug = True

@app.route("/")
def hello():
    return "true"


@app.route("/login/<username>/<password>")
def login(username, password):
    conn = sqlite3.connect("hict.sqlite")
    cursor = conn.cursor()
    cursor.execute("SELECT firstname, lastname, userclass FROM credentials "
                   "WHERE username=? AND password=? LIMIT 1;",
                   (username, password))
    data = cursor.fetchall()
    if len(data) == 0:
        return "false"
    else:
        return "|".join(map(str, data[0]))


@app.route("/import_packages/<path:import_directory>")
def import_packages(import_directory):
    return import_directory


if __name__ == "__main__":
    app.run(host='127.0.0.1', port=5000)

主要JavaScript代码(main.js)

const electron = require("electron");
const {app, BrowserWindow} = electron;
app.on('window-all-closed', () => {
    app.quit();
})
app.on('ready', () => {
    var subpy = require('child_process').spawn('python', ['./database_handler.py']);
    //var subpy = require('child_process').spawn('./dist/hello.exe');
    var rq = require('request-promise');
    var mainAddr = 'http://localhost:5000';
    var openWindow = () => {
        let win = new BrowserWindow({
            width: 1920,
            height: 1080
        });
        win.maximize();
        win.setMenu(null);
        win.loadURL(`file://${__dirname}/login.html`);
        win.on('closed', () => {
            win = null;
            subpy.kill('SIGINT');
        })
    }
    var startUp = () => {
        rq(mainAddr).then(function(htmlString) {
            console.log('server started!');
            openWindow();
        }).catch(function(err) {
            console.log('waiting for the server start...');
            startUp();
        })
    }
    startUp();
})
exports.logPython = (returnData) => {
    console.log(returnData);
}

1 个答案:

答案 0 :(得分:0)

看起来您正在使用admin.js作为UI中的代码,因此它处于渲染器过程中。您的main.js看起来像是在项目的主进程中运行。在这种情况下,我不确定它是否真的能够在admin.js中要求main.js。为什么不尝试使用ipc to send从UI到主进程(main.js)的数据?

另外,要消除一个明显的答案...... 主进程(main.js)中的console.log()将按照您的预期在您的终端中打印出来。渲染器进程(admin.js)中的console.log()在开发控制台中打印出来。在Windows上,我认为你打开它,通过点击你的用户界面,然后按Ctrl + Shift + i。因此,如果您不知道这一点,它可能会起作用,但您没有看到它。