Flask基礎之返回值與form表單提交

[TOC]html

1.Python 現階段三大主流Web框架 Django Tornado Flask 對比

Django 主要特色是大而全,集成了不少組件,例如: Models Admin Form 等等, 無論你用獲得用不到,反正它全都有,屬於全能型框架python

  • Django 一般用於大型Web應用因爲內置組件足夠強大因此使用Django開發能夠一鼓作氣web

  • Django 優勢是大而全,缺點也就暴露出來了,這麼多的資源一次性所有加載,確定會形成一部分的資源浪費json

2.Tornado 主要特色是原生異步非阻塞,在IO密集型應用和多任務處理上佔據絕對性的優點,屬於專一型框架flask

  • Tornado 一般用於API後端應用,遊戲服務後臺,其內部實現的異步非阻塞真是穩得一批
  • Tornado 優勢是異步,缺點是乾淨,連個Session都不支持

3.Flask 主要特色小而輕,原生組件幾乎爲0, 三方提供的組件請參考Django 很是全面,屬於短小精悍型框架後端

  • Flask 一般應用於小型應用和快速構建應用,其強大的三方庫,足以支撐一個大型的Web應用

2.Flask的安裝

pip install Flask

3.Flask的第一個簡單應用

實現一個簡單的web程序:session

from flask import Flask  #導入Flask類

# __name__指定當前文件名flask1.py
app = Flask(__name__)  #實例化一個Flask對象


# 指定路由,app中的route裝飾器
@app.route("/")
def home():  #視圖函數
    return "hello world!"   #至關於HttpResponse返回數據


if __name__ == '__main__':
    # 定義訪問ip與port
    app.run("0.0.0.0", 5050)

web頁面展現:app

  img

4.Flask中的render_template

Flask中render_template至關於Django中render函數,返回一個模板,但Flask不須要指定request參數框架

from flask import Flask, render_template  #導入Flask類

# __name__指定當前文件名 flask1
app = Flask(__name__)  #實例化一個Flask對象


# 指定路由,app中的route裝飾器
@app.route("/home")
def home():
    return render_template("home.html")


if __name__ == '__main__':
    # 定義訪問ip與port
    app.run("0.0.0.0", 5050)

home.html文件:異步

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<h1>success!</h1>

</body>
</html>

注意: 若是要使用 render_template 返回渲染的模板,請在項目的主目錄中加入一個目錄 templates

  img

5.Flask中的redirect重定向

Flask中redirect重定向同Django中的redirect函數,具體方法以下:

from flask import Flask,redirect #導入Flask類

# __name__指定當前文件名flask1.py
app = Flask(__name__)  #實例化一個Flask對象


# 指定路由,app中的route裝飾器    endpoint 給路由分配別名 若是不寫默認是當前函數名(不可重複)
@app.route("/reback",endpoint="reback")
def reback():
    # 重定向指定路經前須要加「/」
    return redirect("/index")

if __name__ == '__main__':
    # 定義訪問ip與port
    app.run("0.0.0.0", 5050)

6.Flask中的formdata表單提交

每一個框架中都有處理請求的機制(request),可是每一個框架的處理方式和機制是不一樣的

首先要從 flask 包中導入 request 模塊,Flask中request模塊是一個全局變量

methods=["POST", "GET"] 表明這個url地址容許 POST與GET 請求兩種方式,是個列表也就是意味着能夠容許多重請求方式,這裏表單提交須要經過GET顯示HTML頁面,再經過POST提交數據

from flask import Flask, render_template, request
import os

app = Flask(__name__)
app.debug = True

