首页 > 其他分享 >Flask请求和响应

Flask请求和响应

时间:2024-04-20 21:00:24浏览次数:27  
标签:__ return 请求 Flask app request 响应 print def

Flask请求和响应

目录

flask请求对象

使用Flask Request对象需要在Flask应用程序中导入request模块。

requset:全局的,但是也是每个请求一个request

from flask import Flask, render_template, request
from flask.views import View, MethodView

app = Flask(__name__, template_folder='templates')


@app.route('/', methods=['GET', 'POST'])
def index():
    # 在哪个视图函数执行 , request对象就是属于哪个视图函数
    print(request.path)  # /
    return 'index'


@app.route('/home', methods=['GET', 'POST'])
def home():
    print(request.path)  # /home
    return 'home'


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

request参数

Flask Request对象是一个封装了HTTP请求信息的类,它提供了访问HTTP请求的各种属性和方法

如URL参数、表单数据、文件上传等。

request.method  		提交的方法
request.args 			get请求提及的数据
request.form   			post请求提交的数据
request.values  		post和get提交的数据总和

request.cookies  		客户端所带的cookie
request.headers  		请求头

request.path     		不带域名,路由中请求路径
request.full_path  		不带域名,带参数的请求路径
request.script_root  
request.url           	带域名带参数的完整的请求路径
request.base_url		带域名请求路径
request.url_root      	域名
request.host_url		只有主机和端口号的url
request.host			127.0.0.1:500
request.remote_addr		客户端ip

request.data			包含传入的请求数据作为字符串
request.json			获取json数据
request.files			获取请求上传的文件


obj = request.files['the_file_name']
obj.save('/var/www/uploads/' + secure_filename(f.filename))
from flask import Flask, request

wen = Flask(__name__)

@wen.route("/request/info", methods=["GET"])
def get_request_info():
    print(f"request.args类型:{type(request.args)}")
    print(f"request.args = {request.args}\n")

    print(f"request.json类型:{type(request.json)}")
    print(f"request.json = {request.json}\n")

    print(f"request.files类型:{type(request.files)}")
    print(f"request.files = {request.files}\n")

    print(f"request.form类型:{type(request.form)}")
    print(f"request.form = {request.form}\n")

    print(f"request.method类型:{type(request.method)}")
    print(f"request.method = {request.method}\n")

    print(f"request.url类型:{type(request.url)}")
    print(f"request.url = {request.url}\n")

    print(f"request.host类型:{type(request.host)}")
    print(f"request.host = {request.host}\n")

    print(f"request.headers类型:{type(request.headers)}")
    print(f"request.headers = {request.headers}\n")

    return {"status": 0, "message": "get success"}

if __name__ == "__main__":
    wen.run()

args-Get参数获取

args属性是请求路径中的查询参数,例如:/hello?name=zs, args 解析出来的数据是一个类似字典的对象,例如 args = {"name": 'zx'}

print(request.args)

request.args.get('参数名')   # 获取 GET 请求参数
request.args['name']
request.args['age']           
request.args.get('name')     
request.args.getlist('name')     

form-POST请求参数

form 顾名思义是表单数据,当请求头content-type 是 application/x-www-form-urlencoded 或者是 multipart/form-data 时,请求体的数据才会被解析为form属性。

print(reqeust.form)

request.form.get('参数名')    # 获取 POST 请求参数
request.values.get('参数名')
from flask import request

@app.route('/user')
def user():
    uid = request.args.get('uid')
    return 'USER ID: {}'.format(uid)

JSON

如果我将content-type指定为application/json, flask就会将接收到的请求体数据做一次json编码转换,将字符串转换为字典对象,赋值给属性json

@app.route("/hello", methods=["GET", "POST"])
def hello():
    print("content_type:", request.headers.get("content_type"))
    print("data:", request.data)
    print("form:", request.form)
    print("json:", request.json)
    return ""

request.values

values 是 args 和 form 两个字段的组合

可以同时获取args参数和form表单参数

@app.route("/hello", methods=["GET", "POST"])
def hello():
    print("content_type:", request.headers.get("content_type"))
    print("args:", request.args)
    print("form:", request.form)
    print("values:", request.values)
    return "hello"

路径属性

