0.Flask简单介绍
Flask是一个用Python编写的轻量级的Web应用框架。本文第一部分将简单解说Flask的安装,接着展示一个Flask的样例,第一个样例非常easy但也存在缺陷——在Python代码中嵌入了HTML标签,为了解决这种缺陷第二个样例引入了模板,最后第三个样例在模板中增加了參数。
1.Flask安装
安装Flask的方法有非常多。比如使用easy_install或pip。
可是再開始之前最好使用国内镜像,这样安装时等待的时间会短的非常多。很多其它内容请參考——python 扩展库安装 使用第三方镜像源
【使用easy_install安装】
(sudo) easy_install -i http://pypi.douban.com/simple/ flask
【使用pip安装】
(sudo) pip install -i http://pypi.douban.com/simple/ flask
2.一个简陋的例子
【网页源码】
<html> <title>Flask Test</title> <body> <h2>Hello World</h2> </body> </html>
【终于效果】
![](file:///C:/Users/dell/AppData/Local/YNote/Data/xukai19871105@126.com/7817fe611f9342c0b0f2eaacde5a36c6/clipboard.png)
图1 执行结果
【python代码】——文件名称为hello-flask.py
from flask import Flask app= Flask(__name__) @app.route('/') def hello(): response = "<html> " response += "<title>Flask Test</title> " response += "<body> " response += "<h2>Hello World </h2>" response += "</body> " response += "</html> " return response if __name__ == '__main__': app.run(host="0.0.0.0",port=8080, debug=True)
【怎样执行】
假设是windows7系统,能够按住shift并在所在文件夹右击。选择“在此处打开命令窗体”,接着在控制台中输入 python hello-flask.py。
若希望结束执行请在控制台中输入Ctrl+C。
【代码说明】
【1】from flask import Flask
引入flask框架。form flask中的flask必须小写代表文件名称,为improt Flask中的Flask必须大写代表类名。
【2】app= Flask(__name__)
创建一个实例。
【3】@app.route('/')
设置Flask路由。在上文的代码中,若Flask遇到"/"这种URL,那么就使用hello_world处理该请求。此处的@符号临时不深入讨论。
【4】app.run(host="0.0.0.0",port=8080, debug=True)
host="0.0.0.0"使得Flask能够处理来自随意IP的请求,port=8080指定端口为8080,建议在调试过程中不使用80端口除非你有十足的把握。
【为什么说这个样例丑陋】
从上面的代码能够看出,在python代码中插入了非常多HTML标签,比如body h2等,这种代码容易产生混乱而且难以维护。
假设使用渲染模板便可非常好的解决该问题。
3.利用模板
模板和原始的HTML文件非常的类似,仅仅是在原始HTML中多些占位符,Flask框架中使用Jinja2作为模板引擎,而Jinja2的占位符为{{ }}。
当使用render_template方法渲染一个模板时,Jinja2便把占位符使用指定的变量替代并形成html文件,最后Flask把该html文件传输给浏览器。
为了利用模板。在hello-flask.py同文件夹中新建一个templates文件夹。在文件夹中新建一个hello.html文件。
【HTML文件】
<html> <head> <title>Flask Test</title> </head> <body> <h2>Hello World</h2> </body> </html><span style="background-color: inherit; font-family: Tahoma;"> </span>
【python代码】
from flask import Flask,render_template app= Flask(__name__) @app.route('/') def hello(): return render_template("hello.html") if __name__ == '__main__': app.run(host="0.0.0.0",port=8080, debug=True)
【代码说明】
【1】from flask import Flask,render_template
引入render_template方法【2】render_template("hello.html")
渲染hello.html文件。注意此处没有代入不论什么參数。
![](http://img.blog.csdn.net/20140602214742515?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHVrYWk4NzExMDU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](file:///C:/Users/dell/AppData/Local/YNote/Data/xukai19871105@126.com/3643a94efd824506b5734345d0d8ada0/clipboard.png)
![](http://img.blog.csdn.net/20140602214747109?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHVrYWk4NzExMDU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](file:///C:/Users/dell/AppData/Local/YNote/Data/xukai19871105@126.com/ea0e3d93c19741ef802af0f96485cf5c/clipboard.png)
4.更复杂的样例
让我们再来做一个复杂一些的样例,定义这样一个RESTful风格URL。
/hello/name 网页显示hello name。
/hello/ 网页显示hello 某默认结果(此处暂且定义为xukai871105吧)。
【终于效果】
![](file:///C:/Users/dell/AppData/Local/YNote/Data/xukai19871105@126.com/3643a94efd824506b5734345d0d8ada0/clipboard.png)
图2 执行结果
![](file:///C:/Users/dell/AppData/Local/YNote/Data/xukai19871105@126.com/ea0e3d93c19741ef802af0f96485cf5c/clipboard.png)
图3 执行结果
【html文件】
<html> <head> <title>Flask Test</title> </head> <body> <h2>Hello {{name}}</h2> </body> </html>
【python代码】
from flask import Flask,render_template app= Flask(__name__) @app.route('/hello/') @app.route('/hello/<name>') def hello(name=None): if name == None: name = "xukai871105" templateDate = {'name' : name}; return render_template("hello.html", **templateDate); if __name__ == '__main__': app.run(host="0.0.0.0",port=8080, debug=True)
【代码说明】
【1】hello函数处理两个URL,分别为/hello/和hello/<name>
【2】templateDate定义一个python字典,该字典仅仅有一个键值对。name:xukai。请注意此处的'name'为键名称,而name为键详细值此处为一个变量。
python中的字典和javascript中的JSON非常类似,假设在javascript中能够写成{name:name}。前一个name为键名称,后一个name为键详细值,javascript把引號都省略了。
【3】**templateDate表示随意个数且有名称的參数,该參数适用字典来訪问。在这里也能够写成,render_template("hello.html", name=name);假设这样描写叙述那么第一个那么代表键名称,第二个那么代表键详细值,此处name为hello函数的形參。
5.參考资料