现在网上的flask框架的学习资料有点少,到处扒拉扒拉之后干脆写个博客免得以后自己忘记了,同时也分享一下我的学习心得,直接进入正题吧,至于具体的安装之类的就不多说了,直接进入正题,
以一个简单的flask为例,可以建个文件命令行跑一下试试
from flask import Flask
app=Flask(__name__)
@app.route('/')
def hello_world():
return "Hello World~~~"
if __name__ == '__main__':
app.run()
先是这个
from flask import Flask
倒入Flask类,接下来这一句
app = Flask(__name__)
实例化对象 app ,参数为应用模块或包的名称,这里 _name_ 指的是 _main_ 主程序。
@app.route("/")
使用 route() 装饰器告诉 Flask 触发函数的 URL 。默认是127.0.0.1:5000,例如@app.route(“/test1.py”)那么访问的时候的url就是127.0.0.1:5000/test1.py
def hello_world():
return "Hello World~~~"
定义的函数,用来生成相关联的 URL ,并返回需要在用户浏览器中显示的信息。
app.run()
运行服务器应用,运行后默认只有本地可以访问,且默认访问的ip和端口是127.0.0.1:5000,运行效果如下:
也可以使用自定义的主机和端口: app.run(host=”0.0.0.0”,port=8000)
假设你的.py文件在xxx/目录下,那么你的模板就必须放在xxx/templates下,文件结构大概如下。
xxx
|-templates文件夹
| |-index.html(模板文件)
|-templates1.py文件
根据上述的文件结构,举例说明如下:
首先是模板文件(xxx/templates/index.html)
<html>
<head>
<title>{{title}} - microblog</title>
</head>
<body>
<h1>Hello, {{user.nickname}}!</h1>
</body>
</html>
接下来是处理模板的.py文件(xxx/templates1.py)
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/index')
def index():
user = { 'nickname': 'bendawang' } # fake user
return render_template("index.html",
title = 'Home',
user = user)
app.run(debug=True)
效果如下:
在上面的程序中,我们从Flask
框架 import 了一个叫render_template
的新函数,并用这个函数来渲染模板。并给这个函数赋予了模板文件名和一些变量作为参数。它将导入的变量替换掉模板中的变量占位符,并返回渲染后的模板。 在 Flask 底层,render_template
函数实际上是调用了Flask
的一个组件:Jinja2
模板处理引擎。是 Jinjia2
用导入的变量替换掉了模板中对应的 {{ … }} 代码块。
接下来是模板的流程控制, Jinjia2
通过{% %}
就可以添加if或是for循环,举例说明如下:
首先是模板文件(xxx/templates/index2.html)
<html>
<head>
{%if title!=Null%}
<title>{{title}} is in</title>
{%else%}
<title>no one in</title>
{% endif %}
</head>
<body>
<h1>hi {{user.name}}!</h1>
{% for i in guest%}
<p>{{i.name}} said : <b>{{i.said}}</b></p>
{% endfor %}
</body>
</html>
接下来是处理模板的.py文件(xxx/templates2.py)
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/index')
def index():
user = {"name":"Bendawang"}
guest = [
{"name":"bdw12138","said":"bdw comming on!"},
{"name":"BDW12138","said":"BDW comming on!"}
]
return render_template("index2.html",title="bendawang_test",user=user,guest=guest)
app.run(debug=True)
运行效果如下图:
然后就是简单的模板继承功能:
我们先改造一下刚才的index2.html成如下的文件(base.html)
<html> <head> {%if title!=Null%} <title>{{title}} is in</title> {%else%} <title>no one in</title> {% endif %} </head> <body> {% block content %}{% endblock %} </body> </html>
然后编写一个index3.html让他继承与上述的base.html,如下(index3.html)
{% extends "base.html" %}
{% block content %}
<h1>hi {{user.name}}!</h1>
{% for i in guest%}
<p>{{i.name}} said : <b>{{i.said}}</b></p>
{% endfor %}
{% endblock %}
在这个模板中,我们使用了 block 控制语句来定义继承模板内容的显示位置。注意:这个 block 语句中设置的名称必须唯一。extends 语句使两个模板关联了起来。Jinja2
在渲染index3.html
模板时,发现 extends 语句,就会自动先引入 base.html 基础模板,并对两个模板中名为 content 的 block 语句进行匹配。
然后来的index2.html就成功分成了两个,一个base.html和一个index3.html,同样此时运行templates2.py,发现效果没变,所以这样分解之后便于以后的修改和编程,多的大家也都懂。
在这里,我在介绍一个更加工程化的文件结构,
microblog
|-app文件夹
| |-templates文件夹
| |-__init__.py文件
| |-views.py文件
|-run.py文件
这就是常用的flask的简单框架结构,现在我将templates1.py和index.html拆分成上述文件结构,具体操作如下:
1、首先将模板文件index.html放入templates文件夹下即可
2、接下来我们来拆分templates1.py,拆分之后如下
首先是 _init.py_文件
from flask import Flask
app = Flask(__name__)
from app import views
接下来是views.py文件
from flask import render_template
from app import app
@app.route('/index')
def index():
user = { 'nickname': 'bendawang' }
return render_template("index.html",
title = 'Home',
user = user)
最后是run.py文件
from app import app
app.run(debug = True)
然后就是需要命令行运行run.py就行了,具体的大家自己可以按照上述的说明自己建好文件之后读代码比较templates1.py慢慢体会就明白了。
不想自己搞的具体的templates1.py的简单工程文件可以在这里下载去看看,应该很容易就能看懂得。
http://download.csdn.net/detail/qq_19876131/9455913