# Flask實作_基礎_08_form action url_for ###### tags: `python` `flask` `form action url_for` 在[Flask實作_基礎_07_POST and GET](https://hackmd.io/s/SytJ0WTxG)範例中,我們在HTML語法中設置了`action='/login'`,這並不是一個很好的寫法,這會造成後續路由名稱變更之後的困擾,來看看如何利用之前所學調整。 ## 作業說明 當表單在`Submit`的時候,會依`action='url'`來傳遞資料到該路由,如果表單設置都是寫死路由的方式去設置的話,只要`app.route('你的路由')`調整,就會發生之前提到的每個文件都要去看有沒有使用這個路由的問題,建議作法,還是利用`url_for`來設置。 首先,新增一個HTML文件如下: * file name: login.html ```htmlmixed= <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Hello Page</title> </head> <body> <form method='post' action={{ url_for('login') }}> <p> <input type='text' name='username' /> </p> <p> <button type='submit'>Submit</button> </p> </form> </body> </html> ``` 第8行:`action`的部份以`url_for('function name')`設置,`function name`為該路由所裝飾器函數名稱 接著調整Python文件: ```python= from flask import Flask, request, render_template app = Flask(__name__) @app.route('/login', methods=['GET', 'POST']) def login(): # 利用request取得使用者端傳來的方法為何 if request.method == 'POST': # 利用request取得表單欄位值 return 'Hello ' + request.values['username'] # 非POST的時候就會回傳一個空白的模板 return render_template('login.html') if __name__ == '__main__': app.debug = True app.run() ``` 執行專案,然後查看網頁原始碼,可以發現`action`成功被解析到相對應的路由,如下圖:  現在,我們嚐試著修正`@app.route`的路由名稱設置 ```python= @app.route('/loginurl', methods=['GET', 'POST']) ``` 第1行:將路由名稱由`login`變更為`loginurl` 重新執行專案,查詢網頁原始碼,如下圖:  可以發現到,路由名稱的解析依然成功指向`loginurl` ## 總結 這次我們用一個實際案例瞭解到`url_for`的實用性,可以成功的映射到相對應的路由名稱當然有它的背後原理,但這部份後續的實作中會有對`endpoint`的說明,暫時我們理解到這樣就可以,下一步我們要來認識另一個實用性很高的`redirect`。 **上一話:**[Flask實作_基礎_07_POST and GET](https://hackmd.io/s/SytJ0WTxG) **下一話:**[Flask實作_基礎_09_redirect after some action](https://hackmd.io/s/rkpy9CGZz)
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.