每个框架中都有处理请求的机制(request),但是每个框架的处理方式和机制是不同的

为了了解Flask的request中都有什么东西,首先我们要写一个前后端的交互

基于HTML + Flask 写一段前后端的交互

login.html写入

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>标题</title>
</head>
<body>
<p>登录页面</p>
<form action="" method="post" enctype="multipart/form-data">
<span>用户</span><input type="text" name="username">
<span>密码</span><input type="password" name="pwd">
<span>密码</span><input type="file" name="file">
<button>登录</button> </form> </body>
</html>

flask的py文件写入

from flask import Flask, render_template, redirect, send_file, jsonify, request

app = Flask(__name__)

@app.route('/')
def index():
# return jsonify({'name': "aaa", 'age': 77})
# return json.dumps({'name': "aaa", 'age': 77})
# return send_file("1.png")
return send_file("2.mp4")
# return redirect("/login") # "hello world" @app.route('/login', methods=('GET', 'POST'))
def login():
# print(request.url) # http://localhost:8080/login?id=1&age=20 #url栏中所有内容所有的
# print(request.url_root) # http://localhost:8080/
# print(request.url_charset) # utf-8 请求头获取当前所用的格式
# print(request.url_rule) # /login 路由的路径
# print(request.host_url) # http://localhost:8080/
# print(request.base_url) # http://localhost:8080/login if request.method == 'GET':
# print(request) # <Request 'http://127.0.0.1:8080/login' [GET]> return render_template("login.html")
if request.method == 'POST':
# print(request) # <Request 'http://127.0.0.1:8080/login' [POST]>
# print(request.form) # ImmutableMultiDict([('username', 'aaa'), ('pwd', '111')]) # 存储的是所有FormData中的所有数据
# print(request.args) # ImmutableMultiDict([('id', '1'), ('age', '20')]) # 存储的是所有URL中的所有数据
# print(request.json) # None # 当Content-Type: application/json 存放在request.json中(ajax等类型的请求用这个)
# print(request.data) # b'' # Content-Type不正经的无法被解析时,存放原始数据 # print(request.values)
# # CombinedMultiDict([ImmutableMultiDict([('id', '1'), ('age', '20')]), ImmutableMultiDict([('username', 'aaa'), ('pwd', '111')])])
#
# print(request.values.to_dict()) # {'username': 'aaa', 'pwd': '111', 'id': '1', 'age': '20'} # 获得字典 # print(request.cookies) # 获取cookies
# print(type(request.headers)) # <class 'werkzeug.datastructures.EnvironHeaders'>
# print(request.headers) # 请求头相关 print(request.files) # ImmutableMultiDict([('file', <FileStorage: '1.png' ('image/png')>)])
print(request.files.get('file')) # <FileStorage: '1.png' ('image/png')>
my_file = request.files["file"]
my_file.save("1.png") # 保存方法
username = request.form.get('username')
pwd = request.form.get('pwd') if username == 'aaa' and pwd == '111':
return redirect('/home')
return render_template('hello flask.html') @app.route('/home')
def home():
return '登陆成功' app.run(host='0.0.0.0', port=8080, debug=True)

解释一个

@app.route('/login', methods=('GET', 'POST'))
methods=('GET', 'POST') 代表这个url地址只允许 GET POST 请求,是个列表也就是意味着可以允许多重请求方式.
.request.method
print(request.method) # POST 看来可以使用这种方式来验证请求方式了 .request.form
print(request.form) # ImmutableMultiDict([('username', 'aaa'), ('pwd', '')])
# ImmutableMultiDict 它看起来像是的Dict 就用Dict的方法取值试一下吧
print(request.form["user"]) # aaa
print(request.form.get("pwd")) #
# 看来全部才对了, ImmutableMultiDict 似乎就是个字典,再来玩一玩它
print(list(request.form.keys())) # ['user', 'pwd'] 看来是猜对了
#如果以上所有的方法你都觉得用的不爽的话
req_dict = dict(request.form)
print(req_dict) # 如果你觉得用字典更爽的话,也可以转成字典操作(这里有坑) 3.request.args
    print(request.args)    # ImmutableMultiDict([('id', '1'), ('age', '20')])  # 存储的是所有URL中的所有数据
    print(request.args["id"])  # 1
