在此记录Python Flask学习过程中的知识点,易忘记点,中间也会记录一些小的Python技巧及知识。
本文章根据慕课网七月老师的Python Flask高级编程课程,梳理课程中的知识点,供大家参考。
MVC模式
MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。
"C"在其他语言中叫控制器,在flask中叫做视图函数
基于类的视图,在flask中又名即插视图
简单的flask demo,新建文件demo.py
import json
from flask import Flask
app = Flask(__name__)
@app.route("/hello/")
def hello():
return "hello"
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True, port=81)
运行demo.py , 在浏览器中键入地址127.0.0.1:81/hello,可看到结果输出hello
上图代码中,定义了一个视图函数hello,并且在app.run设置为调试模式(debug)。
细心的同学可发现在试图函数上方的路由注册中明明是前后都有反斜杠@app.route("/hello/")
,可为什么在浏览器输入127.0.0.1:81/hello
不加后边的反斜杠就可以呢,是因为flask实质是把不带斜杠的url重定向到带斜杠的url上。
为什么flask要这么做?
唯一url原理便于SEO(搜索引擎优化),这里不讲SEO是什么,给出链接可自己查询
Flask配置文件
在开发环境中,在生产线上的代码是绝对不允许使用debug模式的,而上图中的代码把debug硬编码在代码中,这种方法极其不合适,正确的做法应该写在配置文件中,这样我们只需要更改配置文件即可,不用改动代码。
新建文件config.py
DEBUG = True
更改demo.py文件
import json
from flask import Flask
app = Flask(__name__)
# 把自定义的config.py配置文件合并到flask配置文件中
app.config.from_object("config")
@app.route("/hello/")
def hello():
return "hello"
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=app.config['DEBUG'], port=81)
flask配置文件中的变量要求全部大写,例如DEBUG = True
。
Flask路由注册
在Flask中有两种路由注册的方法,
@app.route("/hello/")
app.add_url_rule("/hello/", view_func=hello)
第一种是最为便捷的,采用python语言的装饰器来做路由注册,直接给视图函数增加装饰器即可。
第二种也可以达到路由注册的目的,view_func参数指定视图函数。
其实两种方式本质上都是通过app.add_url_rule("/hello/", view_func=hello)
这种方式实现的,只不过第一种方法在装饰器内部Flask自己调用了app.add_url_rule("/hello/", view_func=hello)
,可查看app.py源码:
if name == "main"在Flask的含义
相信大家都知道if __name__ == "__main__"
一个python的文件有两种使用的方法,第一是直接作为脚本执行,第二是import到其他的python脚本中被调用(模块重用)执行。因此if name == 'main': 的作用就是控制这两种情况执行代码的过程,在if name == 'main': 下的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而import到其他脚本中是不会被执行的。
在Flask中,一般生产环境使用 nginx+uwsgi 作为 flask 自带的web服务器,使用if __name__ == "__main__"
判断,避免在生产环境中启动flask自带的web服务器。
视图函数的返回值
通常Flask视图函数返回的都是response对象,
使用Flask的make_response方法制造response对象,
from flask import Flask, make_response
@app.route("/hello/")
def hello():
headers = {
"content-type": "text/plain"
}
response = make_response("<html></html>", 200)
response.headers = headers
return response
但是,
通常不需要上边make_response,直接:
@app.route("/hello/")
def hello():
headers = {
"content-type": "text/plain"
}
return "<html></html>", 200, headers
上边代码表示返回三个值,分别是一个<html></html>字符转,200状态码,和header
在python中如果return 多个值 视为返回一个元组,Flask会默认调用make_response来转换,本质还是通过make_response。
这里我们设置的200状态码和返回的内容无关,只是一个标识
另外,
web (视图函数)返回的本质都是字符串,通过content-type来控制返回的字符串转换为需要值,例如:
"contentType":"application/json" (转换为json返回)
"contentType": "text/plain" (转换为文本返回)
"contentType": "text/html" (转换为html返回)
以上内容如果对大家有帮助记得点个赞哦。感谢