flask入门到起飞(二) Request和Response

如何处理requset,主动终止视图函数并且自己捕获异常

服务器在接收到客户端请求后,会自动创建Request对象,由Flask自动创建,Request对象不可修改。与diango不一样,django中的request对象是在每个视图函数中的,然而flask中的request是全局变量,那它怎样做到隔离的呢?

常用接口

- request.method   请求方式

- request.path    路由中的路径

- request.args   get请求参数
    get请求参数的包装,args是一个ImmutableMultiDict对象,类字典结构对象
    数据存储也是key-value
    外层是大列表,列表中的元素是元组,元组中左边是key,右边是value

- request.form   post请求参数  
    存储结构个args一致
    默认是接收post参数
    还可以接收PUT,PATCH参数

- request.url    完整请求地址
    
- request.base_url    去掉GET参数的URL
    
- request.remote_addr    请求的客户端地址
    
- request.file    上传的文件
    
- request.headers    请求头
    
- request.cookie    请求中的cookie

- request.get_json 如果前端传的json,可以调此接口,自动把前端传的json转化为字典
 #使用要求前端传递的content-type:application/json
    
ImmutableMultiDict类型
    ImmutableMultiDict类似字典的数据结构
    与字典的区别,可以存在相同的键
    args、form、files都是ImmutableMultiDict的对象
‘
ImmutableMultiDict数据获取方式
    dict['uname']       
    dict.get('uname')   # 推荐(在没有数据为空)
    dict.getlist('uname')   # 获取指定key对应的所有值

Request使用实例

# coding:utf-8
from flask import Flask, request
app = Flask(__name__)

# 接口  api
# 127.0.0.1:5000/index?city=chongqing&country=china  
@app.route("/index", methods=["GET", "POST"])
def index():
    # request中包含了前端发送过来的所有请求数据
    # form和data是用来提取请求体数据
    #当前端通过存表单提交的时候content-type:urlencode的时候,所有数据已经被flask封装到了form里面。
    #如果时候form-data多类型数据,可以通过request.data获取
    # 通过requset.form可以直接提取请求体中的表单格式的数据, 是一个类字典的对象
    # 通过get方法只能拿到多个同名参数的第一个
    name = request.form.get("name")
    age = request.form.get("age")
    name_li = request.form.getlist("name")

    # 如果是请求体的数据不是表单格式的(如json格式),可以通过request.data获取
    print("request.data: %s" % request.data)

    # args是用来提取url中的参数(查询字符串)
    city = request.args.get("city")
    return "hello name=%s, age=%s, city=%s, name_li=%s" % (name, age, city, name_li)   

@app.route("/upload", methods=["POST"])
def upload():
    """接受前端传送过来的文件"""
  #如果是文件类型的,可以通过 request.files获取文件
    file_obj = request.files.get("pic")
    if file_obj is None:
        # 表示没有发送文件
        return "未上传文件"

#方式一(常规)
    # 将文件保存到本地
    # # 1. 创建一个文件
    # f = open("./demo.png", "wb")
    # # 2. 向文件写内容
    # data = file_obj.read()
    # f.write(data)
    # # 3. 关闭文件
    # f.close()
    
#方式二(推荐)
    # 直接使用上传的文件对象保存
    file_obj.save("./demo1.png")
    return "上传成功"

# with open打开文件自动可以关闭流
with open("./1.txt", "wb") as f:
    f.write("hello flask")

@app.route("/login", methods=["GET"])
def login():
    # name = request.form.get()
    # pwd = request.form.get()
    name = ""
    pwd = ""
    if name != "11111" or pwd != "admin":
        # 使用abort函数可以立即终止视图函数的执行
        # 并可以返回给前端特定的信息
        # 1 传递状态码信息, 必须是标准的http状态码
        abort(404)
        # #2. 传递响应体信息
        # resp = Response("login failed")
        # abort(resp)

    return "login success"


# 定义错误处理的方法
@app.errorhandler(404)
def handle_404_error(err):
    """自定义的处理错误方法"""
    # 这个函数的返回值会是前端用户看到的最终结果
    return u"出现了404错误, 错误信息:%s" % err


if __name__ == '__main__':
    app.run(debug=True)

Response实例讲解

# coding:utf-8

from flask import Flask, request, abort, Response, make_response
app = Flask(__name__)

#比较常规的处理response方式
@app.route("/index")
def index():
    # 1 使用元祖,返回自定义的响应信息
    #              响应体       状态码 响应头
    # return "index page", 400, [("aimaile", "1"), ("City", "c1")]
    # return "index page", 400, {"aimaile": "2", "City1": "cq"}
    # return "index page", 666, {"aimaile": "3", "City1": "cq"}
    # return "index page", "666 aimaile status", {"aimaile": "python1", "City1": "cq"}
    # return "index page", "666 aimaile status"

    # 2 使用make_response 来构造响应信息
    resp = make_response("index page 2")
    resp.status = "999 itcast"  # 设置状态码
    resp.headers["city"] = "cq " # 设置响应头
    return resp
 
# 目前我用得最多的是返回json。
#1、终端和平台交互现在一般都是json。
#2、目前很流行前后分离,前端用vue,前后交互也用json,后台只管数据处理,前端只管渲染数据
@app.route("/list")
def loveCity():
    # json就是字符串
    data = {
        "city": "cq",
        "old": 11
    }
    # json.dumps(字典)  将python的字典转换为json字符串
    #  json.loads(字符串)  将字符串转换为python中的字典
    
    # json_str = json.dumps(data)
    # return json_str, 200, {"Content-Type": "application/json"}

    # jsonify帮助转为json数据,并设置响应头 Content-Type 为application/json
    # return jsonify(data)

    return jsonify(city="cq", country="china")

if __name__ == '__main__':
    app.run(debug=True)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容