Python轻量级Web框架Flask(3)——Flask路由参数/Flask请求与响应/重定项/异常处理

2023-10-27

1、Flask路由参数和methods参数:

  • 路由其实就是一个路径,就是@a.route(‘/template_test/’)中的’/template_test/',每一个路由对应的是唯一的一个功能,如果要实现很多个功能,就需要很多个路由

  • methods参数就是用来设置支持GET和POST请求的

  • 下面通过“Python轻量级Web框架Flask(2)”中的“Flask项目拆分的”模板参考链接,修改views.py当中的代码来进行Flask路由参数和methods参数的说明:
    在这里插入图片描述

  • python代码如下:

# 在views.py中放路由和视图函数

from flask import Blueprint
from .models import * #后面是用views来控制数据库的,所以要在views中导入models文件

# 蓝图
blue = Blueprint('user', __name__)

@blue.route('/')
def index():
    return 'index'

'''
《路由参数》
string 接收任何没有(‘/’)的字符串(默认)
int 接收整型
float 接收浮点型
path 接受路径,可接受(‘/’)
uuid 只接受uuid字符串,唯一码,一种生成规则
any 可以同时指定多种路径,进行限定
'''
# string   这是最重要的,后面项目中,所有传参其实都可以用string,然后用python转成对应数据类型
@blue.route('/str/<string:name>/')
def get_str(name):
    print(type(name))
    return name
# int
@blue.route('/int/<int:num>/')
def get_int(num):
    print(type(num))
    # 返回值如果不做转换,会报错:
    # TypeError: The view function did not return a valid response.
    # The return type must be a string, dict, list,
    # tuple with headers or status, Response instance,
    # or WSGI callable, but it was a int.
    return str(num)
# int
@blue.route('/<float:num1>/')
def get_float(num1):
    print(type(num1))
    return str(num1)
# path  和string差不多,区别是可接受(‘/’)
@blue.route('/dd/<path:a>/')
def get_path(a):
    print(type(a))  # str类型
    return str(a)

# uuid  是一种特殊格式的数据
# 第一步:首先先通过导入uuid包获取下uuid的数据格式
@blue.route('/getuuid/')
def get_uuid():
    import uuid
    return str(uuid.uuid4())
# 第二步:通过第一步获取的数据传参测试(31230d57-49c4-48d0-9c86-313c23d08582)
@blue.route('/d/<uuid:id>/')
def get_uuid2(id):
    print(type(id)) # <class 'uuid.UUID'>
    return str(id)
# any 传参只能传any括号中有的选项
@blue.route('/any/<any(a,b,c):v>/')
def get_any(v):
    print(type(v))
    return str(v)

#《请求方式》,如果要同时支持GET和POST请求,就要设置methods参数,如下:
@blue.route('/methods/',methods=['GET','POST'])
def get_methods():
    return 'methods'
  • 结果如下:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

2、Flask请求与响应 / 重定项 / 异常处理:

  • 前言:本环节知识新建python项目框架如下(基于“Python轻量级Web框架Flask(2)”中的“Flask项目拆分的”模板参考链接):
    在这里插入图片描述

  • 注意:通过路由传参只是传参的一种方式

  • 在这个知识点讲解中,通过python中spider_1来模拟前端请求

  • request参数列表
    在这里插入图片描述

  • 重定向:就是你的客户端发送访问请求时,不会直接调用数据给到你,而是会跳转别的页面。

  • views.py中的python代码

# 在views.py中放路由和视图函数
import requests
from flask import Blueprint, request, render_template, jsonify, make_response, Response, redirect, url_for, abort
from .models import * #后面是用views来控制数据库的,所以要在views中导入models文件

# 蓝图
blue = Blueprint('user', __name__)  #user表示蓝图名称

@blue.route('/')
def index():
    return 'index'


# 请求和响应
# request:请求(客户端发送给服务器)
# response:响应(服务器返回给客户端)
# http一次前后端交互:先请求,后响应

