Flask框架從入門到精通之Request(六)

知識點: 一、HttpRequest 二、經常使用請求方式 三、上傳圖片html

1、概況

咱們都知道當瀏覽器去訪問一個地址時,Http協議會像後臺傳遞一個request對象。這個request對象包含了請求頭、請求參數、以及請求方式,固然後臺能夠取到request。而後進行邏輯處理。 前端

在這裏插入圖片描述
在flask中,request對象是一個全局的,在任何地方均可以使用。

2、GET請求

咱們寫一個接受我的信息的接口,也就是視圖函數。咱們新建一個名爲register.html的模板,在模板裏寫以下表單:python

  • action:表示要提交到的地址
  • method:請求方式
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form action="/center/add" method="get">
    用戶名:<input type="text" name="name"><br>
    年齡:<input type="text" name="age"><br>
    愛好:吃<input type="checkbox" name="hobby" value="吃"><input type="checkbox" name="hobby" value="喝"><input type="checkbox" name="hobby" value="玩"><input type="checkbox" name="hobby" value="樂"><br>

    <input type="submit" value="提交">

</form>

</body>
</html>
複製代碼

後臺這個時候須要寫兩個視圖,一個視圖用於顯示註冊頁面,一個視圖用於處理前端傳過來的參數:flask

from flask import Flask, request, render_template

app = Flask(__name__)


@app.route('/') # 表明首頁
def index():  # 視圖函數
    return render_template('register.html')


@app.route('/center/add') # 表明我的中心頁
def center():  # 視圖函數
    if request.method == 'GET':  # 請求方式是get
        name = request.args.get('name')  # args取get方式參數
        age = request.args.get('age')
        hobby = request.args.getlist('hobby')  # getlist取一鍵多值類型的參數
        return "姓名:%s 年齡:%s 愛好:%s" % (name, age, hobby)


app.config['DEBUG'] = True

if __name__ == '__main__':
    # 0.0.0.0表明任何能表明這臺機器的地址均可以訪問
    app.run(host='0.0.0.0', port=5000)  # 運行程序

複製代碼

咱們在瀏覽器訪問一下: 後端

在這裏插入圖片描述
當咱們點擊提交後:
在這裏插入圖片描述
能夠看到咱們後後已經接到前端參數,並展現到瀏覽器上了。

3、POST請求

登陸和註冊都會使用Post請求,誰也不但願本身的一些敏感信息在瀏覽器的地址上顯示。那咱們把剛纔的列子剛改Post請求,齊前端只須要把表單裏面的method改下就行:瀏覽器

method="post"
複製代碼

後臺須要改的地方有兩個地方:安全

  • 請求方法:默認是get請求
  • 參數提早:把args改爲form
from flask import Flask, request, render_template

app = Flask(__name__)


@app.route('/') # 表明首頁
def index():  # 視圖函數
    return render_template('register.html')


@app.route('/center/add', methods=['GET', 'POST']) # 支持get、post請求
def center():  # 視圖函數
    if request.method == 'GET':  # 請求方式是get
        name = request.args.get('name')  # args取get方式參數
        age = request.args.get('age')
        hobby = request.args.getlist('hobby')  # getlist取一鍵多值類型的參數
        return "姓名:%s 年齡:%s 愛好:%s" % (name, age, hobby)
    elif request.method == 'POST':
        name = request.form.get('name')  # form取post方式參數
        age = request.form.get('age')
        hobby = request.form.getlist('hobby')  # getlist取一鍵多值類型的參數
        return "姓名:%s 年齡:%s 愛好:%s" % (name, age, hobby)


app.config['DEBUG'] = True

if __name__ == '__main__':
    # 0.0.0.0表明任何能表明這臺機器的地址均可以訪問
    app.run(host='0.0.0.0', port=5000)  # 運行程序

複製代碼

當咱們點擊提交後: 服務器

