浏览器显示 Python 代码而不是执行它

Posted

技术标签:

【中文标题】浏览器显示 Python 代码而不是执行它【英文标题】:Browser displaying Python code rather than executing it 【发布时间】:2020-08-16 10:58:22 【问题描述】:

我已经使用 python 构建了一个数独求解器,今天我为用户设置了一个网页,以便将数字输入到一个看起来像数独的网格中,然后单击求解。这是通过表单完成的,“解决”是提交按钮。因为数独页面很长,问题也不是页面特有的,所以我在下面放了一些简化的html表单代码作为测试。

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>Test</title>
  </head>
  <body>
    <form id="sudoku" action="Test.py" method="post">
      <label for="num-input"> Enter a Number: </label>
        <input type="number" name="num-input">
      <label for="num-input"> Enter another Number: </label>
        <input type="number" name="num-input">
      <label for="num-input"> Enter a third Number: </label>
        <input type="number" name="num-input">
      <button type="submit" name="submit" form="sudoku"> Submit </button>
    </form>
  </body>
</html>

当表单被提交时,它应该被发送到 Test.py 以便被操作。在网上,我找到了同时使用 CGI 和 Flask 来执行此操作的示例,但两次我都遇到了同样的问题。

改编自Posting html form values to python script的CGI代码:

import cgi
form = cgi.FieldStorage()
numbers =  form.getvalue('num-input')

改编自 https://opentechschool.github.io/python-flask/core/form-submission.html 的 Flask 代码:

from flask import request, redirect 

@app.route('/Test.py', methods = ['POST'])
    def signup():
        nums = request.form['num-input']
        print(nums)
        return redirect('/index.html')

我已经在我的测试表上尝试了这两种解决方案和许多其他解决方案,但我一直遇到一个反复出现的问题。当我单击提交时,浏览器会将我重定向到显示原始 python 代码的页面,而不执行任何代码(或者看起来如此)。形式不应该是问题;我通过简单地将方法属性切换为“get”并检查我被重定向的页面的 url 来验证它正在输出数据。所以问题一定出在浏览器上,或者可能出在python代码上?我在 CGI 或 Flask 方面都不是很有经验,事实上我是一般编码的初学者,但考虑到互联网上用于将 html 表单数据发送到 python 文件的类似解决方案的数量,我假设这是为了是一件很简单的事情。

作为一个附加问题,如果我还没有将 python 代码的输出放在另一个 html 页面中,那么它的输出应该去哪里?

提前感谢您的帮助。

【问题讨论】:

你是如何运行这个应用程序的?在浏览器中呈现原始 Python 代码的情况很少见;这表明您使用传统的网络服务器提供.py 文件。您需要安装 python,然后使用 pip 之类的包管理器安装烧瓶库,然后您可以使用 flask run 启动开发服务器... 我在本地主机的 chrome 上运行应用程序。我只是打开 html 测试表单并从那里继续。该页面不是通过 Flask 使用 python 创建的,它是纯 html(实际数独应用程序中的 CSS 和 javascript)。我安装了 python,它在终端上运行良好,flask 也是如此。 @v25 在下面的答案中详细了解我的问题。 【参考方案1】:

我真的很想帮助你,你似乎犯了一些初学者的错误,所以希望这个答案有点用:

对于处理表单提交的代码,您可能希望创建一个单独的视图函数,根据 HTTP 请求方法,呈现表单或返回结果。

app.py

from flask import Flask, request, render_template 
app = Flask(__name__)

@app.route('/', methods = ['GET','POST'])
def index():
    if request.method == 'POST':
        num_input = request.form['num-input']
        return render_template('index.html', num = num_input)

    elif request.method == 'GET':
        return render_template('index.html')
如果此代码收到 GET 请求(您在浏览器中点击 / 端点),则呈现 index.html 模板。 如果此代码收到 POST 请求(表单已提交),则获取 num_input 变量,然后将其作为 num 传递回模板。