# Request:向服务器发送请求
@blue.route('/request/',methods=['GET','POST'])
def get_request():
    pass
    # print(request)  #<Request 'http://127.0.0.1:5000/request/' [GET]>

    # 重要属性
    print(request.method)   # 请求方式:GET或POST···

    # GET请求的参数
    # 返回的ImmutableMultiDict是类字典对象,可以当作字典来用,但是key值可以重复
    # print(request.args) # ImmutableMultiDict([('name', 'zhangsan'), ('name', 'lisi'), ('age', '12')])
    # print(request.args['name']) # 获取GET请求的参数法1:zhangsan
    # print(request.args.get('name')) # 获取GET请求的参数法2:zhangsan
    # print(request.args.getlist('name')) # 获取GET请求的参数法3:['zhangsan', 'lisi']
    '''
    常用的获取GET请求参数的是法2,法3用在有
    重复key的参数的情况下。
    '''

    # POST请求的参数
    # print(request.form) #ImmutableMultiDict([('name', 'a1'), ('age', '15')])
    # print(request.form.get('age'))  #15

    # cokie
    print(request.cookies)  #ImmutableMultiDict([('name', 'hello')])

    # 路径
    print(request.path) # /request/
    print(request.url)  #
    print(request.base_url)
    print(request.host_url)
    print(request.remote_addr)  #客户端啊ip:127.0.0.1

    print(request.files)    # 网页传输文件内容:ImmutableMultiDict([])
    print(request.headers)  # 请求头
    '''
    Host: 127.0.0.1:5000
    User-Agent: python-requests/2.28.2
    Accept-Encoding: gzip, deflate
    Accept: */*
    Connection: keep-alive
    Cookie: name=hello
    '''
    # 后端反爬虫要用到的信息
    print(request.user_agent)   # 用户代理,包括浏览器操作系统的信息:python-requests/2.28.2

    return 'request ok!'

# Response:服务器端向客户端发送的响应
@blue.route('/response/')
def get_response():
    # pass
    # 响应的几种方式

    # 1、返回字符串(不常用)
    # return 'response OK!'

    # 2、模板渲染(前后端不分离)
    # return render_template('index.html', name='xx', age=14)

    # 3、返回json数据(前后端分离)
    # data = {'name':'aa','age':44}
    # return data

    # jsonify():序列化,字典——>字符串
    # return jsonify(data)

    # 4、字定义Response对象
    html = render_template('index.html', name='xx', age=14)
    print(html,type(html))  # 打印html文件中的内容,</html> <class 'str'>

    # res = make_response(html,200)
    res = Response(html)    # 这种方式和上面效果一样
    return res

# Redirect:重定项
@blue.route('/redirect/')
def make_redirect():
    pass
    # 重定项的几种方式

    # 1、跳到外部网页
    # return redirect('https://www.baidu.com')

    # 2、跳到内部网页
    # return redirect('/response/')

    # 3、url_for():反向解析,通过视图函数名反过来找路由【正常是通过路由找视图函数】
    # 语法:url_for('蓝图名称.视图函数名',参数···)
    ret = url_for('user.get_request',name='aa',age=31)
    print('ret:',ret)   # ret: /request/?name=aa&age=31
    return redirect(ret)

# 异常处理
# 抛出异常:abort
@blue.route('/abort/')
def make_abort():
    # 主动抛出异常
    abort(403)  # Forbidden异常
    return 'hello abort'
@blue.errorhandler(403) # 这里的异常要和前面抛出的异常对应,否则捕获不到!
def error_handle(e):
    print('e:',e)   # e: 403 Forbidden: You don't have the permission to access the requested resource. It is either read-protected or not readable by the server.
    return '捕获异常:' + str(e)