在這裏插入圖片描述
能夠看到咱們後臺已經接到前端參數,並展現到瀏覽器上了。而且咱們傳遞的參數不在瀏覽器地址上拼接了,這樣作的好處能夠隱藏參數。

若是是Pos方式t咱們徹底能夠把視圖函數合成一個:app

  • 前端:form表單能夠不寫action,表明要提交當前地址上
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form method="post">
    用戶名:<input type="text" name="name"><br>
    年齡:<input type="text" name="age"><br>
    愛好:吃<input type="checkbox" name="hobby" value="吃"><input type="checkbox" name="hobby" value="喝"><input type="checkbox" name="hobby" value="玩"><input type="checkbox" name="hobby" value="樂"><br>

    <input type="submit" value="提交">

</form>

</body>
</html>
複製代碼
  • 後端:根據請求方式處理不一樣操做
from flask import Flask, request, render_template

app = Flask(__name__)


@app.route('/register', methods=['GET', 'POST']) # 支持get、post請求
def register():  # 視圖函數
    if request.method == 'GET':  # 請求方式是get
        return render_template('register.html')  # 返回模板
    elif request.method == 'POST':
        name = request.form.get('name')  # form取post方式參數
        age = request.form.get('age')
        hobby = request.form.getlist('hobby')  # getlist取一鍵多值類型的參數
        return "姓名:%s 年齡:%s 愛好:%s" % (name, age, hobby)


app.config['DEBUG'] = True

if __name__ == '__main__':
    # 0.0.0.0表明任何能表明這臺機器的地址均可以訪問
    app.run(host='0.0.0.0', port=5000)  # 運行程序

複製代碼

咱們訪問瀏覽器地址爲:http://0.0.0.0:5000/register函數

4、上傳文件

上傳文件也是咱們常常用到的功能,前端上傳一張文件,而後後端處理保存到服務器上。 文件這種類型屬於多媒體類型資源。前端form表單裏面須要加enctype="multipart/form-data"。咱們新建一個名upload.html模板 模板裏面寫以下代碼:

<!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="file" name="file">
    <input type="submit" value="上">
</form>

</body>
</html>
複製代碼

咱們從新新建一個upload.py文件,並在此文件的目錄建立一個名media的文件夾,用來放咱們上傳的圖片:

在這裏插入圖片描述
upload.py文件裏面代碼以下:

from flask import Flask, request, render_template, redirect, url_for
from werkzeug.utils import secure_filename
import os
from flask import send_from_directory

app = Flask(__name__)

UPLOAD_FOLDER = 'media'
ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'])
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER


# 判斷上傳的文件是不是容許的後綴
def allowed_file(filename):
    return "." in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS


@app.route("/upload", methods=['GET', 'POST'])
def upload():
    if request.method == 'GET':  # 請求方式是get
        return render_template('upload.html')  # 返回模板
    else:
        if "file" not in request.files:
            return redirect(request.url)

        file = request.files.get('file')  # 獲取文件

        if file.filename == '':
            return redirect(request.url)

        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)  # 用這個函數肯定文件名稱是不是安全 (注意:中文不能識別)
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))  # 保存文件
            return redirect(url_for('show',
                                    filename=filename))


# 展現圖片
@app.route('/show/<filename>')
def show(filename):
    # send_from_directory能夠從目錄加載文件
    return send_from_directory(app.config['UPLOAD_FOLDER'],
                               filename)


if __name__ == '__main__':
    # 0.0.0.0表明任何能表明這臺機器的地址均可以訪問
    app.run(host='0.0.0.0', port=5000, debug=True)  # 運行程序


複製代碼

咱們在瀏覽器訪問一下:

在這裏插入圖片描述

選擇一張電腦上的圖片,而後點擊上傳:

image
而且也能夠看到前端上傳的圖片已經保存到咱們的media文件夾下。 歡迎關注個人公衆號:

image
相關文章
相關標籤/搜索