所以我正在做一个项目来让我自己学习烧瓶。我编写了一个密码生成器,它根据用户的输入生成密码。我编写了一个函数,如何将用户输入发送到生成器,然后收集如何以 json 格式发送的响应。因此,当我单击“生成密码”按钮时,它应该打印出密码。为了查看密码是否生成并发送,我放置了一个 console.log(data.password) ,以便它在控制台中打印出来。
因此您可以看到密码已生成,但不知何故我无法将其打印在我的网页上。有人可以帮助我并告诉我问题是什么吗?
应用程序.py
from flask import Flask, render_template, request, send_from_directory, jsonify
import random
import string
from tkinter import filedialog
from tkinter import messagebox
app = Flask(__name__)
password_label = None
def generate_password(length, characters):
password = ''.join(random.choices(characters, k=length))
return password
@app.route('/')
def index():
return render_template('index.html')
@app.route('/generate', methods=['POST'])
def generate():
try:
length = int(request.form.get('length'))
characters = request.form.get('characters')
if characters == 'letters':
characters = string.ascii_letters
elif characters == 'letters_digits':
characters = string.ascii_letters + string.digits
elif characters == 'all':
characters = string.ascii_letters + string.digits + string.punctuation
password = generate_password(length, characters)
return jsonify(password=password)
except Exception as e:
return jsonify(error=str(e))
if __name__ == '__main__':
app.run(debug=True)
这是我的“index.html”:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Password Generator</title>
</head>
<body>
<h1>Password Generator</h1>
<form action="/generate" method="POST" id="password-form">
<label for="length">Password Length:</label>
<input type="number" id="length" name="length" required><br><br>
<label for="characters">Character Set:</label>
<select id="characters" name="characters">
<option value="letters">Letters</option>
<option value="letters_digits">Letters and Digits</option>
<option value="all">All Characters</option>
</select><br><br>
<input type="button" value="Generate Password" onclick="generatePassword()">
</form>
<br>
<br>
<div>
{% if password %}
<h2>Your generated password:</h2>
<p id="generated-password" type="text" value="..."> {{ password }}</p>
{% endif %}
</div>
<script>
function generatePassword() {
const length = document.getElementById('length').value;
const characters = document.getElementById('characters').value;
const form = document.getElementById('password-form');
const formData = new FormData(form);
formData.append('length', length);
formData.append('characters', characters);
fetch('/generate', {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => {
console.log(data.password); // Debugging
document.getElementById('generated-password').innerText = data.password;
})
.catch(error => {
console.error('Error:', error);
});
}
</script>
</body>
</html>
我的目标是打印出网页上的密码。
我不认为你正在将
password
传递给你的 jinja 模板
{% if password %}
<h2>Your generated password:</h2>
<p id="generated-password" type="text" value="..."> {{ password }}</p>
{% endif %}
你应该像这样在这个 if 块中添加一个 else 块
{% if password %}
<h2>Your generated password:</h2>
<p id="generated-password" type="text" value="..."> {{ password }}</p>
{% else %}
<!--create the fields empty if no password was generated-->
<h2>Your generated password:</h2>
<p id="generated-password" type="text" value="..."></p>
{% endif %}
或通过您的 render_template 函数传递生成的密码的值,如下所示
return render_template('index.html',password=generate_password(8,string.ascii_letters + string.digits + string.punctuation))
第二个解决方案生成默认值,尽管考虑到您希望用户首先填写表单,我想向您指出第一个方法