【问题标题】:Form data doesn't save to file (through CGI in python)表单数据不保存到文件(通过 python 中的 CGI)
【发布时间】:2020-03-20 02:02:54
【问题描述】:

我用 HTML 制作了一个表单,应该通过我大学的服务器保存一些数据:

<!DOCTYPE html>
<html lang="en-US">
<head>
    <meta charset="UTF-8"/>
    <title>TI 3</title>
    <link rel="stylesheet" href="style_form.css">
    <script type="text/javascript" src="script.js"></script>
</head>
<body>
    <iframe width="0" height="0" border="0" name="dummy" id="dummy"></iframe>

    <h1>TI 3 - form</h1>

    <div class="formSection">
        <form action="../../../cgi-bin/toCsv.py" target="dummy" method="POST" name="studentForm" onsubmit="return validate()">
            <h3>Name: (*required):</h3>
            <input type="text" name="name"/>

            <h3>Surname: (*required):</h3>
            <input type="text" name="surname"/>

            <h3>E-mail address: (*required):</h3>
            <input type="text" name="email"/>

            <h3>University year: (*required):</h3>
            <select name="year" size="1">
                <option value="0">Choose:</option>
                <option value="1">I</option>
                <option value="2">II</option>
                <option value="3">III</option>
                <option value="4">IV</option>
                <option value="5">V</option>
            </select>

            <br>

            <p>
                <input type="submit" name="submitBtn" class="subBt" value="Submit" />
            </p>
        </form>

    </div>

    <hr>

</body>
</html>

我从那里调用名为 toCsv.py 的 python 脚本,该脚本收集数据并应该将它们保存在名为 data.csv 的 CSV 文件中:

#!/usr/bin/env python

import cgi
import csv

print "Content-Type: text/html"
print 

studForm = cgi.FieldStorage()
name = studForm.getvalue("name")
surname = studForm.getvalue("surname")
email = studForm.getvalue("email")
year = studForm.getvalue("year")

data = [name, surname, email, year]
print "data" 
print data

with open('../4/pd1/3/data.csv', 'a') as file:
    write = csv.writer(file, delimiter=",")
    write.writerow(data)

它似乎以应有的方式收集和解析数据。我尝试删除虚拟 iframe 进行调试。我填写了表格并得到了正确的结果: data ['Robert', 'Friedrich', 'lux@torpe.da', '1'].

当我直接从 UNIX 终端调用它时,该脚本会将数据正确保存到 data.csv:./toCsv.py。 (数据显然是空的,但逗号被保存)。

但是,当我提交表单时,似乎没有保存任何内容。有什么问题?

js 脚本只是验证数据,我认为它与问题无关。无论如何,我会发布它,只是为了确定。

function validate(){
    let name = document.studentForm.name.value;
    let surname = document.studentForm.surname.value;
    let email = document.studentForm.email.value;
    let year = document.studentForm.year.value;

    let valid = 1;
    let errorMessage = "";

    if (name.length === 0){
        valid = 0;
        document.studentForm.name.style.backgroundColor = 'red';
        errorMessage += "No name!\n"
    }

    if (surname.length === 0){
        valid = 0;
        document.studentForm.surname.style.backgroundColor = 'red';
        errorMessage += "No surname!\n"
    }

    if (email.length === 0){
        valid = 0;
        document.studentForm.email.style.backgroundColor = 'red';
        errorMessage += "No e-mail!\n"
    }
    else if ((email.indexOf("@")==-1) || (email.length < 3)){
        valid = 0;
        document.studentForm.email.style.backgroundColor = 'red';
        errorMessage += "Wrong e-mail format!\n"
    }

    if(year === "0"){
        valid = 0;
        document.studentForm.year.style.backgroundColor = 'red';
        errorMessage += "No year chosen!"
    }

    if(valid){
        document.studentForm.name.style.backgroundColor = 'rgb(100,255,100)';
        document.studentForm.surname.style.backgroundColor = 'rgb(100,255,100)';
        document.studentForm.email.style.backgroundColor = 'rgb(100,255,100)';
        document.studentForm.year.style.backgroundColor = 'rgb(100,255,100)';
        alert("Form sent.");
        return true;
    }
    else{
        alert(errorMessage);
        return false;
    }
}

【问题讨论】:

  • 也许使用try/except 来捕捉错误并将其保存在文件中(但在同一个文件夹中)。也许它会解释问题。
  • 当你运行服务器时,可能不是../../..,而只是/cgi-bin/toCsv.py。服务器可能使用不同的路径,或者它可能只允许在主文件夹 /cgi-bin 中使用脚本
  • @furas nope,这让事情变得更糟。它曾经找到toCsv.py,但没有保存到data.csv。现在它甚至找不到toCsv.py。如何使用try/catch?我没学过python,只是老师想让我们用它
  • 使用 google 查找任何带有 try/except 的教程 - 您将在评论中获得比此处更多的信息。
  • @furas 但我应该捕获什么错误?似乎没有错,程序不会出错。将路径更改为绝对 /~6domagalski/cgi-bin/toCsv.py 也会导致与 ../../../cgi-bin/toCsv.py 相同的结果。

标签: python html forms cgi


【解决方案1】:

好吧,我自己想通了。这是一个愚蠢的错误——简单的访问问题。 data.csv 无法从外部写入。我需要做的只是简单的一行:chmod 757 data.csv。以前是 755,这就是问题所在。

【讨论】:

    猜你喜欢
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 2012-06-10
    • 1970-01-01
    相关资源
    最近更新 更多