1.搭建环境

1.1 下载虚拟环境

# 下载虚拟环境工具
pip install pipenv
# 安装虚拟环境
pipenv install
# 查看当前已安装的python包
pip list
# 进入pipenv虚拟环境
pipenv shell
# 安装虚拟环境中的包
pipenv install flask
# 卸载虚拟环境中的包
pipenv uninstall flask
# 已安装包的依赖关系
pipenv graph
# 查看虚拟环境目录
pipenv --venv
# 退出虚拟环境
exit

2.flask入门

2.1 第一个flask应用

from flask import Flask
​
app = Flask(__name__)
app.run()

2.2 flask基本接口

from flask import Flask
​
app = Flask(__name__)
@app.route('/')
def index():
    return 'Helloworld'
​
app.run()

from flask import Flask
​
app = Flask(__name__)
@app.route('/<name>')
def index(name):
    return name
​
app.run()

2.3 唯一URL原则

前文知晓,一个路由对应一个资源,而在flask中/demo/demo对于的两个不同的页面,为了兼容更多的用户习惯,通常会将他们展示同样的内容,对于搜索引擎爬虫SEO和网站资源消耗是非常不利的,所以通常会将路由进行/闭合,这样让http://127.0.0.1/demohttp://127.0.0.1/demo都得到有效的支持

from flask import Flask
​
app = Flask(__name__)
@app.route('/demo')
def index():
    return "你好!这是我的第一个flask项目"
​
app.run()

http://127.0.0.1/demo`会进行重定向到`http://127.0.0.1/demo/
from flask import Flask
​
app = Flask(__name__)
@app.route('/demo/')
def index():
    return "你好!这是我的第一个flask项目"
​
app.run()

2.4 flask调试模式

在使用pycharm编写flask代码的时候,只需要在启动代码处添加app.run(debug=True)开启调试模式,然后重新运行一次flask,pycharm就会在我们每次修改代码的时候进行重新启动,不需要进行手动刷新了

开启调试模式还有一个好处,会将错误显示在详细的显示在网页中

from flask import Flask
​
app = Flask(__name__)
@app.route('/test')
def index():
    asd # 故意报的错
    return "开启了调试模式"
​
app.run(debug=True)

2.5 设置路由的第二种方式

这种方式一般适用于基于类的视图(即插视图)的路有注册

from flask import Flask
​
app = Flask(__name__)
def index():
    return "开启了调试模式"
​
app.add_url_rule("/",view_func=index) # 将/路径指向视图index
​
app.run(debug=True)

实际上@app.route('/')就是调用的app.add_url_rule("/",view_func=index)

route的源码

    @setupmethod
    def route(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]:
        def decorator(f: T_route) -> T_route:
            endpoint = options.pop("endpoint", None)
            self.add_url_rule(rule, endpoint, f, **options)
            return f
​
        return decorator

2.6 flask启动方法

前文已知,app.run()是启动flask的方法,但它只监听127.0.0.1也就是本地地址,并且他也有非常多的模式和参数

# 开启调试模式
app.run(debug=True)
# 监听某个地址
app.run(host="10.151.0.145",debug=True) # 只监听10.151.0.145了(不推荐)
app.run(host="0.0.0.0") # 监听全部
# 更换监听端口
app.run(host="0.0.0.0",port=81,debug=True)

2.7 配置文件

部署的基本原则是开发环境源代码和部署环境源代码是镜像关系,所以其实不建议将例如debug=True的信息直接写在文件中,这时就可以用到配置文件

配置文件的名字不是固定的,但约定俗成的叫做config.py,通常建议配置文件中的参数全部大写

config.py

DEBUG = True

Fisher.py(模块方式导入配置文件)

from flask import Flask
from config import DEBUG # 倒入配置文件
​
app = Flask(__name__)
@app.route('/')
def index():
    return "开启了调试模式"
​
app.run(host="0.0.0.0",port=81,debug=DEBUG) # 使用配置文件

Fisher.py(flask方法导入配置文件)

from flask import Flask
​
import config
​
app = Flask(__name__)
# 读取配置文件
app.config.from_object(config) # 这里倒入的是模块路径
@app.route('/')
def index():
    return "开启了调试模式"
​
app.run(host="0.0.0.0",port=81,debug=app.config["DEBUG"]) # 字典一样使用配置文件

需要注意的是:Flask规定,如果使用app.config.from_object(config)载入配置,要求配置文件中全部为常量,也就是说全部为大写,否则会直接忽略掉常量,忽略掉的结果就是在fisher.py调用的时候因为找不到值直接报错。

如果配置中没有明确DEBUG = True,但直接调用了app.run(host="0.0.0.0",port=81,debug=app.config["DEBUG"]),不会报错而是False的原因是,在flask系统中默认将DEBUG识别为一个内置常量,他的默认值就是False

2.8 if __name__的作用

在前序文档中,详细诸位对if __name__不会感到陌生,他通常if __name__ == "__main__"进行连用,将启动文件写在判断中,确保系统通过其他模块或程序加载的时候,不会导致冲突,在flask中,生产环境通常是以nginx搭配uwsgi进行部署,而不是直接调用app.run,因此也需要通过此方法来避免冲突

if __name__ == "__main__":
    app.run(host="0.0.0.0",port=81,debug=app.config["DEBUG"])

2.9 响应对象:Response

视图函数与普通函数,在写法上只是一个路由的区别,但是flask会做很多很多的事情,例如会添加返回状态码status code:200、会添加content-type组成http的头部,默认的content-type = text/html,所以return其实默认应该返回的是html页面,他所做的所有事情,成为Response

from flask import Flask
​
import config
​
app = Flask(__name__)
# 读取配置文件
app.config.from_object(config) # 这里倒入的是模块路径
@app.route('/')
def index():
    return "<html><h1>这是一个html页面</h1></html>"
​
​
if __name__ == "__main__":
    app.run(host="0.0.0.0",port=81,debug=app.config["DEBUG"]) # 字典一样使用配置文件

我们在视图函数中可以修改这部分的内容

from flask import Flask,make_response # flask提供创建response的对象
​
import config
​
app = Flask(__name__)
# 读取配置文件
app.config.from_object(config) # 这里倒入的是模块路径
@app.route('/')
def index():
    headers = {
        'Content-Type': 'text/plain; charset=utf-8'
    } # 设置响应头
    response = make_response("<html><h1>这是一个html页面</h1></html>",404) # 创建response对象
    response.headers = headers # 设置响应头
    return response # 返回response对象
​
if __name__ == "__main__":
    app.run(host="0.0.0.0",port=81,debug=app.config["DEBUG"]) # 字典一样使用配置文件

除了30x跳转,其他的状态码,不会对页面有任何的影响,不会造成状态码404哪怕返回html,也不显示页面的情况

跳转案例,访问页面跳转到百度

from flask import Flask,make_response # flask提供创建response的对象
​
import config
​
app = Flask(__name__)
# 读取配置文件
app.config.from_object(config) # 这里倒入的是模块路径
@app.route('/')
def index():
    headers = {
        'Content-Type': 'text/plain; charset=utf-8',
        'location': 'http://www.baidu.com'
    } # 设置响应头
    response = make_response("<html><h1>这是一个html页面</h1></html>",301) # 创建response对象
    response.headers = headers # 设置响应头
    return response # 返回response对象
​
if __name__ == "__main__":
    app.run(host="0.0.0.0",port=82,debug=app.config["DEBUG"]) # 字典一样使用配置文件