request.path	路由中的路径
request.url		完整的请求地址
request.base_url	去掉GET参数的url
request.host_url	只有主机和端口号的url
request.remote_addr	客户端ip

路由转化器

有时我们需要将同一类URL映射到同一个视图函数处理
比如:使用同一个视图函数 来显示不同用户的个人信息。
# 请求访问接口地址为:/users/1,其中1是具体请求参数
# 请求访问接口地址为:/users/2,其中2是具体请求参数
# 请求访问接口地址为:/users/3,其中3是具体请求参数

@app.route('/user/<uid>')
def user(uid):
    print(type(uid))
    return 'USER ID: {}'.format(uid)
@app.route('/user/<int:uid>')
def user(uid):
    print(type(uid))
    return 'USER ID: {}'.format(uid)


@app.route('/user/<int(min=5):uid>')
def user(uid):
    print(type(uid))
    return 'USER ID: {}'.format(uid)

自定义转换器

from flask import Flask
from werkzeug.routing import BaseConverter

app = Flask(__name__)

# 自定义一个转换器类
class RegexMobileConverter(BaseConverter):
    regex = r'1[3-9]\d{9}'
    def __init__(self, url_map):
        #调用父类方法
        super(RegexMobileConverter, self).__init__(url_map)
    
# 将转换器注册到app中去
app.url_map.converters['mobile'] = RegexMobileConverter
#打印输出所有的系统转换器列表
print(app.url_map.converters)

# 路由使用转换器
@app.route('/user/<mobile:temp>')
def create_new(temp):
    print(temp)
    return f'mobile{temp}'


if __name__ == '__main__':
    print(app.url_map)
    app.run()

flask响应返回

Flask中的Response对象是用于构建 HTTP 响应的类。它继承自 Python 标准库中的werkzeug.wrappers.Response 类,提供了一些方便的方法,如设置响应头、状态码和内容等。

可以设置的响应返回有:

  • 1 直接返回字符串
  • 2 返回模板渲染:render_template
  • 3 返回重定向: redirect
  • 4 返回json格式:jsonify
  • 5 自定义响应对象
from flask import Flask, request
app = Flask(__name__)

@app.route('/post',methods = ['POST', 'GET'])
def post():
   if request.method == 'POST':
   	  # request.form:表单数据
      result = request.form
      print(result)
      return "post"


 # 返回模板
@app.route('/')
def student():
   
   return render_template('index.html')


 # 返回字符串
@app.route('/get')
def get():
 	# 获取URL参数中名为name的值,默认为Jack
    name = request.args.get('name', 'Jack')
    return f'Hello, {name}!'


@app.route('/upload', methods=['POST'])
def upload():
	# 获取上传文件对象
    file = request.files['file']
    if file:
        return 'File uploaded successfully.'

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

返回json

在使用json都是自己使用json.dumps方法把数据转成json。并把响应头媒体类型定义成application/json

其实flask帮我们封装了一个方法,专门用于返回json数据响应对象。

from flask import jsonify

@app.route('/')
def index():
    json_dict = {
        "name": 'Flask',
        "age": 22
    }
    return jsonify(json_dict)

也是用Response类处理

并自动获取config里面的源类型 默认是application/json

自定义响应对象

在return的时时候,可以接收三个参数,第一个响应数据,第二个响应状态码,第三个响应头

可以手动修改 响应状态和响应头