总结:

  • 以后再pycharm中写代码导包,就直接把包拼出来,然后等标红时,选中,然后alt+回车,自动导包,有的没有提示的就需要手动导包了。
  • 对于Flask的学习,应该熟练掌握虚拟环境的搭建和使用(一种是直接在电脑上导入一个虚拟环境的库,然后创建虚拟环境,另一种是通过pycharm来搭虚拟环境)
  • 熟悉Flask框架的特点及组成
  • 掌握蓝图Blueprint的使用
  • 掌握路由Route的使用
  • 掌握请求Request和响应Response的使用

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python轻量级Web框架Flask(3)——Flask路由参数/Flask请求与响应/重定项/异常处理 的相关文章

  • 在 python 程序中合并第三方库的最佳实践是什么?

    下午好 我正在为我的工作编写一个中小型Python程序 该任务需要我使用 Excel 库xlwt and xlrd 以及一个用于查询 Oracle 数据库的库 称为CX Oracle 我正在通过版本控制系统 即CVS 开发该项目 我想知道围
  • Python 的键盘中断不会中止 Rust 函数 (PyO3)

    我有一个使用 PyO3 用 Rust 编写的 Python 库 它涉及一些昂贵的计算 单个函数调用最多需要 10 分钟 从 Python 调用时如何中止执行 Ctrl C 好像只有执行结束后才会处理 所以本质上没什么用 最小可重现示例 Ca
  • SQLAlchemy 通过关联对象声明式多对多自连接

    我有一个用户表和一个朋友表 它将用户映射到其他用户 因为每个用户可以有很多朋友 这个关系显然是对称的 如果用户A是用户B的朋友 那么用户B也是用户A的朋友 我只存储这个关系一次 除了两个用户 ID 之外 Friends 表还有其他字段 因此
  • 将 saxon 与 python 结合使用

    我需要使用 python 处理 XSLT 目前我正在使用仅支持 XSLT 1 的 lxml 现在我需要处理 XSLT 2 有没有办法将 saxon XSLT 处理器与 python 一起使用 有两种可能的方法 设置一个 HTTP 服务 接受
  • Django:按钮链接

    我是一名 Django 新手用户 尝试创建一个按钮 单击该按钮会链接到我网站中的另一个页面 我尝试了一些不同的例子 但似乎没有一个对我有用 举个例子 为什么这不起作用
  • Python - StatsModels、OLS 置信区间

    在 Statsmodels 中 我可以使用以下方法拟合我的模型 import statsmodels api as sm X np array 22000 13400 47600 7400 12000 32000 28000 31000 6
  • 如何在 Python 中检索 for 循环中的剩余项目?

    我有一个简单的 for 循环迭代项目列表 在某些时候 我知道它会破裂 我该如何退回剩余的物品 for i in a b c d e f g try some func i except return remaining items if s
  • 以编程方式停止Python脚本的执行? [复制]

    这个问题在这里已经有答案了 是否可以使用命令在任意行停止执行 python 脚本 Like some code quit quit at this point some more code that s not executed sys e
  • 如何加速Python中的N维区间树?

    考虑以下问题 给定一组n间隔和一组m浮点数 对于每个浮点数 确定包含该浮点数的区间子集 这个问题已经通过构建一个解决区间树 https en wikipedia org wiki Interval tree 或称为范围树或线段树 已经针对一
  • 如何使用 OpencV 从 Firebase 读取图像?

    有没有使用 OpenCV 从 Firebase 读取图像的想法 或者我必须先下载图片 然后从本地文件夹执行 cv imread 功能 有什么办法我可以使用cv imread link of picture from firebase 您可以
  • 从 Flask 访问 Heroku 变量

    我已经使用以下命令在 Heroku 配置中设置了数据库变量 heroku config add server xxx xxx xxx xxx heroku config add user userName heroku config add
  • BeautifulSoup 中的嵌套标签 - Python

    我在网站和 stackoverflow 上查看了许多示例 但找不到解决我的问题的通用解决方案 我正在处理一个非常混乱的网站 我想抓取一些数据 标记看起来像这样 table tbody tr tr tr td td td table tr t
  • 添加不同形状的 numpy 数组

    我想添加两个不同形状的 numpy 数组 但不进行广播 而是将 缺失 值视为零 可能最简单的例子是 1 2 3 2 gt 3 2 3 or 1 2 3 2 1 gt 3 2 3 1 0 0 我事先不知道形状 我正在弄乱每个 np shape
  • 向 Altair 图表添加背景实心填充

    I like Altair a lot for making graphs in Python As a tribute I wanted to regenerate the Economist graph s in Mistakes we
  • 如何在seaborn displot中使用hist_kws

    我想在同一图中用不同的颜色绘制直方图和 kde 线 我想为直方图设置绿色 为 kde 线设置蓝色 我设法弄清楚使用 line kws 来更改 kde 线条颜色 但 hist kws 不适用于显示 我尝试过使用 histplot 但我无法为
  • 有人用过 Dabo 做过中型项目吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们正处于一个新的 ERP 风格的客户端 服务器应用程序的开始阶段 该应用程序是作为 Python 富客户端开发的 我们目前正在评估 Dabo
  • 使用其构造函数初始化 OrderedDict 以便保留初始数据的顺序的正确方法?

    初始化有序字典 OD 以使其保留初始数据的顺序的正确方法是什么 from collections import OrderedDict Obviously wrong because regular dict loses order d O
  • Scrapy:如何使用元在方法之间传递项目

    我是 scrapy 和 python 的新手 我试图将 parse quotes 中的项目 item author 传递给下一个解析方法 parse bio 我尝试了 request meta 和 response meta 方法 如 sc
  • Rocket UniData/UniVerse:ODBC 无法分配足够的内存

    每当我尝试使用pyodbc连接到 Rocket UniData UniVerse 数据时我不断遇到错误 pyodbc Error 00000 00000 Rocket U2 U2ODBC 0302810 Unable to allocate
  • Python 类继承 - 诡异的动作

    我观察到类继承有一个奇怪的效果 对于我正在处理的项目 我正在创建一个类来充当另一个模块的类的包装器 我正在使用第 3 方 aeidon 模块 用于操作字幕文件 但问题可能不太具体 以下是您通常如何使用该模块 project aeidon P

随机推荐