赞
踩
Flask
是一个非常小的Python Web
框架,被称为微型框架;只提供了一个稳健的核心,其他功能全部是通过扩展实现的;意思就是我们可以根据项目的需要量身定制,也意味着我们需要学习各种扩展库的使用。
1)安装: pip install flask
2)组成:WSGI
系统、调试、路由
3)模板引擎:Jinja2
4)使用到装饰器:以@
开头的代码方法
Flask
基础入门route
的创建:route
装饰器详解通过创建路由并关联函数,实现一个基本的网页:
from flask import Flask # 用当前脚本名称实例化Flask对象,方便flask从该脚本文件中获取需要的内容 app = Flask(__name__) #程序实例需要知道每个url请求所对应的运行代码是谁。 #所以程序中必须要创建一个url请求地址到python运行函数的一个映射。 #处理url和视图函数之间的关系的程序就是"路由",在Flask中,路由是通过@app.route装饰器(以@开头)来表示的 @app.route("/") #url映射的函数,要传参则在上述route(路由)中添加参数申明 def index(): return "Hello World!" # 直属的第一个作为视图函数被绑定,第二个就是普通函数 # 路由与视图函数需要一一对应 # def not(): # return "Not Hello World!" # 启动一个本地开发服务器,激活该网页 app.run()
点击Running on
对应的链接即可跳转到url
,路由为默认的@app.route("/")
,所以无需调整。返回结果为"Hello World!"
。
* Serving Flask app '__main__' (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [28/Apr/2024 20:46:02] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [28/Apr/2024 20:46:03] "GET /favicon.ico HTTP/1.1" 404 -
methods
指定url
允许的请求格式:from flask import Flask
app = Flask(__name__)
#methods参数用于指定允许的请求格式
#常规输入url的访问就是get方法
@app.route("/hello",methods=['GET','POST'])
def hello():
return "Hello World!"
#注意路由路径不要重名,映射的视图函数也不要重名
@app.route("/hi",methods=['POST'])
def hi():
return "Hi World!"
app.run()
默认路由是无法访问的,因为这次两次函数指定路由分别为"/hello"
和"/hi"
指定对应的路由之后就可以成功访问
但是对于只接受POST请求的函数,直接访问会报错:Method Not Allowed
url
内添加参数,其关联的函数可以接收该参数:以下为框架自带的转换器,可以置于参数前将接收的参数转化为对应类型
string | 接受任何不包含斜杠的文本 |
int | 接受正整数 |
float | 接受正浮点数 |
path | 接受包含斜杠的文本 |
pip install werkzeug
)from werkzeug.routing import BaseConverter #导入转换器的基类,用于继承方法 from flask import Flask app = Flask(__name__) # 自定义转换器类 class RegexConverter(BaseConverter): def __init__(self,url_map,regex): # 重写父类定义方法 super(RegexConverter,self).__init__(url_map) self.regex = regex def to_python(self, value): # 重写父类方法,后续功能已经实现好了 print('to_python方法被调用') return value # 将自定义的转换器类添加到flask应用中 # 具体过程是添加到Flask类下url_map属性(一个Map类的实例)包含的转换器字典属性中 app.url_map.converters['re'] = RegexConverter # 此处re后括号内的匹配语句,被自动传给我们定义的转换器中的regex属性 # value值会与该语句匹配,匹配成功则传达给url映射的视图函数 @app.route("/index/<re('1\d{10}'):value>") def index(value): print(value) return "Hello World!" if __name__=='__main__': app.run(debug=True)
to_python方法被调用
12345678901
2)endpoint
的作用
说明:每个app
中都存在一个url_map
,这个url_map
中包含了url
到endpoint
的映射;
作用:当request
请求传来一个url
的时候,会在url_map
中先通过rule
找到endpoint
,然后再在view_functions
中根据endpoint
再找到对应的视图函数view_func
from flask import Flask app = Flask(__name__) # endpoint默认为视图函数的名称 @app.route('/test') def test(): return 'test success!' # 我们也可以在路由中修改endpoint(当视图函数名称很长时适用) # 相当于为视图函数起别名 @app.route('/hello',endpoint='our_set') def hello_world(): return 'Hello World!' if __name__ == '__main__': print(app.view_functions) print(app.url_map) app.run()
{'static': <function Flask.__init__.<locals>.<lambda> at 0x000001F7AFE2BC70>, 'test': <function test at 0x000001F7AFE70D30>,
'our_set': <function hello_world at 0x000001F7AFE70DC0>}
Map([<Rule '/static/<filename>' (GET, HEAD, OPTIONS) -> static>,
<Rule '/test' (GET, HEAD, OPTIONS) -> test>,
<Rule '/hello' (GET, HEAD, OPTIONS) -> our_set>])
* Serving Flask app 'test'
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on http://127.0.0.1:5000
3)request
对象的使用
render_template()
:可以用于呈现一个我们编写的html
文件模板
request.method
用于获取url
接收到的请求方式,以此返回不同的响应页面
#request:包含前端发送过来的所有请求数据 from flask import Flask,render_template,request # 用当前脚本名称实例化Flask对象,方便flask从该脚本文件中获取需要的内容 app = Flask(__name__) @app.route("/",methods=['GET','POST']) #url映射的函数,要传参则在上述route(路由)中添加参数申明 def index(): if request.method == 'GET': # 想要html文件被该函数访问到,首先要创建一个templates文件,将html文件放入其中 # 该文件夹需要被标记为模板文件夹,且模板语言设置为jinja2 return render_template('index.html') # 此处欲发送post请求,需要在对应html文件的form表单中设置method为post elif request.method == 'POST': name = request.form.get('name') password = request.form.get('password') return name+" "+password if __name__=='__main__': app.run()
4)请求钩子before/after_request
想要在正常执行的代码的前、中、后时期,强行执行一段我们想要执行的功能代码,便要用到钩子函数——用特定装饰器装饰的函数。
下面将介绍Flask
内,四种常用的钩子:
before_request
:在每一次请求之前调用;
该钩子函数表示每一次请求之前,可以执行某个特定功能的函数;
执行顺序是先绑定的先执行;
并且先执行 flask
app
的 before_request
, 再执行 blueprint
的 before_request
;
一般用于检验用户权限、请求是否合法等场景;
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World!' @app.before_request def before_request_a(): print('I am in before_request_a') @app.before_request def before_request_b(): print('I am in before_request_b') if __name__ == '__main__': app.run()
* Serving Flask app '__main__' (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [29/Apr/2024 11:07:53] "GET / HTTP/1.1" 200 -
I am in before_request_a
I am in before_request_b
before_first_request
:与before_request
的区别是,只在第一次请求之前调用;# 代码替换视图函数hello_world后,if main前
@app.before_first_request
def teardown_request_a():
print('I am in teardown_request_a')
@app.before_first_request
def teardown_request_b():
print('I am in teardown_request_b')
after_request
:每一次请求之后都会调用;response
对象,所以执行完后必须归还response
对象;errorhandler
捕获并处理;csrf_token
验证码等场景;# 代码替换视图函数hello_world后,if main前
@app.after_request
def after_request_a(response):
print('I am in after_request_a')
# 该装饰器接收response参数,运行完必须归还response,不然程序报错
return response
@app.after_request
def after_request_b(response):
print('I am in after_request_b')
return response
teardown_request
:每一次请求之后都会调用;pop
出请求栈的时候才会直接跳转到teardown_request
;response
;# 代码替换视图函数hello_world后,if main前
@app.teardown_request
def teardown_request_a(exc):
print('I am in teardown_request_a')
@app.teardown_request
def teardown_request_b(exc):
print('I am in teardown_request_b')
5)redirect
重定向
在flask
中,重定向是通过flask.redirect(location, code=302)
这个函数来实现的,location
表示需要重定向的url
, 应该配合url_for
函数来使用, code
表示采用哪个重定向,默认是302
,即临时性重定向, 可以修改为301
来实现永性重定向;
from flask import Flask,redirect,url_for app = Flask(__name__) @app.route('/index') def index(): # redirect重定位(服务器向外部发起一个请求跳转)到一个url界面; # url_for给指定的函数构造 URL; # return redirect('/hello') 不建议这样做,将界面限死了 return redirect(url_for('hello')) @app.route('/hello') def hello(): return 'this is hello fun' if __name__ == '__main__': app.run()
6)返回json
数据给前端
方法一:
使用:make_response
方法和json
库共同完成
from flask import Flask,make_response,json app = Flask(__name__) @app.route("/index") def index(): data = { 'name':'张三' } # json.dumps 将一个python数据结构转化为json # json.dumps 序列化时对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False # 生成一个response响应对象,而不是直接return来返回响应对象,便于执行更多的后续操作 response = make_response(json.dumps(data,ensure_ascii=False)) # 修改数据的MIME标准类型为json(在发送数据前会先发送该类型) response.mimetype = 'application/json' return response if __name__=='__main__': app.run()
方法二:
使用:jsonify
库实现,减少代码行数
from flask import Flask,jsonify app = Flask(__name__) # 在Flask的config是一个存储了各项配置的字典 # 该操作是进行等效于ensure_ascii=False的配置 app.config['JSON_AS_ASCII'] = False @app.route("/index") def index(): data = { 'name':'张三' } return jsonify(data) if __name__=='__main__': app.run()
7)abort
函数的使用
使用类似于python
中的raise
函数,可以在需要退出请求的地方抛出错误,并结束该请求;
我们可以使用errorhandler
()装饰器来进行异常的捕获与自定义:
from flask import Flask,render_template,request,abort app = Flask(__name__) @app.route("/",methods=['GET','POST']) def index(): if request.method == 'GET': return render_template('index.html') elif request.method == 'POST': name = request.form.get('name') password = request.form.get('password') if name == 'zhangsan' and password == '123456': return 'login sucess' else: # abort的用法类似于python中的raise,在网页中主动抛出错误 abort(404) return None # 自定义错误处理方法,将404这个error与Python函数绑定 # 当需要抛出404error时,将会访问下面的代码 @app.errorhandler(404) def handle_404_error(err): # return "发生了错误,错误情况是:%s"%err # 自定义一个界面 return render_template('404.html') if __name__ == '__main__': app.run()
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!-- 注意图片文件需要放在一个静态文件夹static里 -->
<img src="../static/error404.jpg" alt="" width="1428px" height="57px">
</body>
</html>
8)url_for
实现反转
url_for
是实现url
反转的工具,即视图函数 → \rightarrow →url;
静态文件引入:url_for(‘static’, filename=‘文件路径’)
静态文件需要存储在当前工程下的static目录内。
定义路由:url_for
(‘模块名.视图名’,变量=参数)
参数一中的视图名实质指的是
endpoint
,url_map
中存储了url
到endpoint
的映射,只是默认情况下endpoint
与视图函数名相同;
如果在装饰器中修改了endpoint
,则url_for
只能使用endpoint
设置的名字来反转url
;
在单模块程序下我们可以省略模块名,但当使用了蓝图(buleprint
)后,参数一就必须使用"蓝图模块名.视图名",因为不同蓝图下的视图函数可以重名。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。