flask-基础篇02 请求与响应

一、处理请求

  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)

 

posted @ 2020-10-12 20:17  霍非  阅读(171)  评论(0编辑  收藏  举报