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/demo
和http://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
,通常建议配置文件中的参数全部大写
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"]) # 字典一样使用配置文件