现在对于一个模板,根据是否将 num 参数传递给 render_template,该模板将显示该数字或显示 HTML 表单。

一定要把它放在templates/ 子目录中:

templates/index.html

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>Test</title>
  </head>
  <body>
  % if num %
    The number you entered was: num
  % else %
    <form action="/" method="POST">
      <label for="num-input"> Enter a Number: </label>
        <input type="number" name="num-input" />
      <input type="submit" value="Submit"> 
    </form>
  % endif %
  </body>
</html>

使用flask run 在开发服务器中运行它,您应该会看到开发服务器启动:

 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

在浏览器中打开该 URL 应该会出现一个输入框,然后提交应该会显示:

The number you entered was: 42 

要扩展它,您可以向表单添加更多输入字段,只需确保每个字段都有一个唯一的name 属性。

<label for="num-input-two"> Enter another Number: </label>
<input type="number" name="num-input-two">

【讨论】:

感谢您的回答。我有几个问题。在复制了上面的代码后,我厌倦了在烧瓶上运行应用程序,它将我重定向到“/”而不执行任何 python。此外,它不会执行 html 中的 if 语句,而是将其像文本一样打印在屏幕上。 @GiacomoSaracchi 你能张贴这个截图吗?【参考方案2】:

@v25 这里是与我遇到的问题相关的屏幕截图。

1.尝试在烧瓶上运行应用程序

2。从 Test.html 表单运行应用程序

3.提交表格

【讨论】:

嗨。当您在第一个屏幕截图上看到“内部服务器错误”时,您是否还可以显示您在服务器控制台中看到的内容。应该有一些调试输出。如果您在开发模式下启动烧瓶服务器:FLASK_ENV=development flask run 这也应该将该调试输出放在浏览器中,而不仅仅是引发内部服务器错误。至于第二个屏幕截图,了解这个地址栏中的内容会很有帮助。它肯定看起来不像烧瓶正确地服务。也许也可以用你的完整代码更新它。 @v25 更新。使用 FLASK_ENV=development flask run 运行应用程序,我找到了错误的原因。 Flask 无法将 HTML 测试文件识别为模板。错误是:jinja2.exceptions.TemplateNotFound: /Users/user/Documents/Coding/Penguin Project/Templates/test1.html。我确实将 HTML 文件放在了模板文件夹中,但我认为它没有将其识别为模板文件夹,因为我在自己的机器上运行该文件,而不是在具有预定义模板文件夹的 Web 服务器上运行。完整的代码在这里真的不相关,我只是想运行一个简单的测试来扩展我的理解。 该错误看起来您需要验证您是否可以验证cat /Users/user/Documents/Coding/Penguin Project/Templates/test1.html。默认情况下,除非您另有指定,否则flask 将在项目的templates 子目录中查找模板(与app.py 相关)。网络服务器无关紧要。如果您使用开发服务器在本地运行它,它应该可以完全运行。 那么我如何告诉flask我的模板在那个文件夹中?为什么通过终端连接 (cat /Users/user/Documents/Coding/Penguin Project/Templates/test1.html) 有帮助? TemplateNotFound 异常表明它正在寻找模板的路径。 cat 该文件以确保它存在并具有正确的内容。默认情况下,Flask 在templates 文件夹(小写t)中查找。异常看起来像是针对Templates,这表明您已经覆盖了它。不过暂时不要调整默认值:只要确保有一个模板,它的外观就是我的重点。

以上是关于浏览器显示 Python 代码而不是执行它的主要内容,如果未能解决你的问题,请参考以下文章

Tor 浏览器 GUI 显示代码而不是字符

HTML 表单操作最终下载 perl 文件而不是执行它

nodejs怎么把html以源码的形式在网页中显示了,而不是解析它

Python 文件在浏览器窗口中打开,而不是下载提示

Perl Apache:Perl 脚本显示为纯文本

浏览器显示�而不是´