python3版本的flask環境,使用Python 和 Flask實現restful服務
搭建py3版本的flask環境
錯誤做法
1. 在搭建py3的flask虛擬環境時,virtualenv --no-site-packages py3flask
報錯:
virtualenv ImportError: cannot import name _remove_dead_weakref
加上了引數–no-site-packages,這樣,已經安裝到系統Python環境中的所有第三方包都不會複製過來,這樣,我們就得到了一個不帶任何第三方包的“乾淨”的Python執行環境。
解決:
virtualenv --no-site-packages -p python3 py3flask
2. 然後,py3flask目錄下的子bin目錄下有指令碼activate,source它,出錯
source:讀取檔案 “py3flask/bin/activate” 時發生錯誤
flask現在支援py3.2版本以上的py3,且推薦使用python3上使用flask。不需要安裝virtualenv。
刪除virtualenv虛擬環境: 轉了一圈,答案是沒有,那就rm吧:
cd py3flask
rm -rf ./*
刪除virtualenv:
apt-get --purge remove virtualenv
:解除安裝軟體及其配置
正確做法
1. 檢視本機是否有py3環境:
ls /usr/bin/ | grep python
2. python3 -m venv venv
3. sudo apt-get install python3-venv
python3 -m venv py3flask
sudo apt-get install python-virtualenv
virtualenv -p /usr/bin/python3 py3flask
. py3flask/bin/activate
pip3 install flask
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
shell:FLASK_APP=hello.py flask run
然後http://127.0.0.1:5000/檢視結果
如果其他機器想要訪問
2018/11/13增
- 轉了一大圈,還是在tensorflow的虛擬環境裡搭一個flask環境,切來切去太麻煩了。
實踐
使用Python 和 Flask實現restful服務
在java中,springMVC提供這樣的操作。 那麼python中呢? 下面的demo_1、2、3都是在“參考[1.]”的基礎上做了些修改,增加功能,感謝博主的翻譯!
demo_1:第一個python restful
from flask import Flask, jsonify
app = Flask(__name__)
tasks = [
{
'id': 1,
'title': u'json串 1',
'description': u'Milk, Cheese, Pizza, Fruit, Tylenol',
'done': False
},
{
'id': 2,
'title': u'json串 2',
'description': u'Need to find a good Python tutorial on the web',
'done': False
}
]
@app.route('/demo_1/api/v1.0/tasks', methods=['GET'])
def get_tasks():
return jsonify({'tasks': tasks})
if __name__ == '__main__':
# make jsonify support chinese
app.config['JSON_AS_ASCII'] = False # 否則在web端顯示的是utf-8的編碼,而不是中文(但是不影響介面的讀取)
app.run(debug=True)
注意: app.config['JSON_AS_ASCII'] = False
# 否則在web端顯示的是utf-8的編碼,而不是中文(但是不影響介面的讀取)
web呼叫
postman呼叫
curl命令
demo_2:傳參
- 該例子主要是瞭解對引數的判斷,以及傳參時<int:task_id>這樣的寫法
@app.route('/demo_2/api/v1.0/tasks/<int:task_id>', methods=['GET'])
def get_task(task_id):
task = list(filter(lambda t: t['id'] == task_id, tasks))
if len(task) == 0:
abort(404)
return jsonify({'task': task[0]})
if __name__ == '__main__':
# make jsonify support chinese
app.config['JSON_AS_ASCII'] = False # 否則在web端顯示的是utf-8的編碼,而不是中文(但是不影響介面的讀取)
app.run(debug=True)
-
哈哈,flask的報錯介面,比java的好看多了:
-
報錯時,就不建議使用curl了:
-
報錯原因: python3 中filter返回的filter object是一個迭代器(py2 貌似直接返回字典),修改如下:
task = list(filter(lambda t: t['id'] == task_id, tasks))
demo_3: 自定義錯誤響應
- 自定義提示
from flask import make_response
@app.errorhandler(404)
def not_found(e):
return make_response(jsonify({'error': 'Sorry,Did not find the resources you want to visit.'}), 404)
- 使用其他頁面(模板)渲染
from flask import render_template
@app.errorhandler(404)
def page_not_found(e):
return render_template('404.html'), 404
注意:如果html檔案已經放在位於專案根目錄下的templates資料夾下,就直接寫檔名即可。 注意:如果上面兩種方法同時存在,重定向頁面優先。
- 使用自己的圖片
比如圖片置於專案根目錄下static資料夾下的img資料夾裡,
那麼
background:url(/static/img/pic.jpg)
即可