print(request.args.get("age")) # 20
print(list(request.args.keys())) # ['id', 'age']
print(list(request.args.values())) # ['1', '20']
req_dict = dict(request.args) # {'id': ['1'], 'age': ['20']}
print(req_dict)

request.args 与 request.form 的区别就是:

request.args 是获取url中的参数

request.form 是获取form表单中的参数

4.request.values 之 只要有个参数我都要
print(request.values)  # CombinedMultiDict([ImmutableMultiDict([('id', '1'), ('age', '20')]), ImmutableMultiDict([('user', 'Oldboy'), ('pwd', 'DragonFire')])])
print(request.values.get("id")) # 1
print(request.values["username"]) # aaa
# 这回喜欢直接操作字典的小伙伴们有惊喜了! to_dict() 方法可以直接将我们的参数全部转为字典形式
print(request.values.to_dict()) # {'username': 'aaa', 'pwd': '111', 'id': '1', 'age': '20'}
# 注意这里的坑来啦!!!
# 如果url和form中的Key重名的话,form中的同名的key中value会被url中的value覆盖

5.request.cookies 之 存在浏览器端的字符串儿也会一起带过来

前提是你要开启浏览器的 cookies

request.cookies 是将cookies中信息读取出来

6.request.headres 之 请求头

print(request.cookies)   # 获取cookies
print(type(request.headers)) # <class 'werkzeug.datastructures.EnvironHeaders'>
print(request.headers) # 请求头相关 """

Host: localhost:8080
Connection: keep-alive
Content-Length: 20
Pragma: no-cache
Cache-Control: no-cache
Origin: http://localhost:8080
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: http://localhost:8080/login?id=1&username=20
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: Pycharm-bdfc5fce=5839cb6f-fa90-425b-86dd-3ca2dd9403b5

