一、处理请求

  1、URL路径参数(动态路由)

# 例如,有一个请求访问的接口地址为/users/123,其中123实际上为具体的请求参数,表明请求123号用户的信息。此时如何从url中提取出123的数据?

@app.route("/user/<user_id>")
def user_info(user_id):
print(user_id)
return "hello user {}".format(user_id) # 上面<>是一个转换器,默认为字符串类型,即将该位置的数据以字符串格式进行匹配、并以字符串为数据类型、user_id 为参数名传视图。

  2、Flask提供的其他的转换器

DEFAULT_CONVERTERS = {
'default': UnicodeConverter,
'string': UnicodeConverter,
'any': AnyConverter,
'path': PathConverter,
'int': IntegerConverter,
'float': FloatConverter,
'uuid': UUIDConverter,
}

  将上面的例子以整形匹配数据,可以如下使用:

@app.route('/user/<int:user_id>')
def user_info(user_id):
print(type(user_id))
return "hello world {}".format(user_id)

  3、自定义转换器

    问题:如果遇到需要匹配提取 /sms_codes/13886555555 中的手机号数据,Flask内置的转换器将无法满足,此时需要自定义转换器。

    定义方法(分为三步)

# 第一步、创建转换器类,保存匹配的正则表达式
from werkzeug.routing import BaseConverter class MobileConverter(BaseConverter):
"""
手机号码格式
"""
regex = r"1[3-9]\d{9}"  # 注意 regex 名字是固定的 # 第二步、将自定义的转换器告知Flask应用
app = Flask(__name__) # 将自定义转换器添加到转换器字典中,并指定转换器使用时名字为:mobile
app.url_map.converters["mobile"] = MobileConverter # 第三步、在使用转换器的地方定义使用
@app.route('/sms_codes/<mobile:mob_num>')
def send_sms_code(mob_num):
return "send sms code to {}".format(mob_num)

  4、其他参数

  如果想要获取其他地方传递的参数,可以通过Flask提供的 request 对象来读取。

  不同位置的参数都存放在request的不同属性中  

属性 说明 类型
data 记录请求的数据,并转换为字符串 *
form 记录请求中的表单数据 MultiDict
args 记录请求中的查询参数 MultiDict
cookies 记录请求中的cookie信息 Dict
headers 记录请求中的报文头 EnvironHeaders
method 记录请求使用的HTTP方法 GET/POST
url 记录请求的URL地址 string
files 记录请求上传的文件 *

  5、例如 想要获取请求 /articles??channel_id=1 中 channel_id 的参数,可以按如下方式使用:

from flask import request

@app.route('/reticles')
def get_reticles():
channel_id = request.args.get("channel_id")
return 'you wanna get articles of channel {}'.format(channel_id)

  6、上传图片

  客户端上传图片到服务器,并保存到服务器中

from flask import request

@app.route('/upload', methods=['POST'])
def upload_file():
f = request.files["pic"] # 图片的键是 pic
# with open("./demo.png", "wb") as new_file:
# new_file.write(f.read())
f.save(./demo.png)
return "ok"

二、处理响应

  需求:如何在不同的场景里返回不同的响应信息?

  1、返回模板

    使用 render_template 方法渲染模板并返回,例如下,新建一个模板 index.html  

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
我的模板html内容
<br/>{{ my_str }}
<br/>{{ my_int }}
</body>
</html>

    后端视图

from flask import render_template

@app.route("/")
def index():
mstr = "Hello World"
mint = 10
render render_template("index.html", my_str=mstr, my_int=mint) # 如果是一个字典,也可以这样
@app.route("/")
def index():
my_info = {
"mstr":"Hello World"
"mint":10}
render render_template("index.html", **my_info)

  2、重定向

# 将一个路由重定向到百度首页
from flask import redirect @app.route("/demo2")
def demo2():
return redirect("http://www.baidu.com")

  3、返回json

from flask import jsonify

@app.route("/demo3")
def demo3():
json_dict = {
"user_id": 10,
"user_name": "huofei"
}
return jsonify(json_dict)

  4、自定义状态码和响应头

    ①元祖方式

    可以返回一个元组,这样的元组必须是(request, status, headers)的形式,且至少包含一个元素。status 值会覆盖状态代码,headers可以是一个列表 或字典,作为额外的消息头值,实现代码如下:

@app.route("/demo4")
def demo4():
# return '状态为 666', 666
# return "状态码为 666", 666, [("name", "huofei")]
return "状态吗为 666", 666, {"name": "huofei"}

    ②make_response方式

@app.route("/demo5")
def demo5():
resp = make_response("make response测试")
resp.headers["name"] = "huofei"
resp.status = "404 not found"
return resp

三、Cookie

  如何设置?如下代码:

from flask import Flask, make_response

app = Flask(__name__)

@app.route("/cookie")
def set_cookie():
resp = make_response("set cookie ok")
resp.set_cookie("username", "huofei")
return resp

  设置有效期

@app.route("/cookie")
def set_cookie():
response = make_response('hello world')
# 设置有效期为3600秒
response.set_cookie("username", "huofei", max_age=3600)
return response

  读取

from flask import request

@app.route("/get_cookie")
def get_cookie():
resp = request.cookie.get("username")
return resp

  删除

# 删除的原理是将cookie的有效期修改为1970年了
from flask import request @app.route("/delete_cookie")
def delete_cookie():
response = make_response("hello world")
response.delete_cookie("username")
return response

四、Session

  1、需要先设置SECRET_KEY,如下

