问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

python flask 怎么组织程序

发布网友 发布时间:2022-04-23 05:28

我来回答

1个回答

热心网友 时间:2022-04-10 06:26

1.初始化

所有的flask程序都必须创建一个程序实例

web服务器使用wsgi接口协议,把接收客户端的请求都转发给这个程序实例来进行处理。这个程序实例就是flask对象

from flask import Flask
app = Flask(__name__)
#__name__决定程序的根目录,以便以后能找到相对于程序根目录的资源文件位置


2.路由和视图函数

程序实例需要知道接收请求后,需要知道url请求应该运行哪些代码。所以保存了一个url和python函数的映射关系;这个映射关系就叫做路由

flask程序中路由的写法:

2.1#使用app.route装饰器,把修饰的函数注册为路由。例如

@app.route('/')def index():    return "<h1>Hello World</h1>"

#函数的名字不是必须写index的,只是和装饰器关联的时候写的函数名而已

#把index函数注册为程序根路径的处理程序。函数的返回值称为响应,是客户端接收的内容。

像index这样的函数称为试图函数,试图函数返回的响应可以是包含html的简单字符串,也可以是复杂的东西

2.2#可变url部分映射,使用特定的装饰器语法就可以

@app.route('/user/<name>')def user(name):    return "<h1>hello %s</h1>"%(name)

装饰器中的<name>指定可变内容为name,name对user(name)函数中的传递参数,这2个部分内容必须一致

调用试图函数时候,flask会自动的将动态部分作为参数传入参数,这个函数中,参数用于生成个人的欢迎信息

#备注:路由中的动态部分默认使用字符串类型,可以使用int,float,path来定义;例如<int:id>;path类型也是字符串,但不把斜线视作分隔符,而将其当做动态片段的一部分

3.启动服务器

调用程序实例app的run方法启动flask集成开发的web服务器

if __name__ == "__main__":
app.run(debug=True)

debug=True代表的是调试模式,这个flask自带的run方法开启的服务器不适合在生产中使用,此处只用来测试

4.一个完整的Flask程序

啥也不说,先上例子hello.py

from flask import Flask
app = Flask(__name__)

@app.route('/')def index():    return '<h1>HelloWorld</h1>'@app.route('/user/<name>')def user(name):    return "<h1>hello %s</h1>"%nameif __name__ == "__main__":
app.run(debug=True)

默认会开启服务器本机5000端口;127.0.0.1:5000

执行脚本python hello.py

浏览器测试http://127.0.0.1:5000/

http://127.0.0.1:5000/user/xiao

5.请求上下文

Flask使用请求上下文,临时把某些对象变为全局可用;例如

from flask import request

@app.route('/')def index():
user_agent = request.headers.get('User-Agent')    return '<h1>your browser is %s</h1>'%(user_agent)

在这个视图函数中,我们把request当做全局变量使用,flask使用请求上下文让特定的变量在一个线程中全局可访问。于此同时却不会干扰其他线程

session:请求上下文;用户会话,用于存储请求之间需要“记住”的值的词典

激活请求上下文的后就可以使用request和session变量了

6.程序上下文

current_app:程序上下文;当前激活程序的程序实例

g:程序上下文;处理请求时用作临时存储的对象

7.请求映射关系表

接收请求,处理请求,,,之间有个映射表,要不然不知道该去执行什么代码。URL映射

from hello import appprint app.url_map

Map([<Rule '/' (HEAD, OPTIONS, GET) -> index>,
<Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>,
<Rule '/user/<name>' (HEAD, OPTIONS, GET) -> user>])

8.请求钩子

有的时候在处理请求之前和之后,执行某些特定的代码是很有用的,这就用到了请求钩子

例如在请求之前创建数据库连接或者redis连接;或者是系统里面用户请求处理之前先验证用户的身份,是否激活,激活执行什么操作,没激活用户一直绑到固定页面去直到激活

为了避免每个试图函数中都使用重复的代码,flask提供了注册通用函数的功能;

也就是说只要写一个请求钩子-函数,整个程序实例全局都被应用了。

例如:在所有请求之前先验证下用户的认证状态

@before_app_requestdef before_request():    if current_user.is_authenticated:
current_user.ping()        if not current_user.confirmed and request.endpoint[:5] != 'auth.' and request.endpoint != 'static':            return redirect(url_for('auth.unconfirmed'))

常见的4种钩子:

before_first_request:注册一个函数,在处理第一个请求之前运行

before_request:注册一个函数,每次请求之前运行

after_request:注册一个函数,没有未处理的异常抛出,每次请求之后运行

teardown_request:注册一个函数,有未处理的异常抛出,每次请求之后运行

在请求钩子和视图函数之间共享数据一般使用程序上下文g;

例如before_request处理程序可以从数据库中加载已登录用户,将其保存到g.user中,随后调用试图函数,试图函数再从g.user中获取用户

9.基于Flask的http响应

flask调用试图函数处理请求,并把返回值作为响应的内容.大多情况下是一个简单的字符串或者json字符串;返回字符串常用于给对方提供接口的时候使用

