当前位置:网站首页>【flask入门系列】flask处理请求和处理响应

【flask入门系列】flask处理请求和处理响应

2022-06-26 01:41:00 馆主阿牛

个人简介

  • 作者简介:大家好,我是阿牛,全栈领域新星创作者。
  • 博主的个人网站:阿牛的博客小屋
  • 支持我:点赞+收藏️+留言
  • 系列专栏:flask框架快速入门
  • 格言:迄今所有人生都大写着失败,但不妨碍我继续向前!
    请添加图片描述

前言

上一节我写了flask获取路径参数以及转换器的使用,这节我们来讲如何获取其他地方的参数以及flask如何处理响应。

flask处理请求之request对象

如果想要获取其他地方的参数,可以通过Flask提供的request对象来读取,
不同位置的参数都存放在request的不同属性中,可以看下面的表格:

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

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

#导入Flask类和request对象
from flask import Flask,request

app = Flask(__name__)

@app.route('/articles')
def get_articles():
    channel_id = request.args.get('channel_id')
    return 'you want get articles of channel {}'.format(channel_id)

在这里插入图片描述

不同于django,django的requset对象必须是视图函数的第一个参数,而Flask不同,我们需要用 from flask import request,并且不需要在视图函数参数中写request。

上传图片

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

@app.route('/upload',methods=['POST'])
def upload_files():
    f = request.files['pic']  # pic为文件名
    # with open('./demo.png','wb') as new_file:
    # new_file.write(f.read())
    f.save('./demo.png') # 保存图片 save()方法是框架自带的快速保存文件的方法
    return 'ok'

这个是存储上传的文件的路由和视图,还可以写一个提交文件的form表单对应的html,然后后端给个返回这个html文件的路由和视图,表单将文件提交到上面这个路由就行,这里先不写这个实现,大家可以用postman这款软件自己提交图片到这个路径测试一下就可以了,当你在做前后端结合的项目的时候这些东西都会慢慢掌握!

处理响应

1.返回模板 render_template

使用 render_template 方法渲染模板并返回
例如,新建一个模板index.html,放在templates目录下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

</head>
<body>
    <div>{
   { my_str }}</div>
    <div>{
   { my_int }}</div>
</body>
</html>

代码中的{ { }}为jinja2模板语法。

from flask import Flask,render_template
app = Flask(__name__)

@app.route('/')
def index():
    mystr = "hello aniu"
    mint = 20
    return render_template('index.html',my_str=mystr,my_int=mint)

在这里插入图片描述
跟django不同的是,返回到前端的参数是直接放到 render_template 方法中的,而django是封装成字典,当然,利用python 的语法,我们也可以将其封装成字典。

@app.route('/')
def index():
    data = {
    
        'my_str':'hello aniu',
        'my_int':20
    }
    return render_template('index.html',**data)

**data会将字典转换成独立的参数,相当于下面这行代码:

 return  render_template('index.html',my_str='hello aniu',my_int=20)

2.重定向 redirect

from flask import Flask,redirect
app = Flask(__name__)

app.route('/demo1')
def demo1():
    return redirect("https://www.aniu.space/")

3.返回JSON

from flask import Flask,jsonify
app = Flask(__name__)

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

jsonify()跟json模块中的json.dumps()的区别:

1.json.dumps()只是将字典转换成了json字符串,并没有改变HTTP响应报文中的Content-Type。
2.jsonify()不仅将字典转换为json字符串,而且将HTTP响应报文中的Content-Type值改为了application/json.

在这里插入图片描述

4.自定义状态吗和响应头

1.元组方式

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

@app.route('/demo3')
def demo2():
    return ('状态码666',666,{
    'aniu':'hahaha'})

在这里插入图片描述

2.make _ response 方式

from flask import Flask,make_response
app = Flask(__name__)

@app.route('/demo4')
def demo4():
    resp = make_response("make_response测试")
    resp.headers['aniu'] = 'hahaha'
    resp.status = "404 not found"
    return resp

在这里插入图片描述

结语

如果你觉得博主写的还不错的话,可以关注一下当前专栏,博主会更完这个系列的哦!也欢迎订阅博主的其他好的专栏。

系列专栏
软磨 css
硬泡 javascript
前端实用小demo
更多专栏请移步博主主页查看! 博主的个人网站也很有趣,可以光顾一下哦:阿牛的博客小屋

原网站

版权声明
本文为[馆主阿牛]所创,转载请带上原文链接,感谢
https://guanzhu-aniu.blog.csdn.net/article/details/124937661