Python 我能';我不能让这个简单的表单更新程序工作

Python 我能';我不能让这个简单的表单更新程序工作,python,flask,Python,Flask,我试图编写一个简单的脚本,通过表单接受用户的更改,然后将这些更改写入当前文件中。然后,使用当前更新的数据直接在表单下方调用此文件。这就是我现在写的东西。我想要一个文本框,我可以把文本放入其中,然后该文本将覆盖该文件中当前的任何文本 以前,这些函数(例如request.form)在我修补过的其他示例中工作得很好,但是当我为自己的挑战而将它们放在一起时,似乎没有什么能像它应该的那样工作 from flask import Flask, render_template, request import

我试图编写一个简单的脚本,通过表单接受用户的更改,然后将这些更改写入当前文件中。然后,使用当前更新的数据直接在表单下方调用此文件。这就是我现在写的东西。我想要一个文本框,我可以把文本放入其中,然后该文本将覆盖该文件中当前的任何文本

以前,这些函数(例如request.form)在我修补过的其他示例中工作得很好,但是当我为自己的挑战而将它们放在一起时,似乎没有什么能像它应该的那样工作

from flask import Flask, render_template, request
import html

app = Flask(__name__)

@app.route('/', methods=['POST']) 
def home():
    with open('text.html') as contents:
        data = contents.read()

    return render_template('test_form.html',
                           the_title = 'Test Form',
                           the_contents = data)


@app.route('/update', methods=['POST', 'GET'])
def update():
    contents = request.form['letters']
    with open('text.html', 'w') as file:
        print(contents, file=file)

    return render_template('test_form.html',
                           the_title = 'Update complete!',
                           the_contents = contents,)


app.run()
下面是test_form.html文件:

{% extends 'base.html' %}

{% block body %}

<h2>{{ the_title }}</h2>

<form method='POST' action='update'>

    <table>
    <p>Use this form to edit the below text:</p>
        <tr>
            <td><input name='letters' type='TEXTAREA' value='{{ the_contents }}'></td>
        </tr>
        <tr>
            <td>{{ the_contents }}</td>
        </tr>
    </table>

<p>When you're ready, click this button:</p>
<p><input value='Do it!' type='SUBMIT'></p>
</form>

{% endblock %}     
{%extends'base.html%}
{%block body%}
{{{u title}}
使用此表单编辑以下文本:

{{内容}} 准备好后,单击此按钮:

{%endblock%}
最终的结果是,页面将很好地加载text.html中的数据,显示在它应该显示的两个位置。更改并提交表单时,数据将被覆盖(即删除),但不会被替换。我怀疑这与我在update函数中调用表单数据的方式有关,但我不知道。我几周前刚买的,没多少时间修补。不过,这个问题困扰了我一天多了


请帮忙

您的应用程序的问题似乎是
更新
路由允许get请求,因此,如果您在未提交表单的情况下访问该url
/update
,则内容将为空,文件将被重置。您应该从该方法列表中删除
GET
方法

这是我重新创建的应用程序的最低工作版本。它在表单提交时更新
text.html
,并使用会话向用户快速发送消息

从flask导入flask,呈现模板字符串,请求,重定向,url,flash
app=烧瓶(名称)
# https://flask.palletsprojects.com/en/1.0.x/patterns/flashing/#message-闪光模式
app.secret\u key='密钥更改此'
def read_contents():
尝试:
将open('text.html')作为f:
返回f.read()
除FileNotFoundError外:
返回“”
def保存内容(内容:str):
以open('text.html','w')作为f:
f、 写(内容)
@app.route('/',方法=['GET'])
def home():
html=“”
{get_flashed_messages()中m的%s%}
{{m}}

{%endfor%} {{contents}} 提交 {%if contents%} 目录 {{contents}} {%endif%} ''' 内容=读取内容() 返回呈现模板字符串(html,contents=contents) @app.route('/update',methods=['POST']) def update(): 内容=请求。表格['letters'] 保存内容(目录) 闪存(“更新完成”) 返回重定向(url_for('home')) 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': app.run()
运行应用程序后,您会看到如下页面:

提交某些内容后,它会将您重定向回主页,并显示一条消息和包含以下内容的页面:


尝试
文件。写入(内容)
而不是
打印(内容,文件=文件)
。不过,您的基本路线只允许“POST”请求。这是设计的吗?好吧,我做了一点态度调整,我退一步看看你的代码,它并不像我最初想的那么复杂。事实上,它完美地解决了将内容变量从一个函数传递到另一个函数的问题。我不知道我可以在变量的注释中嵌入html。真是天才!我是说,我想我应该知道,但我从来没有想过。无论如何,谢谢你。我想我会抛弃这本书,像学习html一样学习python:偷窥引擎盖下。try/except块对于处理错误非常有用。它们允许您在
try
中编写代码,就好像代码不会遇到任何问题一样,但是当它遇到问题时,
catch
会很好地处理挫折,并且仍然返回可用的结果。请慢慢来学习它们,它们是Python生态系统不可或缺的一部分。您当然可以在代码中嵌入简单的HTML片段,但当它变得冗长和复杂时,最好将其移动到自己的文件中,就像在您的代码中一样。谢谢,兄弟。我是个老混蛋,但我是个编程新手。告诉我,html变量中的文本是如何呈现的?为什么它作为html而不是<或gt放在文件中?如果。。。从技术上讲,变量没有数据,因为等号之后的所有内容都被注释掉了?当在render_模板中调用html变量时,为什么不将其作为空白变量处理?没有注释掉任何内容
html
被分配一个长字符串,由
''
三个引号分隔。所以,它不是空白的。当您在
render_template_string
函数中传递
html
时,Flask(实际上是Flask使用的Jinja2库)查看
{…}
{%…%}
块的字符串,以查看是否需要处理它(例如打印一个值或在循环中多次重复一段html)使用我们提供的变量
contents=contents
。您并不真正关心在源文件中转义HTML(将
转换为
),因为它不会像在浏览器中那样带来任何风险。