簡體   English   中英

Flask僅在調試模式下按預期工作

[英]Flask only working as expected in debug mode

我正在使用電子和燒瓶創建桌面應用程序。 當我嘗試發送選定的路徑時(由用戶通過文件夾選擇對話框選擇。使用電子,我能夠獲得完整路徑,而不是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);
}

您似乎在用戶界面中使用admin.js作為代碼,因此它處於渲染器過程中。 您的main.js看起來好像正在項目的主流程中運行。 我不確定在這種情況下是否真的需要在admin.js中使用main.js。 為什么不嘗試使用ipc將數據從UI發送到主進程(main.js)?

另外,為了消除明顯的答案,主進程中的console.log()(main.js)將按您的期望在終端中打印出來。 渲染器進程(admin.js)中的console.log()在開發者控制台中打印出來。 在Windows上,我認為您可以通過以下方法打開它:單擊您的UI,然后按Ctrl + Shift + i。 因此,如果您不知道該信息,它可能會起作用,但您看不到它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM