Flask框架的设计理念(flask框架的特点)
ccwgpt 2024-09-15 15:05 44 浏览 0 评论
上一篇我们学习了Flask Web中最简单的示例。
#example :文件名为hello.py
1.from flask import Flask
2.app = Flask(__name__)
3.@app.route('/')
4.def index():
5. return '<h1>Hello world!</h1>'
6.if __name__ == '__main__': #__是双下划线
7. app.run(debug=True)
在虚拟环境中执行python hello.py,相信在浏览器中地址栏输入http://localhost:5000/ 将会现实Hello World!。
那我们想增加页面怎么办呢?通过增加路由与视图函数。
例如,我们现在增加一个能动态现实名字的页面(这种动态变化的称为动态路由)。
在index()函数后,新建一个路由和视图函数,代码如下:
@app.route('/user/<name>')
def user(name):
return '<h1>Hello,%s!</h1>' %name
解释一下,<name>就是路由的动态部分,它作为参数,传进视图函数user中,实现动态变化。
启动服务器后,在浏览器地址栏中输入http://localhost:5000/user/Wayne 回车,就会出现一个显示Hello Wayne!的页面。
----------------------------我是分割线----------------------------------
本篇其实主要讲的是Flask的一些设计理念:
1,请求上下文:
我们知道,要让视图函数能够访问请求对象,是将请求对象作为参数传入视图函数中,不过这种方式会导致程序中的每个视图函数都会增加一个参数。当视图函数除了访问请求对象,还要访问其他对象时,情况会变得很糟糕。因此,为了避免大量可有可无的参数把视图函数变得很糟糕,Flask使用请求上下文临时把某些对象变为全局可访问。因此就可以将视图函数写为:
from flask import request
@app.router('/')
def index():
useragent = request.headers.get('User-Agent') #这个时候将request当作了全局变量使用
return '<p>你的浏览器是 %s</p>' % useragent
作者在书中解释的很清楚,事实上,request是不可能是全局变量的,因为在多线程服务器中,多个线程同时处理不同客户端发送的不同请求,每个线程都会有一个request对象的,它们必然不同。
事实上,Flask有两种上下文:程序上下文和请求上下文。两种上下文的变量名有:current_app,g,request,session 四个。Flask是在分发请求之前激活或推送上下文的,请求处理完成后再删除。程序上下文被推送后就可以在线程中使用current_app,g变量了,同理,请求上下文被推送后,就可以使用request,session 变量了。
2,请求调度:
程序收到请求后,是要找相应的视图函数处理的。当视图函数很多的时候,一个个遍历找是不实际的,耗费太多时间。Flask使用的是URL映射,这个映射建立了URL和视图函数之间的对应关系,Flask使用app.route修饰器或者非修饰器的形式app.add_url_rule()生成映射。
URL映射中是有指定请求方法的,如GET,HEAD,这些请求方法由路由器处理。Flask为每个路由都指定请求方法,即使不同的请求方法发送到相同的URL上时,会使用不同的视图函数进行处理。说明一下,HEAD 和 OPTIONS方法由Flask自动处理。
3,请求钩子:
有时候要在请求之前后之后执行某些代码,这个时候就要用到请求钩子了。例如,在请求开始时,我们要创建数据库连接,为了避免每个视图函数都重复实现创建数据连接代码,Flask提供注册通用函数的功能,注册的函数可以在请求被分发到视图函数之前或之后调用。
请求钩子使用修饰器实现的,Flask支持四种钩子:before_first_request;before_request;after_request;teardown_request。说明一下,请求钩子函数和视图函数之间共享数据一般使用上下文全局变量g。
4,响应:
我们通过上篇简单的例子知道,Flask调用视图函数后,会将其返回值作为响应的内荣,多数情况下是简单的字符串,未作HTML页面返回。但实际上,HTTP响应还有很重要的部分是状态码,默认是200.表示请求已经被成功处理。因此视图函数可以第二个值作为状态码,例如:
@app.route('/')
def index():
return '<h1>你好,失败!</h1>',400 #返回的400状态码表示请求无效
事实上,还可以返回header的,这个是一个字典,只是一般情况下不需要这么做。当然,如果不想在视图函数中返回1个,2个或3个值组成的元组,可以返回Response对象。make_response()函数可以接受1或2或3个值并返回一个Response对象,使用Response对象还可以设置cookie。说明一下,对于重定向响应,原则上是可以使用返回元组或Response的方式实现的,不过由于使用频繁,Flask专门提供给了redirect()函数来生成这种特殊的响应。
from flask import redirect
@app.route('/')
def index():
return redirect('http://www.baidu.com') #重定向到百度
还有一类特殊的响应需要说明一下的,它专门用于处理错误,由abort函数生成。例如:
from flask import abort
@app.route('user/<id>')
def get_user(id):
u = load_user(id)
if not user:
abort(404)
return '<h1>user存在的,是%s</h1> ' %u.name
注意:abort是不会将控制权交还给调用函数的,而是抛出异常把控制权交给web服务器。
?关于狗书的学习,今天就先学Flask框架的一些设计理念部分,待续未完,敬请期待~~~
相关推荐
- 十分钟让你学会LNMP架构负载均衡(impala负载均衡)
-
业务架构、应用架构、数据架构和技术架构一、几个基本概念1、pv值pv值(pageviews):页面的浏览量概念:一个网站的所有页面,在一天内,被浏览的总次数。(大型网站通常是上千万的级别)2、u...
- AGV仓储机器人调度系统架构(agv物流机器人)
-
系统架构层次划分采用分层模块化设计,分为以下五层:1.1用户接口层功能:提供人机交互界面(Web/桌面端),支持任务下发、实时监控、数据可视化和报警管理。模块:任务管理面板:接收订单(如拣货、...
- 远程热部署在美团的落地实践(远程热点是什么意思)
-
Sonic是美团内部研发设计的一款用于热部署的IDEA插件,本文其实现原理及落地的一些技术细节。在阅读本文之前,建议大家先熟悉一下Spring源码、SpringMVC源码、SpringBoot...
- springboot搭建xxl-job(分布式任务调度系统)
-
一、部署xxl-job服务端下载xxl-job源码:https://gitee.com/xuxueli0323/xxl-job二、导入项目、创建xxl_job数据库、修改配置文件为自己的数据库三、启动...
- 大模型:使用vLLM和Ray分布式部署推理应用
-
一、vLLM:面向大模型的高效推理框架1.核心特点专为推理优化:专注于大模型(如GPT-3、LLaMA)的高吞吐量、低延迟推理。关键技术:PagedAttention:类似操作系统内存分页管理,将K...
- 国产开源之光【分布式工作流调度系统】:DolphinScheduler
-
DolphinScheduler是一个开源的分布式工作流调度系统,旨在帮助用户以可靠、高效和可扩展的方式管理和调度大规模的数据处理工作流。它支持以图形化方式定义和管理工作流,提供了丰富的调度功能和监控...
- 简单可靠高效的分布式任务队列系统
-
#记录我的2024#大家好,又见面了,我是GitHub精选君!背景介绍在系统访问量逐渐增大,高并发、分布式系统成为了企业技术架构升级的必由之路。在这样的背景下,异步任务队列扮演着至关重要的角色,...
- 虚拟服务器之间如何分布式运行?(虚拟服务器部署)
-
在云计算和虚拟化技术快速发展的今天,传统“单机单任务”的服务器架构早已难以满足现代业务对高并发、高可用、弹性伸缩和容错容灾的严苛要求。分布式系统应运而生,并成为支撑各类互联网平台、企业信息系统和A...
- 一文掌握 XXL-Job 的 6 大核心组件
-
XXL-Job是一个分布式任务调度平台,其核心组件主要包括以下部分,各组件相互协作实现高效的任务调度与管理:1.调度注册中心(RegistryCenter)作用:负责管理调度器(Schedule...
- 京东大佬问我,SpringBoot中如何做延迟队列?单机与分布式如何做?
-
京东大佬问我,SpringBoot中如何做延迟队列?单机如何做?分布式如何做呢?并给出案例与代码分析。嗯,用户问的是在SpringBoot中如何实现延迟队列,单机和分布式环境下分别怎么做。这个问题其实...
- 企业级项目组件选型(一)分布式任务调度平台
-
官网地址:https://www.xuxueli.com/xxl-job/能力介绍架构图安全性为提升系统安全性,调度中心和执行器进行安全性校验,双方AccessToken匹配才允许通讯;调度中心和执...
- python多进程的分布式任务调度应用场景及示例
-
多进程的分布式任务调度可以应用于以下场景:分布式爬虫:importmultiprocessingimportrequestsdefcrawl(url):response=re...
- SpringBoot整合ElasticJob实现分布式任务调度
-
介绍ElasticJob是面向互联网生态和海量任务的分布式调度解决方案,由两个相互独立的子项目ElasticJob-Lite和ElasticJob-Cloud组成。它通过弹性调度、资源管控、...
- 分布式可视化 DAG 任务调度系统 Taier 的整体流程分析
-
Taier作为袋鼠云的开源项目之一,是一个分布式可视化的DAG任务调度系统。旨在降低ETL开发成本,提高大数据平台稳定性,让大数据开发人员可以在Taier直接进行业务逻辑的开发,而不用关...
- SpringBoot任务调度:@Scheduled与TaskExecutor全面解析
-
一、任务调度基础概念1.1什么是任务调度任务调度是指按照预定的时间计划或特定条件自动执行任务的过程。在现代应用开发中,任务调度扮演着至关重要的角色,它使得开发者能够自动化处理周期性任务、定时任务和异...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- MVC框架 (46)
- spring框架 (46)
- 框架图 (58)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- laravel框架 (46)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- java日志框架 (61)
- JAVA集合框架 (47)
- grpc框架 (55)
- ppt框架 (48)
- 内联框架 (52)
- winform框架 (46)
- gui框架 (44)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)