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
相关文章
相关标签/搜索