1. 程式人生 > >python3版本的flask環境,使用Python 和 Flask實現restful服務

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 flask 3. sudo apt-get install python3-venv

4. python3 -m venv py3flask

  1. sudo apt-get install python-virtualenv
  2. virtualenv -p /usr/bin/python3 py3flask
  3. . py3flask/bin/activate 在這裡插入圖片描述
  4. 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/檢視結果 如果其他機器想要訪問

:FLASK_APP=hello.py flask run --host=0.0.0.0 , 否則程式只能從您自己的計算機訪問,而不能從網路中的任何其他計算機訪問。

2018/11/13增

  1. 轉了一大圈,還是在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)即可

Java呼叫python restful介面

參考