一、Flask自动重启:
每次代码修改后,必须保存后,重启服务器,然后代码才可以生效,这是python开发服务器特点,而想php开发,就不需要每次重启服务器
解决方案:
1.写脚本,自动监听文件的改动,如果有改动,就自动重启服务(太麻烦)
2.flask内置了一个功能,可以自动重启服务器,只需要将flask的debug模式打开。代码如下:
app.run(debug=True)
二、flask 路由的唯一url 特性:
@app.route('/hello/')
def hello():
return "hello"
当访问 “/hello” 后面不带斜杠的地址,flask会将 “/hello” 重定向到 “/hello/” 目录下(这里重定向是发了2个请求,第一个是“/hello”,第二个是“/hello/”),这样就兼容了用户的错误输入
当访问“/hello/” 带后面斜杠的地址,就直接访问“/hello/” 目录。
flask这样设置重定向的意义:保证了url唯一性,不能因为后面带或不带斜杠,就定义成2个地址,但实质他们内容是一致的,这样导致爬虫反复爬取重复内容,不利于SEO。
三、flask 路由注册的两种方法:
方式一:
@app.route('/hello/')
def hello():
return "hello"
方式二:
def hello():
return "hello"
app.add_url_rule('/hello', view_func=hello)
两种方式的区别,其实方式一,@app.route 里面就是调用了app.add_url_rule()这个方法(通过command + 点击,跳转到方法定义的地方),只是方式一封装了一层装饰器,方便我们调用。
四、app.run 参数和flask其他配置文件
app.run(debug=True) //如果只有这一个参数,是只能被本机的localhost 访问,连局域网里面的其他机器都是不能访问的
app.run(host='0.0.0.0', debug=True,port=81) //host 指定IP地址。0.0.0.0接受外网的访问 , 自定义端口
单独弄一个config.py配置文件,方便后期线上版本管理。
//config.py 配置文件里面的参数常量,都写成大写
DEBUG = True
//app.config.from_object(‘模块路径’),config.py就在当前目录下,所以直接写。
app.config.from_object('config')
app.run(host='0.0.0.0', debug=app.config['DEBUG'],port=81)
注意:app.config是一个字典,里面有一个默认参数DEBUG = False,所以如果要覆盖掉原来默认DEBUG值,必须把配置文件的参数设置成DEBUG,全部大写。
五、if __ name __作用
if __name__ == '__main__':
app.run(host='0.0.0.0', debug=app.config['DEBUG'],port=81)
这句话作用:
1.如果本文件不是flask入口文件,而且被其他文件作为模块导入,那么后面的语句不会被执行。
2.在开发环境,会启动一个Flask简单的服务器,真实的生产线上环境是用nginx + uwsgi 。nginx接受浏览器传过来请求,然后转发给uwsgi这个web服务器。线上环境,Flask是通过uwsgi加载run.py这个模块来启动的,而不是手动的python run.py来启动的,在生产环境,run.py就不再是flask入口文件,而是被加载进来的,所以如果不写第一行if的判读的话,在生产环境 app.run( 。 。 。)这句代码根本不会被执行的。如果没有if判断,那么app.run就会启动,就意味着这个启动了Flask自带的服务器。启动了2个服务器。
六、视图函数和普通函数的区别
//视图函数hello
@app.route('/hello/')
def hello():
return '<html> </html>' //访问结果是空白
//普通函数world
def world():
return "world"
视图函数返回信息除了简单文本外,还有一些附加信息
status code 201 / 404 等等
content-type 默认值text/html ,告诉客户端如何解析我们返回的内容,这就解释了上述访问/hello就是什么内容看不到,如果<html> test </html> ,那就显示了test内容
七、视图函数返回的是什么
服务器返回给客户端基本就是纯文本,或者html,或者json 形式的api,但视图函数返回内容的就是字符串,只是设置了content-type导致返回结果不一样
//text/plain 纯文本
//application/json json数据
//text/html html数据
@app.route('/world2/')
def world2():
header = {
'content-type':'text/plain'
}
reponse = make_response('<html></html>',201)
reponse.headers = header
return reponse