"""

7.request.data 之 如果处理不了的就变成字符串儿存在data里面

你一定要知道 request 是基于 mimetype 进行处理的

mimetype的类型 以及 字符串儿 : http://www.w3school.com.cn/media/media_mimeref.asp

如果不属于上述类型的描述,request就会将无法处理的参数转为Json存入到 data 中

其实我们可以将 request.data , json.loads 同样可以拿到里面的参数

8.request.files 之 给我一个文件我帮你保管

print(request.files)    # ImmutableMultiDict([('file', <FileStorage: '1.png' ('image/png')>)])
print(request.files.get('file')) # <FileStorage: '1.png' ('image/png')>
my_file = request.files["file"]
my_file.save("1.png") #保存文件,里面可以写完整路径+文件名

9. request.获取各种路径 之 这些方法没必要记,但是要知道它存在

 

10. request.json 之 前提你得告诉是json

如果在请求中写入了 "application/json" 使用 request.json 则返回json解析数据, 否则返回 None

第三篇 request篇的更多相关文章

  1. 前端面试题总结(三)JavaScript篇

    前端面试题总结(三)JavaScript篇 一.谈谈对this的理解? this是一个关键字. this总是指向函数的直接调用者(而非间接调用者). 如果有new关键字,this指向new出来的那个对 ...

  2. JS组件系列——表格组件神器:bootstrap table(三:终结篇,最后的干货福利)

    前言:前面介绍了两篇关于bootstrap table的基础用法,这章我们继续来看看它比较常用的一些功能,来个终结篇吧,毛爷爷告诉我们做事要有始有终~~bootstrap table这东西要想所有功能 ...

  3. Oracle知识梳理(三)操作篇:SQL基础操作汇总

    Oracle知识梳理(三)操作篇:SQL基础操作汇总 一.表操作 1.表的创建(CREATE TABLE): 基本语句格式:       CREATE TABLE  table_name ( col_ ...

  4. Android UI开发第三十九篇——Tab界面实现汇总及比较

    Tab布局是iOS的经典布局,Android应用中也有大量应用,前面也写过Android中TAb的实现,<Android UI开发第十八篇——ActivityGroup实现tab功能>.这 ...

  5. Java Learning Path(三)过程篇

    Java Learning Path(三)过程篇 每个人的学习方法是不同的,一个人的方法不见得适合另一个人,我只能是谈自己的学习方法.因为我学习Java是完全自学的,从来没有问过别人,所以学习的过程基 ...

  6. CentOS7 搭建Kafka(三)工具篇

    CentOS7 搭建Kafka(三)工具篇 做为一名懒人,自然不喜欢敲那些命令,一个是容易出错,另外一个是懒得记,能有个工具就最好了,一查还挺多,我们用个最主流的Kafka Manager Kafka ...

  7. Python(三)基础篇之「模块&面向对象编程」

    [笔记]Python(三)基础篇之「模块&面向对象编程」 2016-12-07 ZOE    编程之魅  Python Notes: ★ 如果你是第一次阅读,推荐先浏览:[重要公告]文章更新. ...

  8. JVM学习篇-第一篇

    JVM学习篇-第一篇 JDK( Java Development Kit): ​ Java程序设计语言.Java虚拟机.Java类库三部分统称为JDK,JDK是用于支持Java程序开发的最小环境** ...

  9. 前端工程师技能之photoshop巧用系列第二篇——测量篇

    × 目录 [1]测量信息 [2]实战 [3]注意事项 前面的话 前端工程师使用photoshop进行的大量工作实际上是测量.本文是photoshop巧用系列第二篇——测量篇 测量信息 在网页制作中需要 ...

随机推荐

  1. mybatis 模糊查询 like的三种方式

    第一种 public void selectBykeyWord(String keyword) { String id = "%" + keyword + "%" ...

  2. mybatis的if判断integer

    昨天在使用mybatis的if判断integer时遇见一个小问题: <if test="isChoose != null and isChoose != '' and isChoose ...

  3. css 选择器符号

    1. 空格 —— “后代选择器” 例如下面这个例子,表示div元素里面所有的p元素 div p { ... } 2. > —— “子选择器” 例如下面这个例子,表示div元素里面所有的子代(不含 ...

  4. Docker:dockerfile镜像的分层 [九]

    一.docker镜像的分层 1.图像呈现 2.命令呈现 [root@oldboy kod]# docker image history kod:v1 IMAGE CREATED CREATED BY ...

  5. React 记录(6)

    React文档:https://www.reactjscn.com/docs/react-component.html 慢慢学习:对照教程文档,逐句猜解,截图 React官网:https://reac ...

  6. 第十节:委托和事件(2)(泛型委托、Func和Action、事件及与委托的比较)

    一. 泛型委托 所谓的泛型委托,即自定义委托的参数可以用泛型约束,同时内置委托Func和Action本身就是泛型委托. 将上一个章节中的Calculator类中的方法用自定义泛型委托重新实现一下. p ...

  7. Linux输入法问题

    本篇博文简单介绍一下介绍Linux输入相关问题及解决方案 关于Invalid UTF-8参见https://www.baidu.com/link?url=QDh2Fa1uJcmyiaKZBzAFkNn ...

  8. 小程序 TabBar 定制

    使用微信小程序开发时,用到了其 API - tabBar,设置如下(详细的内容可以参考官网 api): "tabBar": { "color": "# ...

  9. Xvector in Kaldi nnet3

    Xvector nnet Training of Xvector nnet Xvector nnet in Kaldi     Statistics Extraction Layer in Kaldi ...

  10. LCA学习笔记

    写在前面 目录 一.LCA的定义 二.暴力法求LCA 三.倍增法求LCA 四.树链剖分求LCA 五.LCA典型例题 题目完成度 一.LCA的定义 LCA指的是最近公共祖先.具体地,给定一棵有根树,若结 ...