一. pipenv 安装虚拟环境
掌握pipenv的常用命令和使用步骤:
1. 可去官网查看使用详情 https://github.com/pypa/pipenv
2. 进入porject目录中
3. 安装pipenv pip install pipenv
4. 进入pipenv pipenv shell
5. 安装工具包 pipenv install flask
6. 退出pipenv exit
7. 查看安装包的依赖关系 pipenv graph
二. 开发工具推荐
1. Pycharm 或vscode
2. Xampp(MySQL)
3. Navicat(数据库可视化管理工具)
三. flask最小原型与唯一URL原则
from flask import Flask
app = Flask(__name__) # flask 实例化
@app.route('/hello/') # 结尾处加'/' 可以兼容'/hello' 和'/hello/'
def hello():
return 'Hello, cannon'
app.run()
flask是如何实现 兼容 'hello' 和‘hello/’ ? 其实是使用了重定向
重定向流程图:
我们在浏览器中输入
http://127.0.0.1:5000/hello
并检查,得到如下:
可以看到 先得到hello的301请求, 之后得到hello/的200请求。 我们接着点开hello查看
果然有location 到hello/
flask重定向的目的是为了保证唯一URL, 唯一URL则是为了让搜索引擎同一网页只能搜索到一次。 涉及到搜索的SEO优化问题, 先不展开。
四. 路由的另一种注册方法
除了装饰器app.route注册路由外, 还可以由app.add_url_route注册路由:
from flask import Flask
app = Flask(__name__)
# @app.route('/hello')
def hello():
return 'Hello, cannon'
app.add_url_rule('/hello', view_func=hello) # 同样完成路由注册
app.run(debug=True)
说明:
大部分情况推荐使用app.route的方式注册路由,
但如果使用类视图(插视图)的时候,需要用add_url_route注册路由。
(其实app.route 也是封装了add_url_route)
五. app.run相关参数与flask配置文件
app.run可以传入配置参数,如下fisher.py:
from flask import Flask
app = Flask(__name__)
@app.route('/hello')
def hello():
return 'Hello, cannon'
if __name__ == '__main__':
app.run(host='0.0.0.0', debug=True, port=80)
也可以新建config文件, 并在fisher.py 中导入它
config.py:
DEBUG = True # DEBUG要求大写
from flask import Flask
app = Flask(__name__)
app.config.from_object('config') # 传入模块的路径
@app.route('/hello')
def hello():
return 'Hello, cannon'
if __name__ == '__main__':
app.run(host='0.0.0.0', debug=app.config['DEBUG'], port=80)
# app.config 是dict的子类
补充:
app.config.from_object 导入配置文件config,要求config中所有参数必须是大写。
fisher.py 中使用if __name__ == ' __main__':
的真正原因:
app.run启动了flask自带的web服务器, 而在生产环境中使用nginx+uwsgi构建服务器, 不需要flask运行它自带的服务器了。
六. 响应对象response
视图函数的return和普通函数的return 有什么区别?
答: 视图函数的return 还附加了很多其他内容
我们通过改变fisher.py中hello视图函数的return值来讲解
from flask import Flask
app = Flask(__name__)
app.config.from_object('config')
@app.route('/hello')
def hello():
return '<html></html>' # 改变return值
if __name__ == '__main__':
app.run(host='0.0.0.0', debug=app.config['DEBUG'], port=80) # app.config 是dict的子类
运行后会发现页面中什么都没有。原因是视图函数的return还会发送如下内容给客户端:
1. status code 如 200 404 301...
2. content-type(在http的headers中) 告诉接收方解读方式, 默认=text/html
3. 其他非主要的
我们return'<html></html>'
会作为html被解析, 所以页面没有内容显示.
flask会把刚才的内容封装在response对象中,
下面我们自己定制response而不是使用默认的。
依然通过更改fisher.py的代码讲解
from flask import Flask
app = Flask(__name__)
app.config.from_object('config') # 传入模块的路径
@app.route('/hello')
def hello():
headers = {
'content-type': 'text/plain' # 不再是默认的text/html
#'Location': 'www.baidu.com' # 可以重定向到www.baidu.com
}
response = make_response('<html></html>', 404) # 404状态码
return response # 这会return response
# 也可以不使用response
# return '<html></html>', 404, headers
# 本质是返回tuple,效果是一样的。比较常用
if __name__ == '__main__':
app.run(host='0.0.0.0', debug=app.config['DEBUG'], port=80)
运行后我们可以看到网页内容是 <html></html>
补充注意点:
1. 状态码并不会影响我们网页的显示: 我们在代码中故意返回了404状态码, 网页可以正常显示。
2. 如果我们要返回json内容: 'content-type': 'application/json'