基础入门
Flask是基于Werkzeug,Jinja 2和良好意图的Python微框架,其实在使用过程中发现里面很多内容和Django类似,特别是在模块渲染的block一块还有包括if、for等语法和python代码的引用,诸如{% %}和{{ }}等等,但是其中对于url的设置则是全新版块,开启服务调用函数也要轻便不少。
入门
Flask易于安装,可以直接在终端下用命令pip install flask(注意:项目过程中创建项目最好区分python版本和环境,可以具体了解下anaconda 或者virtualenv
第一个helloworld
1.创建项目(这里使用的工具是Pycharm专业版,注意工作环境)
2.主程序
from flask import Flask #导入flask
app = Flask(__name__)
@app.route('/') #装饰器,用作url与视图函数的映射,一般写在函数上方
def index():
return 'Index Page'
if __name__ == '__main__': #主函数,运行后在浏览器输入127.0.0.1:5000(或者进入控制台显示的地址即可),app.run内可以指定参数,比如端口号和debug等,不指定则使用默认。
app.run()
传递一个参数name,这个类的一个实例将是我们的WSGI应用程序。第一个参数是应用程序模块或包的名称。如果您使用的是单个模块(如本示例所示),则应使用name,因为根据它是作为应用程序启动还是作为模块导入,名称将不同。这是必需的,以便Flask知道在哪里查找模板,静态文件等,也同时方便flask插件比如Flask-sqlalchemy出现错误的时候,好去查询错误所在。
3.if name== "main"在Flask的含义
一个python的文件有两种使用的方法,第一是直接作为脚本执行,第二是import到其他的python脚本中被调用(模块重用)执行。因此if name== 'main': 的作用就是控制这两种情况执行代码的过程,在if name== 'main': 下的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而import到其他脚本中是不会被执行的。
Flask中,一般生产环境使用 nginx+uwsgi 作为 flask 自带的web服务器,使用if name == "main"判断,避免在生产环境中启动flask自带的web服务器。
Debug模式
开启debug模式后可以在网页上显示出出错信息,并且在程序段可以实现自动刷新。
1.直接在app.run内添加参数
app.run(debug=True)
2.调用配置文件
新建config.py,相关公共系统配置均可以写入这里,之后项目开发会根据实际区分开来不同的配置
在主文件里面调用配置文件,先用import config引入config.py,然后可以用app.config.from_object(config)或者app.run(debug=app.config['DEBUG'])实现引用,debug模式开启后控制台会显示状态:activate
Route路由
在flask中有两种路由注册的方法,
1.@app.route('/hello'),较为便捷的,采用python语言的装饰器来做路由注册,直接给视图函数增加装饰器即可。
2.app.add_url_rule("/hello/", view_func=hello),view_func参数指定视图函数
其实两种方式本质上都是通过app.add_url_rule("/hello/", view_func=hello)这种方式实现的,只不过第一种方法在装饰器内部Flask自己调用了app.add_url_rule("/hello/", view_func=hello)。
可以在路由中定义参数,放在<>之中,可以自定义类型,例如:
唯一路由
@app.route('/projects/')
def projects():
return 'The project page'
@app.route('/about')
def about():
return 'The about page'
projects端点的规范URL 具有尾部斜杠。它类似于文件系统中的文件夹。如果您访问的URL没有斜杠,则Flask会将您重定向到带有斜杠的规范URL。
about端点的规范URL 没有尾部斜杠。它类似于文件的路径名。使用尾部斜杠访问URL会产生404“未找到”错误。这有助于保持这些资源的URL唯一,这有助于搜索引擎避免两次索引相同的页面。
url_for
要构建特定功能的URL,请使用该url_for()功能。它接受函数的名称作为其第一个参数和任意数量的关键字参数,每个参数对应于URL规则的可变部分。未知的变量部分作为查询参数附加到URL,url_for用于视图函数转向url,重定向和模版渲染中的页面跳转等。
url_for('index', page=2) #返回是 /?page=2
url_for('login') #返回login函数的路由
redirect
功能就是跳转到指定函数的url,大部分情况下,都是和url_for一起使用的,例如:
@app.route('/')
def hello_world():
return'Hello World'
@app.route('/<name>/')
def hello(name):
if name =='Harp':
return'Hello %s' % name
else:
return redirect(url_for('hello_world'))
静态文件
动态Web应用程序还需要静态文件。这通常是CSS和JavaScript文件的来源。理想情况下,您的Web服务器配置为为您提供服务,但在开发期间,Flask也可以这样做。只需创建一个static在包中或模块旁边调用的文件夹,它就可以在/static应用程序中找到。
静态文件指css、js、图片等文件,通常会在项目根目录下的static目录(没有则自行建立)下建立相应目录,然后利用flask调用模块,它会自动前往相应文件的根目录下寻找文件所在。
url_for("static",filename="css/demo.css") #在根目录下的static文件夹下的css文件夹下寻找demo.css
jinja2模版
要渲染模板,您可以使用该render_template() 方法。您所要做的就是提供模板的名称以及要作为关键字参数传递给模板引擎的变量。这是一个如何呈现模板的简单示例:
from flask import render_template
@app.route('/hello/<name>')
def hello(name):
return render_template('hello.html', context={})
模板放在templates文件夹下,渲染模板只用写模板名字不用写文件夹路径,字典传参可以用两个星号将字典转换成关键字参数传递进去,也可以自行实例化参数,例如:
context = {
name = 'Tom'
}
return render_template('hello.html',**context)
更多关于render_template模块参见官方文档
模版继承和block
templates中的html页面中不可避免都有很多重复板块,类似导航或者尾部栏,就可以定义一个基础页面base.html作为父模版,其他的诸如主页、登录页等的相应板块就直接继承自父模版,{% extends ‘base.html’ %},如果在子页面中要定义单独的内容块,则在父模版中的相应位置使用{% block 可自定义名字%}{% endblock%}占位,然后在子页面中插入{% block 自定义名字%}{% endblock%},在其中定义代码段即可。
有关jinja2模版相关,参见官方文档
过滤器
处理一些变量,作用的对象是变量 ,例:
{{ name | default}} #变量没有值则调用默认值
{{ name | length}} #返回长度
变量语法
{{ 变量名 }},接收函数内传递过来的字典,并用于在前台页面展示,调用变量的值
包括for循环迭代,if语句等都和python内类似,{% %},均需要结束段。{{%for x in xxx %}}{% endfor %},{% if %}{% else %}{% endif %}.