@app.route("/login", methods=["POST", "GET"])
def login():
    if request.method == "GET":
        # 獲取URL中的參數,例如傳入參數:http://127.0.0.1:5000/login?id=1
        print(request.args.get("id"))
        # 獲取URL中的參數 轉換成 字典
        print(request.args.to_dict())
        # 獲取請求原始信息
        print(request.environ)
        # 路由地址 /login
        print(request.path)
        # 獲取訪問路徑
        print(request.url)  # http://127.0.0.1:5000/login?id=1
        # 獲取URL頭,不包含參數 /login
        print(request.base_url)  # http://127.0.0.1:5000/login

        return render_template("login.html")

    if request.method == "POST":
        # 請求頭中的數據
        print(request.headers)

        print(request.json)  # 請求頭中 Content-type:application/json 數據序列化 request.json
        print(request.data)  # 請求頭中 Content-type 不包含 Form or data

        # Formdata 和 Args查詢參數 中的數據
        print(request.values)

        username = request.form.get("user")
        password = request.form.get("pwd")
        print(username, password)

        return "200 OK"


if __name__ == '__main__':
    app.run()

  HTML的form表單:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form action="" method="post" enctype="multipart/form-data">
    用戶名:<input type="text" name="user">
    密碼:<input type="password" name="pwd">
    <input type="submit" value="提交">
</form>

<script></script>
</body>
</html>

Form表單中傳遞過來的值 使用 request.form 中拿到:

注意:這裏把ImmutableMultiDict 字典轉換成普通字典須要to_dict方法,不然會報錯

print(request.form)  # ImmutableMultiDict([('user', '123'), ('pwd', '456')])
# ImmutableMultiDict 它是一個特殊字典
print(request.form["user"])  # 123
print(request.form.get("pwd"))  # 456

print(list(request.form.keys()))  # ['user', 'pwd']
#這裏能夠把上面的特殊字典轉化成普通字典形式,注意這裏Flask中字典轉換方法是to_dict
req_dict = request.form.to_dict()
print(req_dict)  # {'user': '123', 'pwd': '456'}

這是讓咱們在使用form表單提交的同時使用url參數提交:

print(request.values)  # CombinedMultiDict([ImmutableMultiDict([('id', '1'), ('age', '20')]), ImmutableMultiDict([('user', '123'), ('pwd', '456')])])
print(request.values.get("id"))  # 1
print(request.values["user"])  # 123
# 這回喜歡直接操做字典的小夥伴們有驚喜了! to_dict() 方法能夠直接將咱們的參數所有轉爲字典形式
print(request.values.to_dict()) # {'user': '123', 'pwd': '456', 'id': '1', 'age': '20'}

注意啦!注意啦!

# 注意這裏的坑來啦! 坑來啦!
# 若是url和form中的Key重名的話,form表單數據會先提交,則form中的同名的key中value會被url中的value覆蓋
# http://127.0.0.1:5000/req?id=1&user=20
print(request.values.to_dict())  # {'user': 20 'pwd': '456', 'id': '1'}

request.args 與 request.form 的區別就是:

  • request.args 是獲取url中的參數
  • request.form 是獲取form表單中的參數

7.Flask中的formdata表單的文件傳輸

from flask import Flask, render_template, request
import os

app = Flask(__name__)
app.debug = True

@app.route("/login", methods=["POST", "GET"])
def login():
    if request.method == "GET":
        return render_template("login.html")

    if request.method == "POST":
        username = request.form.get("username")
        password = request.form.get("pwd")
        print(username, password)

        # 獲取文件對象
        my_file = request.files.get("my_file")

        print(my_file)
        # 指定文件保存路徑
        # filepath = os.path.join("templates", my_file.filename)
        # my_file.save(filepath)

        # 保存文件,file_name獲取文件名
        my_file.save(my_file.filename)
        return "200 OK"


if __name__ == '__main__':
    app.run()

login.html文件:

form表單提交文件時,必須指定文件類型:enctype="multipart/form-data"

...
<form action="" method="post" enctype="multipart/form-data">    用戶名:<input type="text" name="username">    密碼:<input type="password" name="pwd">    <input type="file" name="my_file">    <input type="submit" value="提交"></form>
...

8.Flask的常見錯誤

8.1當你點擊提交出現這樣的錯

  img

解決方案:

@app.route("/login",methods=["GET","POST"])

8.2設置session的時候

  img

解決方法:設置祕鑰

app.secret_key = "sdsfdsgdfgdfgfh"

附加:

  img

相關文章
相關標籤/搜索