2017-03-08 64 views
-1

我最近開始學習使用Flask框架。然而,當我在html模板中點擊一個按鈕時,我對如何從main.py調用函數'sign_in_check'感到困惑。在Django中,它就像<form action = "{{% url 'sign_in_check' %}}>一樣簡單。但是,如果我嘗試使用Flask做同樣的事情,它會返回一個錯誤。我一直在用Google搜索解決方案,但沒有運氣。這裏是我的代碼,我知道flask最好是內置登錄功能,但是我仍然需要知道如何從模板中調用函數,因爲我有其他需要python函數運行的頁面。如何使用Jinja2 html模板在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

經過更多的Google搜索後,我發現了它。如果有人很好奇,我就採用了丹尼爾的建議並重新構建了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') 

希望這可以幫助其他任何有類似問題的人。

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)。此外,您的父級「base.html」模板應該提供包括HTML聲明在內的基本頁面結構,以及元素的headbody;你的孩子模板應該只填寫身體內的空間。

相關問題