@app.route("/", methods=["GET", "POST"])
def index():
    return json.dumps({"username": "jiangmingbai"}), 201, {"content-type": "application/json"`}

调用 make_response() 函数来创建一个响应对象并将字符串Hello, World设置为响应体。然后,设置响应头部信息 Token,设置响应状态码200 OK,并最终将响应对象返回给客户端。

from flask import make_response

@app.route('/')
def index():
    resp = make_response('Hello World')  #res 就是响应对象, Hello World是响应体
    resp.headers["Token"] = "Python"
    resp.status = "200 OK"

    return resp

make_response()里基于current_app.make_response(args)方法

  def __init__(
        self,
        response=None,  # 响应数据
        status=None,  # 状态码
        headers=None,  # 头信息
        mimetype=None,  # 媒体类型
        content_type=None,  
        direct_passthrough=False,
    ):

from flask import Flask, make_response

app = Flask(__name__)

@app.route("/", methods=["GET", "POST"])
def index():
    r = make_response(json.dumps({"username": "beike"}), 201, {"content-type": "application/json"})
    print(r)  # <Response 28 bytes [201 CREATED]>实例对象
    r.status = "202 OK"  # 通过实例在赋值stutas时必须是字符串
    return r
if __name__ == '__main__':
    app.run(debug=True)

重定向

在 Flask 中,可以使用 redirect 函数进行重定向。该函数位于 flask 模块中,可以接受一个 URL 参数作为重定向的目标。调用时,它返回一个响应对象,并将用户重定向到具有指定状态代码的另一个目标位置

  • 网页上的网址(完整的)
  • 自己写的视图函数,使用url_for('蓝图名称.视图函数') 反向解析
# 当用户访问根URL/ 时,会调用index函数,并在其中调用 redirect 函数,将用户重定向到login视图函数所对应的 URL。

from flask import Flask, redirect, url_for

app = Flask(__name__)

@app.route('/')
def index():
    return redirect(url_for('login'))

@app.route('/login')
def login():
    return 'Login page'



# 当访问URL/test 时,会重定向到baidu.com
@app.route('/test')
def test():
    return redirect('http://www.baidu.com')

URL 参数可以是相对路径或绝对路径。如果传入的是相对路径,则会基于当前请求的 URL 进行解析,生成最终的重定向目标 URL。

Cookies对象

Cookie技术是用来保持web访问状态

Cookie技术通过在请求和响应报文中添加Cookie数据来保存客户端的状态信息

设置cookie,默认有效期是临时cookie,浏览器关闭就失效

在设置 cookie 时,可以指定其过期时间、域名、路径等信息。在 Flask 中,可以通过设置 max_age、expires、domain、path 等参数来实现这些功能。

from flask import make_response

@app.route('/set')
def set():
    resp = make_response('Hello World')
    resp.set_cookie('Token', 'Python' , max_age=3600)
    return resp

# resp.set_cookie('user', 'Tom', max_age=3600, expires=None, domain=None, path='/')

获取和删除

@app.route('/get')
def get():
    resp = request.cookies.get('Token')
    return resp

@app.route('/delete')
def delete():
    response = make_response('Successfully')
    response.set_cookie('username', '', expires=0)  # 设置Cookie过期时间为0
    return response

Cookie的特点

① 数据全都是存储在客户端中,存储使用的是键值对结构进行存储
② Cookie支持过期时间
③ Cookie不能跨域名,不能跨浏览器
④ 根据域名进行Cookie存储
⑤ Cookie是通过服务器创建的Response来创建的

Session会话对象

浏览器中手动添加和修改Cookie是很容易的事情,如果直接把认证信息以明文的方式存储在Cookie里,那么恶意用户就可以通过伪造Cookie的内容来获取对网站的权限。为了避免上述的问题,我们需要对铭感的Cookie内容进行加密,出现了Session

Session指用户会话(user session),即服务器和客户端/浏览器之间或桌面程序和用户之间建立的交互活动

在Flask中,Session对象用来加密Cookie,默认情况下,它会把数据存储在浏览器上一个名为"session"的Cookie里,Session通过密钥对数据进行签名以加密数据,因此我们需要先设置一个密钥,这里的密钥就是一个具有一定复杂度和随机性的字符串

from flask import Flask, session

app = Flask(__name__)
app.secret_key = 'your-secret-key'  # 设置密钥,用于加密Session数据

@app.route('/')
def hello():
    # 设置Session数据
    session['username'] = 'John'
    return 'Hello, World!'

@app.route('/user')
def get_user():
    # 获取Session数据
    username = session.get('username')
    if username:
        return f'Current user: {username}'
    else:
        return 'User not found'

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

获取删除和设置

session.get(key, default=None)

session['key'] = 'value'

# 删除某一值
session.pop(key)
# 清除所有(慎用,会删除服务器下的所有session)
session.clear()

Session的特点

① 所有数据存储在服务器中,默认存储在内存中
② 存储结构是键值对(key-value)格式
③ Session依赖于Cookie

参考资料

https://blog.csdn.net/qq_38628046/article/details/129090168

https://www.cnblogs.com/dream-ze/p/17659504.html 请求和响应

https://www.cnblogs.com/LyShark/category/2038132.html

https://www.cnblogs.com/jiangmingbai/p/13179950.html#1get请求

标签:__,return,请求,Flask,app,request,响应,print,def
From: https://www.cnblogs.com/tian777/p/18148159

相关文章

  • Flask基础使用
    Flask基础使用目录Flask基础使用简介说明开始目录结构参数配置应用程序配置使用配置app.run参数HTTP请求方法路由和蓝图指定蓝图的url前缀蓝图内部静态文件蓝图内部模板目录参考资料简介说明Flask属于轻量级框架,它只提供最核心的功能,其余的功能需要用自己手写或者用第三方来支......
  • 如何创建响应式HTML电子邮件模板
    在这个适合初学者的指南中,你将学习如何创建一个响应式电子邮件模板。你将跟随逐步说明以及代码片段设计一个在任何设备上都看起来很棒的电子邮件模板。这个项目非常适合渴望掌握电子邮件设计基础的新手!(本文视频讲解:java567.com)步骤1:设置基本结构要构建一个电子邮件模板,你可以......
  • 【开源】使用Python+Flask+Mysql快速开发一个用户增删改查系统
    项目演示项目本身很简单,增删改查是几乎所有系统的骨架。正所谓万丈高楼平地起,学会了增删改查,航母就指日可待了:),光速入门,直接看演示图:项目地址https://github.com/mudfish/python-flask-user-crudFlask框架介绍说白了就是一个Web框架,能够让你快速开发出Pythonweb应用。简单易......
  • springboot java调用flask python写的
    服务a用flask,服务b用的springboot,服务a写的接口,用python很容易就调通了,java来调,坑有点多1、url最后的斜杠必须两边对应上,否则flask会先308,而且contenttype[text/html;charset=utf-8],连对应的HttpMessageConverter都没有org.springframework.web.client.RestClientException:......
  • HttpClient 总是被添加traceparent 请求头
    最近在项目中发现,HttpClient中调用某Api总是出现403的异常,自己使用postman调用即没有问题,经排查是HttpClient会自动添加traceparent请求头Accept-Encoding:gzipUser-Agent:Firefox/5.0(Linux3.4;rv:14.0)Gecko/20100101Firefox/91.0traceparent:00-274628f3ce14109d......
  • 免费PHP服务器-轻松搭建网站,快速响应,稳定高速!
    免费的PHP服务器对于初学者和小型项目来说可能是一个吸引人的选择,但需要注意的是,免费的服务往往有一些限制和潜在的风险。在选择免费PHP服务器时,请务必考虑以下几点:++书谷网库++免费服务器收录大全性能限制:免费服务器往往有资源限制,如CPU、内存和存储空间的限制。这可能导致网站......
  • hyperf统一请求响应
    2024年4月18日08:48:45以下是两个方案:1,使用注解,直接返回<?phpnamespaceApp\Utils;useApp\Utils\GlobalCode;useApp\Utils\GlobalMsg;useHyperf\Contract\ContainerInterface;useHyperf\Di\Annotation\Inject;useHyperf\HttpServer\Contract\RequestInterfac......
  • Flask基础
    一、简介1、框架介绍Flask是一个基于Python并且依赖于Jinja2模板引擎和WerkzeugWSGI服务的一个微型框架WSGI:WebServerGatewayInterface(WEB服务网关接口),定义了使用python编写的webapp与webserver之间接口格式其他类型框架:Django:比较“重”的框架,同时也是最出名的P......
  • Jmeter如何判断请求的数据是Json还是表单格式
    就我个人而言,最简单的是使用curl命令执行下就知道了,比如我自己写的图书管理系统,flask框架图书管理系统服务器端-加个小鸡腿-博客园(cnblogs.com) ,python命令启动后是这样的 其中查询所有图书的接口是127.0.0.1:5000/books,我们打开浏览器输入这条url显示的数据是json格式......
  • 应急响应靶场Where-1S-tHe-Hacker
    应急响应实战靶场打开靶机,发现有两个用户,admin和admin$,一个是隐藏用户admin用户的密码是Aa123456杀软查杀进入主机,我们直接使用D盾和D-eyes杀软进行后台扫描,节省时间这边附上绿盟科技的D-Eyes的使用参数说明####Windows请以管理员身份运行cmd,之后再输入D-Eyes路径运......