[06] [Flask 快速上手笔记] 05. 发送请求与文件上传

在 Flask 里面导入 request 套件包

from flask import request

通过前面提过的 method 属性可以操作当前的请求方法
藉由 form 属性处理POST或是PUT方法传来的表单资料

@app.route('/login', methods=['POST', 'GET'])
def login():
    error = None
    if request.method == 'POST':
        if valid_login(request.form['username'],
                       request.form['password']):
            return log_the_user_in(request.form['username'])
        else:
            error = 'Invalid username/password'
    # the code below is executed if the request method
    # was GET or the credentials were invalid
    return render_template('login.html', error=error)

如果传入的 form 属性中不存在指定的键值时会发生什麽事情呢?会引发 KeyError
如果没有捕捉这个 KeyError 错误,则会显示一个 HTTP 400 Bad Request 的错误页面

要操作 URL 中提交的参数,例如:?key=value。可以使用「args」属性

from flask import request

@app.route('/banana/')
def banana():
    return request.args.get('key', 'defult value')

因为使用者可能会透过改变网址而造成指定键值不存在

这时候建议通过捕捉 KeyError 或是利用判断式:

from flask import request

@app.route('/banana/')
def banana():
    searchword = request.args.get('key')
    if searchword:
        return searchword
    else:
        return 'nothing'

或是设定 request.args.get 方法预设值的方式来解决这个问题:

from flask import request

@app.route('/banana/')
def banana():
    searchword = request.args.get('key', 'hey Moona')
    return searchword

文件上传

只要在 HTML 表单中设定enctype="multipart/form-data"属性,浏览器就会传送档案了

上传的文件会被储存在记忆体或是档案系统中的临时位置,可以透过file属性来取得上传的档案
每个上传的文件会被存在这个 Dictionary 属性中,这个属性基本上和 Python 原生的file物件一样
只是额外多了一个save()方法,可以让你把上传的档案存到服务器的档案系统中

from flask import request

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        f = request.files['the_file']
        f.save('/var/www/uploads/uploaded_file.txt')
    ...

如果想取得档案在使用者端上传时候的档名,可以使用 filename 属性
但是这个值视可以被伪造的!,所以永远不要信任这个值

如果真的想要把使用者端的档名作为服务器上的档案名称
可以通过Werkzeug提供的 secure_filename() 函数

from werkzeug.utils import secure_filename

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        file = request.files['the_file']
        file.save(f"/var/www/uploads/{secure_filename(f.filename)}")
    ...

更多关於档案上传的说明可以参考:上传文件


<<:  Leetcode: 210. Course Schedule II | 含C++笔记

>>:  每日挑战,从Javascript面试题目了解一些你可能忽略的概念 - Day5

<Day3>当代的网路金融环境

在探讨如何将API应用在金融之前,我们势必要先来了解一下什麽是金融? 所谓的「金融」简单来说就是资本...

Windows 安装 PHP IMagick

根据很多网路上的教学,需要两个主要档案 php_imagick.xxx.zip ImageMagic...

Day.11 「利用渐变效果,让网页不再死板!」 —— CSS Transform & CSS Transition

现在我们会使用基本的伪类选择器做效果了,但看到变化过程一闪而过、冷冰冰的,想增添更多渐变效果,让动...

IT 铁人赛 k8s 入门30天 -- day18 Task Configure Default Memory Requests and Limits for a Namespace

前言 今天要完成的项目 k8s Task: Memory-default-namesapce 这个 ...

网路进阶篇

同样是网路,昨天是基础篇,今天进阶篇~ 其实,我自己网路没有很熟XD 而且我都是从攻击者角度去看,今...