class DefaultConfig(object):
SECRET_KEY = "fq3rfdsqdsaDFAdDAF" app.config.from_object(DefaultConfig) # 或者直接设置
app.secret_key = "abc1dsfq23321adaaf"

  2、设置

from flask import session

@app.route("/set_session")
def set_session():
session["username"] = "huofei"
return "set session Ok"

  3、读取

@app.route("/get_session")
def get_session():
username = session.get("username")
return "get session username {}".format(username)

flask-基础篇02 请求与响应的更多相关文章

  1. 第一篇 Flask基础篇之(配置文件,路由系统,模板,请求响应,session&cookie)

    Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...

  2. Java多线程系列--“基础篇”02之 常用的实现多线程的两种方式

    概要 本章,我们学习“常用的实现多线程的2种方式”:Thread 和 Runnable.之所以说是常用的,是因为通过还可以通过java.util.concurrent包中的线程池来实现多线程.关于线程 ...

  3. WebBug靶场基础篇 — 02

    本篇以第一人称记录这个关卡的第 1-5 关. 由于我记录的过程有点偏向于思考,所以截图截的多 = =!所以文章有点长... 下午一觉醒来,已经 4 点多了,然后开电脑,在虚拟机里,铺了铺靶场,但是毕竟 ...

  4. 【matlab 基础篇 02】基础知识一键扫盲,看完即可无障碍编程(超详细+图文并茂)

    博主快速入门matlab,系统地整理一遍,如何你和我一样是一个新手,那么此文很适合你: 本人能力有限,文中难免有错误和纰漏之处,请大佬们不吝赐教 创作不易,如果本文帮到了您: 请帮忙点个赞

  5. 第二篇 Flask基础篇之(闪现,蓝图,请求扩展,中间件)

    本篇主要内容: 闪现 请求扩展 中间件 蓝图 写装饰器,常用 functools模块,帮助设置函数的元信息 import functools def wrapper(func): @functools ...

  6. iOS系列 基础篇 02 StoryBoard 故事板文件

    iOS基础 02 StoryBoard 故事板文件 目录: 1. 故事板的导航特点 2. 故事板中的Scene和Segue 3. 本文最后 在上篇HelloWorld工程中有一个Main.storyb ...

  7. JavaWeb基础-Jsp的请求与响应

    JSP请求和相应 HTTP头信息 当浏览器请求一个网页时,它会向网络服务器发送一系列不能被直接读取的信息,因为这些信息是作为HTTP信息头的一部分来传送的. HttpServletRequest类 r ...

  8. python框架之Flask基础篇(一)

    一.第一个hello world程序 # coding=utf-8 from flask import Flask app = Flask(__name__) @app.route('/') def ...

  9. MySQL基础篇(02):从五个维度出发,审视表结构设计

    本文源码:GitHub·点这里 || GitEE·点这里 一.数据场景 1.表结构简介 任何工具类的东西都是为了解决某个场景下的问题,比如Redis缓存系统热点数据,ClickHouse解决海量数据的 ...

  10. Java岗 面试考点精讲(基础篇02期)

    1. 两个对象的hashCode相同,则equals也一定为true,对吗? 不对,答案见下面的代码: @Override public int hashCode() { return 1; } 两个 ...

随机推荐

  1. Win10在线升级Win11

    下载微软官方在线升级工具,直接一键在线升级 https://www.microsoft.com/zh-cn/software-download/windows11/ 右键菜单一键恢复win10风格,管 ...

  2. 安装kvm后,在windows主机启动virt-manger后报错(no polkit agent available to authenticate action org.libvirt.unix.manage)

    解决方法如下: 1. 增加libvirtd用户组 groupadd  libvirtd 2.在你使用的普通用户界面执行 sudo usermod -a -G libvirtd $USER 3.设置启动 ...

  3. windows下搭建nrf52832nordic_ble_sniffer_3.0+wireshark抓包环境

    准备工具 pythone3.7安装包 https://www.python.org/ftp/python/3.7.7/python-3.7.7-amd64.exe Wireshark-win64-3. ...

  4. OS-lab5

    OS-lab5 磁盘管理 完成文件系统的第一步就是要能够处理磁盘等外设的信息. lib/syscall_all.c 处理磁盘的信息,最基本的就是对磁盘进行读写操作. sys_write_dev函数用于 ...

  5. Hadoop批处理方案 和 MPP架构方案 作为数据仓库的区别

    1,原理对比 MPP方案中的数据通常在节点之间拆分(分片),每个节点仅处理其本地数据.而且,每家都有专门为 MPP 解决方案开发的复杂而成熟的 SQL 优化器.它们都可以在内置语言和围绕这些解决方案的 ...

  6. 在C#中Release与Debug的区别小案例

    我们都听说过C#写的代码 Release通常会比Debug性能要好一点跑得快一些. 先普及一些相关基础知识: (1)在CLR中将对sbyte.byte.short.ushort.int.uint.ch ...

  7. vue获取标签对象的方式

    我知道2种方式: 1.在标签内 使用 ref 属性定义对象名,使用this.$refs.[name] 调用 2.在标签内 使用 函数传递事件对象, 定义, <div @click="h ...

  8. JSR 133

      JSR 133是Java语言规范的一个JSR(Java Specification Request),全称为Java Memory Model and Thread Specification R ...

  9. Android学习——控件Notification

    1.创建Notification和NotificationManager 2.NotificationChannel 3.常用方法说明

  10. wpf DataGrid cell 背景色修改参考

    <DataTemplate.Triggers> <DataTrigger Binding="{Binding Path=IsSelected, RelativeSource ...