目录
- 目录
- 初识flask
- flask的安装
- 开发flask站点从hello world程序开始
- 模板渲染
- 路由详解
- 带变量的路由
- HTTP方法绑定
- Json数据
- 用Flask写个接受并处理图片的API
- 服务端
- 客户端
初识flask
*学习flask框架时,我只有少量的网络基础,所以本文会涉及很少的学术知识,用最通俗易懂的方法来介绍简单flask API是如何编成的。
flask的安装
flask安装是在virtualenv虚拟环境下进行的
所以首先利用pip进行virtualenv的编写
pip install virualenv
新建一个目录,在里面创建virualenv环境,我的是flaskdemo,在cygwin下运行:
mkdir flaskdemo
cd flaskdemo
pip install virtualenv
virtualenv –system-site-packages venv #混合虚拟环境
ps 最好让env使用系统安装好的第三方库,不然还要自己在虚拟环境中安装,这里走了不少坑。。
这样flaskdemo下会生成env文件,之后激活虚拟环境
source env\Scripts\activate
pip install Flask
之后我把所有编写的python文件都存放在Scripts中运行
开发flask站点从hello world程序开始
from flask import Flask
app=Flask(__name__) #建立一个Flask类的实例app
@app.route('/') #使用route()装饰器告诉Flask紧跟着的函数装载在哪个URL地址中
def hello_flask():
return 'Hello World!' #hello_flask()函数被加载在./这个URL地址中
if __name__=='__main__':
app.run() #app.run()进入flask消息循环
将代码文件保存为helloworld.py,通过cygwin运行
$ python helloworld.py
* Running on http://127.0.0.1:5000/
打开网页http://127.0.0.1:5000/就可以了
模板渲染
在上述程序中实现了向客户端返回字符串这样的简单工作。在网站建设中,服务器需要使用HTML与浏览器进行交互。Flask使用Jinjia模板引擎实现了自动模板渲染功能,jinjia模块通过加载已经写好的HTML模板文件,并可在其中嵌入必要的参数。
代码块语法遵循标准markdown代码,例如:
from flask import render_template
@app.route('/index/<name>') #一个函数可以通过参数变量绑定到多个url地址上<name>
def hello(name):
return render_template('hello.html',name=name)
本例把模板文件的文件名传递给了render_template(),flask会去网站的templates目录下加载该文件
hello.py
templates
/hello.html
hello.html模板的编写就不重复了
路由详解
带变量的路由
from flask import Flask
...
@app.route('/hello/<name>')
def showhello(name):
return 'hello %s' % name
还可以为变量指定类型
from flask import Flask
...
@app.route('/index/int:<num>')
def count(num):
return '%d' % (num+1)
HTTP方法绑定
网站通过HTTP与浏览器或其他客户端进行交互,HTTP访问一个URL时可以使用几种不同的访问方式,GET、POST、HEAD、DELETE等。
from flask import Flask
...
@app.route('/hello/',methods=['GET'])
def get_hello():
name='gao'
return name
Json数据
本文只关注flask框架中怎样前端传递或者接收Json文件
利用flask的request.form.get()方法和request.get_data()方法
from flask import Flask,jsonify,request
app=Flask(__name__)
@app.route('/usejson',methods=['POST']
book=dict('name':'python','price':35,'date':'2016-5')
def usejson():
data=json.loads(request.form.get('data') #或者data=json.loads(request.get_data())
book['name']=data["name"] #在本地更改book字典
book['date']=data["date"]
return jsonify(book) #用flask的jsonify方法,组装json格式
用Flask写个接受并处理图片的API
服务端
from flask import Flask,request
import annotate
app=Flask(__name__)
@app.route('/',methods=['POST'])
def upload():
file=request.files['file']
prediction=annotate.image_annotate(file)
return '%s' % prediction
if __name__=='__main__':
app.run()
客户端
import requests
#file=open('C:/users/cutegao/Desktop/1.jpg','rb')
url='http://127.0.0.1:5000/'
files={
'file':open('1.jpg','rb')
}
r=requests.post(url,files=files)
print r.text
主要参考博客
[2] http://www.programcreek.com/python/example/51528/flask.request.files
[3] http://www.jb51.net/article/85863.htm