关于Flask 视图介绍
作者:tigeriaf 发布时间:2022-10-21 15:07:34
1、视图函数
之前的文章说过,在 Flask 中路由是请求的 url 与处理函数之间的映射,使用app.route装饰器将处理函数和 url 绑定,路由绑定的处理函数就被成为视图函数。
@app.route('/user/<name>')
def hello_user(name):
return 'Hello {}!'.format(name)
上面的hello_user()
函数就是一个简单的视图函数。
当然我们也可以不使用app.route
装饰器,使用app.add_url_rule()
方法也可将视图函数和 url
进行绑定,实际上装饰器app.route
也是调用的app.add_url_rule()
方法。
def hello():
return 'hello Flask!'
app.add_url_rule('/hello', view_func=hello)
通过app.add_url_rule()
方法,可以将路由同视图分开,方便将路由进行统一管理。
2、类视图
我们之前包括上面使用的,都是基于函数的视图,这虽然是最简单便捷的用法,但是不容易扩展,其实视图函数也可以基于类来实现,好处就是类支持继承,可以把一些共性的代码放在父类中,其他子类可以继承,在某些情况下,使用类更合理,更易于扩展。
类视图分为标准类视图和基于调度方法的类视图,下面分别介绍一下。
2.1 标准类视图
标准类视图的写法:
父类必须继承
flask.views.View
类子类实现
dispatch_request()
方法,完成自身的业务逻辑并返回结果子类使用
app.add_url_rule()
进行注册,其中view_func
参数使用as_view()
方法做类方法转换如果注册时指定了
endpoint
参数,endpoint
的值会覆盖指定的视图名称,使用url_for
时就必须使用endpoint
指定的值
具体使用方式如下:
from flask.views import View
class ParentView(View):
def __init__(self):
super().__init__()
# 公共部分信息
self.public_data = 'Flask Web App'
class Index(ParentView):
methods = ['GET']
def dispatch_request(self):
return self.public_data + " index"
class User(ParentView):
methods = ['POST']
def dispatch_request(self):
return self.public_data + " user"
app.add_url_rule('/index', endpoint='index', view_func=Index.as_view('index'))
app.add_url_rule('/user', endpoint='user', view_func=User.as_view('user'))
上述代码中创建了一个 ParentView
类,继承自 flask.views.View
类,然后创建了 Index
和 User
两个类继承自 ParentView
类,并分别重写实现了dispatch_request()
函数,使用了父类 ParentView
的属性public_data
, 实现自己的业务逻辑。然后我们通过as_view()
方法把类转换为实际的视图函数,as_view()
必须传入一个唯一不重复的视图名。此后,这个视图由app.add_url_rule()
方法和指定路由绑定。
类视图支持的 HTTP
请求方法由视图类变量methods
指定,默认只支持 GET 请求。
2.1.1 基于方法的视图
如果视图支持多种 HTTP 请求方法的话,之前我们都是在视图函数中进行判断,根据不同的请求方法执行不同的业务逻辑,那有没有更简单的方法呢?是有的,Flask
中的方法类视图 flask.views.MethodView
就可以做到,它是 flask.views.View
的子类,通过定义和请求方式同名的小写方法来完成了逻辑处理,不必提供methods属性,每个 HTTP 方法都映射到一个具有相同名称(小写)的函数。
下面看下详细使用方法。
from flask.views import MethodView
class UserView(MethodView):
def get(self):
user_id = request.args.get("user_id")
return "Hello user:{}".format(user_id)
def post(self):
name = request.form.get("name")
password = request.form.get("password")
if name == "admin" and password == "123456":
return "hello admin!"
else:
return "not allow!"
app.add_url_rule('/user/get_info', view_func=UserView.as_view('get'))
app.add_url_rule('/user/login', view_func=UserView.as_view('post'))
代码中定义的get()
函数用于处理 GET 请求,post()
函数用于处理 POST 请求,代码中省去了 HTTP 请求方法的判断语句,而且是不是更加RESTFul
一些了。
请求测试:
来源:https://juejin.cn/post/7032867176088338445
猜你喜欢
- 本文实例讲述了Python使用sklearn实现的各种回归算法。分享给大家供大家参考,具体如下:使用sklearn做各种回归基本回归:线性、
- 关于python读取xml文章很多,但大多文章都是贴一个xml文件,然后再贴个处理文件的代码。这样并不利于初学者的学习,希望这篇文章可以更通
- <pre name="code" class="python">creazy.txt文件
- 一、说明压缩和解压缩是日常常用的操作,不管是windows上图形界面的操作,还是linux上用命令来进行压缩解压缩,总的而言都还是比较方便的
- 随机生成四位数验证码,包括汉字,数字,英文大小写。1.Servlet类package servlet;import java.awt.Bas
- 1.用一个栈【python中可以用List】就可以解决,时间和空间复杂度都是O(n)# -*- coding: utf8 -*-# 符号表S
- 我很想自己写一个这样的程序,不过wordpress是php的,我blog是ASP的,只好用ASP写代码了。经过一番折腾测试,终于让我的梦想变
- 下面给大家分享Python爬虫后获取重定向url的两种方法,具体内容如下所示;方法(一)# 获得重定向url from urllib imp
- 本文实例为大家分享了python实现转圈打印矩阵的具体代码,供大家参考,具体内容如下#! conding:utf-8__author__ =
- 软硬件环境OS X EI CapitanPython 3.5.1mysql 5.6前言在开发中经常涉及到数据库的使用,而python对于数据
- 前言21世纪是信息的世纪,综合国力的竞争在很大程度上是信息的竞争,更是信息利用率的竞争。近年来,随着“数字地球”和“数字国土”战略的提出和实
- 本文实例讲述了PHP数据库表操作的封装类及用法。分享给大家供大家参考,具体如下:数据库表结构:CREATE TABLE `test_user
- 目录1、创建相关新应用2、获取Access Token3、分析评论并进行观点抽取4、运行结果利用百度API自然语言处理技术中的评论观点抽取方
- 阅读上一篇:FrontPage2002简明教程六:图片库 虽然FrontPage已经给我们提供了很多面很强大的所见即所得的工具,但是随着HT
- 如何用METADATA替换ADOVBS.INC? 在ASP中,使用组件时,如ADO,得先包含
- 方法一:进入MYSQL安装目录 打开MYSQL配置文件 my.ini 或 my.cnf查找 max_connections=100 修改为
- 前言django,web开发中,用django-debug-toolbar来调试请求的接口,无疑是完美至极。 可能本人,见识博浅,才说完美至
- 在观看唐宇迪老师图像处理的课程中,其中有一个答题卡识别的小项目,在此结合自己理解做一个简单的总结。1. 项目分析首先在拿到项目时候,分析项目
- 1.delete不能使自动编号返回为起始值。但是truncate能使自动增长的列的值返回为默认的种子 2.truncate只能一次清空,不能
- 第一部分:UI界面设计界面效果图如下:ui文件(可拉动控件自行创建一个button和text)<?xml version="