Flask框架基础入门

Flask是一个非常小的PythonWeb框架,被称为微型框架;只提供了一个稳健的核心,其他功能全部是通过扩展实现的;意思就是我们可以根据项目的需要量身定制,也意味着我们需要学习各种扩展库的使用。

1)路由route的创建

通过创建路由并关联函数,实现一个基本的网页:
from flask import Flask
# 用当前脚本名称实例化Flask对象,方便flask从该脚本文件中获取需要的内容
app = Flask(__name__)
#程序实例需要知道每个url请求所对应的运行代码是谁。
#所以程序中必须要创建一个url请求地址到python运行函数的一个映射。
#处理url和视图函数之间的关系的程序就是"路由",在Flask中,路由是通过@app.route装饰器(以@开头)来表示的
@app.route("/")
#url映射的函数,要传参则在上述route(路由)中添加参数申明
# 启动一个本地开发服务器,激活该网页
app.run()


通过路由的methods指定url允许的请求格式:
#methods参数用于指定允许的请求格式
#常规输入url的访问就是get方法
@app.route("/hello",methods=['GET','POST'])
def hello():
return "Hello World!"
通过路由在url内添加参数,其关联的函数可以接收该参数:
# 可以在路径内以/<参数名>的形式指定参数,默认接收到的参数类型是string
@app.route("/index/<int:id>",)

2)endpoint的作用
说明:每个app中都存在一个url_map,这个url_map中包含了url到endpoint的映射;
作用:当request请求传来一个url的时候,会在url_map中先通过rule找到endpoint,然后再在view_functions中根据endpoint再找到对应的视图函数view_func
# endpoint默认为视图函数的名称
# 我们也可以在路由中修改endpoint(当视图函数名称很长时适用)
# 相当于为视图函数起别名
@app.route('/hello',endpoint='our_set')
可以通过view_functions查看到当前endpoint与视图函数的对应情况;
可以通过url_map查看当前url与endpoint的绑定情况;
值得注意的是,endpoint相当于给url起一个名字,view_functions内存储的就是url的名字到视图函数的映射,且endpoint在同一个蓝图下也不能重名:
通过view_functions可以看到,即使修改endpoint为其他视图函数名,依然是绑定其正下方的视图函数,说明endpoint作用于url

3)request对象的使用
什么是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;
一般用于检验用户权限、请求是否合法等场景;
@app.route('/')
def hello_world():
return 'Hello World!'

@app.before_request
def before_request_a():
print('I am in before_request_a')

before_first_request:与before_request的区别是,只在第一次请求之前调用;
该钩子函数表示第一次请求之前可以执行的函数;
执行顺序同样也是先绑定的先执行;

after_request:每一次请求之后都会调用;
该钩子函数表示每一次请求之后,可以执行某个特定功能的函数,这个函数接收response对象,所以执行完后必须归还response对象;
执行的顺序是先绑定的后执行;
被触发的前提是没有异常抛出,或者异常被 errorhandler捕获并处理;
一般可以用于产生csrf_token验证码等场景;

teardown_request:每一次请求之后都会调用;
该钩子函数接收一个参数,该参数是服务器出现的错误信息;
执行顺序也是先绑定的后执行;
只有在请求上下文被 pop 出请求栈的时候才会直接跳转到teardown_request;
所以在被正常调用之前,即使某次请求有抛出错误,该请求也都会被继续执行, 并在执行完后返回 response;

5)redirect重定向
什么是redirect重定向?
在flask 中,重定向是通过flask.redirect(location, code=302)这个函数来实现的,location表示需要重定向的url, 应该配合url_for函数来使用, code表示采用哪个重定向,默认是302,即临时性重定向, 可以修改为301来实现永性重定向;
# redirect重定位(服务器向外部发起一个请求跳转)到一个url界面;
# url_for给指定的函数构造 URL;
# return redirect('/hello') 不建议这样做,将界面限死了
return redirect(url_for('hello'))

6)返回json数据给前端
方法一:
使用:make_response方法和json库共同完成
# 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
方法二:
使用:jsonify库实现,减少代码行数
from flask import Flask,jsonify
return jsonify(data)

7)abort函数的使用
什么是abort()?
使用类似于python中的raise函数,可以在需要退出请求的地方抛出错误,并结束该请求;
我们可以使用errorhandler()装饰器来进行异常的捕获与自定义:
abort(404)
return None
# 自定义错误处理方法,将404这个error与Python函数绑定
# 当需要抛出404error时,将会访问下面的代码

自定义的404界面:
<!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)后,参数一就必须使用"蓝图模块名.视图名",因为不同蓝图下的视图函数可以重名。

posted @ 2024-04-22 15:35  WDS望尘  阅读(5)  评论(0编辑  收藏  举报