我最近开始学习使用Flask框架。但是,我对如何调用函数&#39; sign_in_check&#39;来自main.py,当在html模板中单击一个按钮时。在Django中,它就像<form action = "{{% url 'sign_in_check' %}}>
一样简单。但是,如果我尝试使用Flask执行相同的操作,则会返回错误。我一直在谷歌搜索解决方案,没有运气。这是我的代码,我知道flask具有更好的内置登录功能,但是我仍然需要知道如何从模板调用函数,因为我有其他页面需要运行python函数。
main.py
from flask import Flask, render_template, request, current_app
from flask_socketio import SocketIO, send
app = Flask(__name__)
app.config['SECRET_KEY'] = 'mysecret'
socketio = SocketIO(app)
@app.route('/')
def sign_in():
return render_template('sign_in.html', sign_in_check_func = sign_in_check)
@app.route('/sign_in_check')
def sign_in_check():
print("In Sign In Check")
if request.method == "POST":
driver_first_name = request.POST.get('driver_first_name', '')
driver_last_name = request.POST.get('driver_last_name', '')
driver_WWID = request.POST.get('driver_WWID', '')
co_driver_first_name = request.POST.get('co_driver_first_name', '')
co_driver_first_name = request.POST.get('co_driver_last_name', '')
co_driver_WWID = request.POST.get('co_driver_WWID', '')
car_number = request.POST.get('car_number', '')
c = {'driver_first_name':driver_first_name, 'driver_last_name':driver_last_name,
'driver_WWID':driver_WWID, 'co_driver_first_name':co_driver_first_name,
'co_driver_last_name':co_driver_last_name, 'co_driver_WWID':co_driver_WWID,}
if driver_first_name != "" and driver_last_name != "" and driver_WWID != "" and co_driver_first_name != "" and co_driver_last_name != "" and co_driver_WWID != "":
return render_template('pre_drive_inspection.html')
return render_template('sign_in.html')
sign_in.html
<!DOCTYPE html>
{% extends "base.html" %}
{% block main_content %}
<html>
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='css/sign_in.css') }}">
<body>
<div id="driver_info">
<li>
<label for="driver_first_name">Driver First Name:</label>
<input type="text" name="driver_first_name" value="{{driver_first_name }}" id="driver_first_name">
</li>
<li>
<label for="driver_last_name">Driver Last Name:</label>
<input type="text" name="driver_last_name" value = "{{driver_last_name }}" id="driver_last_name">
</li>
<li>
<label for="driver_wwid">Driver WWID:</label>
<input type="text" name="driver_WWID" value="{{driver_WWID }}" id="driver_WWID" maxlength="8"
onkeypress="return (event.charCode == 8 || event.charCode == 0) ? null : event.charCode >= 48 && event.charCode <= 57">
</li>
</div>
<div id="co-driver_info" >
<li>
<label for="co_driver_first_name">CO-Driver First Name:</label>
<input type="text" name="co_driver_first_name" value="{{co_driver_first_name }}" id="co_driver_first_name">
</li>
<li>
<label for="co_driver_last_name">CO-Driver Last Name:</label>
<input type="text" name="co_driver_last_name" value="{{ co_driver_last_name }}" id="co_driver_last_name">
</li>
<li>
<label for="co_driver_wwid">CO-Driver WWID:</label>
<input type="text" name="co_driver_WWID" value="{{ co_driver_WWID }}" id="co_driver_WWID" maxlength="8"
onkeypress="return (event.charCode == 8 || event.charCode == 0) ? null : event.charCode >= 48 && event.charCode <= 57">
</li>
</div>
<div id="car_number">
<li>
<label for="car_number">Car Number:</label>
<input type="text" name="car_number" value="{{ car_number }}" id="co_driver_WWID" maxlength="4"
onkeypress="return (event.charCode == 8 || event.charCode == 0) ? null : event.charCode >= 48 && event.charCode <= 57"> </li>
</li>
</div>
<button action="{{% url_for('sign_in_check') %}}" method="post" value = "{{ csrf_token }}">
<div id="button">
<li>
<input type="submit" value="Continue">
</li>
</div>
</button>
</body>
</html>
{% endblock %}
答案 0 :(得分:0)
这是一个HTML问题。
按钮没有动作。按钮属于表单,表单有一个动作属性。
<form action="{{% url_for('sign_in_check') %}}" method="post">
<input type="hidden" value = "{{ csrf_token }}">
<div id="driver_info">
<li>
<label for="driver_first_name">Driver First Name:</label>
<input type="text" name="driver_first_name" value="{{driver_first_name }}" id="driver_first_name">
</li>
...
</div>
<div id="button">
<li>
<input type="submit" value="Continue">
</li>
</div>
</form>
请注意,您的HTML也有很多其他问题。例如,在 div之后,您不能拥有body
元素; div属于身体。 li
元素必须位于ul
元素(或ol
)内。
此外,您的父母&#34; base.html&#34;模板应该提供基本的页面结构,包括HTML声明,head
和body
元素;你的孩子模板应该只是填充身体内的空间。
答案 1 :(得分:0)
经过更多的谷歌搜索我发现了。如果有人好奇,我接受了丹尼尔的建议并重新构建了HTML。但是,这并没有完全解决它。行动sytanx是:
<form action='/sign_in_check' method="POST">
然后服务器像这样处理它:
@app.route('/sign_in_check', methods = ['GET', 'POST'])
def sign_in_check():
if request.method == 'POST':
我必须确保函数接受POST或GET。另外,与django不同,flask的请求语法有点不同。像这样,
driver_first_name = request.form.get('driver_first_name')
希望这可以帮助其他有类似问题的人。