Фреймворк Flask от входа до освоения Request (6)

Flask

Очки знаний: 1. HTTP-запрос 2. Часто используемые методы запроса 3. Загрузить изображения

1. Обзор

Все мы знаем, что когда браузер обращается к адресу, протокол Http передает объект запроса в фоновом режиме. Этот объект запроса содержит заголовок запроса, параметры запроса и метод запроса.Конечно, запрос может быть получен в фоновом режиме. Затем выполните логическую обработку.

在这里插入图片描述
В flask объект запроса является глобальным и может использоваться где угодно.

2. ПОЛУЧИТЬ запрос

Мы пишем интерфейс, который принимает личную информацию, которая является функцией просмотра. Мы создаем новыйregister.htmlшаблон, напишите в шаблоне следующую форму:

  • действие: указывает адрес для отправки
  • метод: метод запроса
<!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>

Фону в это время нужно написать два представления, одно представление используется для отображения страницы регистрации, а одно представление используется для обработки параметров, переданных из внешнего интерфейса:

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. Почтовый запрос

И вход в систему, и регистрация будут использовать почтовые запросы, и никто не хочет, чтобы часть их конфиденциальной информации отображалась в адресе браузера. Тогда мы просто изменили запрос на публикацию только сейчас, и интерфейсу нужно только изменить метод в форме:

method="post"

Есть два места, которые нужно изменить в фоне:

  • Метод запроса: по умолчанию используется запрос на получение
  • Аргументы заранее: измените аргументы на форму
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, мы можем полностью синтезировать функцию просмотра в одну:

  • Внешний интерфейс: Форма формы может быть написана без действия, а это значит, что ее нужно отправить на текущий адрес.
<!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. Загрузить файлы

Мы также часто используем функцию загрузки файлов: интерфейс загружает файл, а затем сервер обрабатывает и сохраняет его на сервере. Этот тип файла является мультимедийным ресурсом. Необходимо добавить фронтальную форму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
И вы также можете видеть, что изображения, загруженные в интерфейс, были сохранены в нашей папке мультимедиа. Добро пожаловать, чтобы обратить внимание на мой общедоступный номер:

image