http响应中很重要的一个内容是状态码,flask默认设置为200,这个代码表明请求已经被成功处理了

如果试图函数返回的响应需要不同的状态码,可以把状态码加到后面返回

例如

@app.route('/')def index():    return '<h1>Bad Request</h1>',400

试图函数返回的响应还可以接受第三个参数,第三个参数是一个字典类型的首部,可以添加到http响应中去,一般不用添加

如果不想返回这种好多个元素的元祖,可以使用Response对象来标准化下返回。

例如:创建一个响应对象,然后设置cookie

from flask import make_response

@app.route('/')def index():
response = make_response('<h1>This document carries a cookie!</h1>')
response.set_cookie('answer',42)    return response

还有一种特殊的响应类型,flask提供了一种基于302的跳转响应,这个响应由redirect函数来提供。指向的地址由Location首部提供,重定向的响应可以使用3个值形式的返回值生成。也可以再Response对象中设定

例如:

from flask import redirect

@app.route('/')def index():    return redirect('htmple.com')

还有一种特殊的响应类型,flask提供了一种错误响应。这个由abort函数来提供。abort抛出404异常,抛出异常后把控制权移交给web服务器

例如:

from flask import abort

@app.route('/user/<id>')def get_user(id):
user = load_user(id)    if not user:
abort(404)    return '<h1>Hello,%s</h1>'%(user.name)

10.flask的扩展flask-script

这个例子主要是讲如何把flask扩展添加到程序中,并使用

例如下面你的例子是添加flask-script扩展,使用命令行参数增强程序的功能

使用命令行方式启动web服务器,而不是修改文件,给run方法传递参数

安装扩展

pip install flask-script

使用flask-script扩展,并把hello.py文件改为命令行参数启动的形式#添加的扩展默认会安装到flask.ext命名空间中

from flask import Flaskfrom flask.ext.script import Manager

app = Flask(__name__)
manager = Manager(app)

@app.route('/')def index():    return '<h1>HelloWorld</h1>'@app.route('/user/<name>')def user(name):    return "<h1>hello %s</h1>"%nameif __name__ == "__main__":
manager.run()

flask-script扩展中添加了一个Manager的类,以上例子中,这个扩展初始化的方法是,把程序实例作为参数传递给构造函数来初始化主类的实例。后续其他flask扩展也基本是这个套路

这样修改之后,程序就可以使用一组基本的命令行选项来启动和调试了

python hello.py shell#在flask应用上下文环境中运行python shell,方便测试和调试web环境
python hello.py runserver#运行flask开发服务器,app.run()
python hello.py -h#显示帮助信息
python hello.py runserver --help

usage: hello.py runserver [-h] [-t HOST] [-p PORT] [--threaded]
[--processes PROCESSES] [--passthrough-errors] [-d]
[-r]

python hello.py runserver -h 0.0.0.0 -p 80#这样就开启了本机的80端口,别的机器可以远程访问了

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
立秋后钓鱼什么风向好-立秋钓鱼风向怎么选 赱乂砉込儬 怎么读 "赱"读什么? 解决电脑无法搜索到iPhone热点的问题如何修复iPhone热点无法在电脑上显... 电脑搜不到iphone12热点 iphone开热点给电脑搜不到 国企的地产有哪些 国企下设公司是什么意思? 红加蓝加绿是什么色. 梦幻西游75级开三倍抓鬼一轮有多少经验 微信开直播怎么向客人收钱 flask 是做什么的 微信直播里付款,报警钱还要的回来吗 Flask框架怎么样,比起Web.py有哪些不同 微信直播平台的钱是先付在哪儿 python flask怎么读 我购买的微信付费直播回放可以删除吗? 如何学习flask 【Python基础】flask框架是用来干什么的? 微信直播连麦充费什么意思 flask框架有什么用? 如何理解Flask 跨国电商在微信开直播收取费用是真是假 【Python基础】flask是什么意思? 直播间购买东西微信支付老支付不成功什么原因? 直播间直播的时候在微信付款买的东西不给退怎么办 关于诚信的书 快手直播在微信付款违规吗 关于诚信、孝敬、立志、读书的名言警句 抖音直播微信付款可靠吗 flask是什么意思 为什么 Flask 有那么多的好评 使用flask开发的网站有哪些 如何部署简单python + flask应用 我win7系统,有网但连不上 梦见周围都是鬼魂,自己想逃却逃不出来 梦到周围一片漆黑害怕 经常梦见周围环境特别的昏暗,看不清楚东西我努力的睁大眼睛想看清。还有... 华为mate30pro手电筒快捷键? 做梦梦见周围的楼房接二连三爆炸了是怎么回事? 榛子仁的做法大全 自己在家怎么炒榛子仁 做梦梦见周围的场景一直在转圈。这是怎么回事? hinova9锁屏电筒怎么关 C语言中,输出字符的格式是什么? 孩子很喜欢吃榛子,如何用榛子制作各种美食呢? 梦见周围全都是死人,这说明啥? C语言怎么用printf输出字符串。 梦见周围树一切都有雪 晚上梦见自己的周围都是蛇预示着什么?