python3版本的flask环境,使用Python 和 Flask实现restful服务

文章目录

  • 搭建py3版本的flask环境
    • 错误做法
    • 正确做法
  • 实践
    • 使用Python 和 Flask实现restful服务
      • demo_1:第一个python restful
        • route()源码
        • web调用
        • postman调用
        • curl命令
      • demo_2:传参
      • demo_3: 自定义错误响应
    • Java调用python 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” 时发生错误

Python 3 comes bundled with the venv module to create virtual environments. If you’re using a modern version of Python, you can continue on to the next section.

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
python3版本的flask环境,使用Python 和 Flask实现restful服务_第1张图片
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
    python3版本的flask环境,使用Python 和 Flask实现restful服务_第2张图片
  4. pip3 install flask
  5. 编辑hello.py:
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的编码,而不是中文(但是不影响接口的读取)

route()源码

python3版本的flask环境,使用Python 和 Flask实现restful服务_第3张图片

web调用

python3版本的flask环境,使用Python 和 Flask实现restful服务_第4张图片

postman调用

python3版本的flask环境,使用Python 和 Flask实现restful服务_第5张图片

curl命令

python3版本的flask环境,使用Python 和 Flask实现restful服务_第6张图片

demo_2:传参

  • 该例子主要是了解对参数的判断,以及传参时这样的写法
@app.route('/demo_2/api/v1.0/tasks/', 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的好看多了:
    python3版本的flask环境,使用Python 和 Flask实现restful服务_第7张图片

  • 报错时,就不建议使用curl了:
    python3版本的flask环境,使用Python 和 Flask实现restful服务_第8张图片

  • 报错原因:
    在这里插入图片描述
    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)

python3版本的flask环境,使用Python 和 Flask实现restful服务_第9张图片

  • 使用其他页面(模板)渲染
from flask import render_template

@app.errorhandler(404)
def page_not_found(e):
    return render_template('404.html'), 404

注意:如果html文件已经放在位于项目根目录下的templates文件夹下,就直接写文件名即可。
python3版本的flask环境,使用Python 和 Flask实现restful服务_第10张图片
注意:如果上面两种方法同时存在,重定向页面优先。

  • 使用自己的图片
    比如图片置于项目根目录下static文件夹下的img文件夹里,
    那么background:url(/static/img/pic.jpg)即可
    还是写相对路径吧

Java调用python restful接口

先放着,还没有尝试,估计改天单独记录下。这个例子貌似可以借鉴:https://segmentfault.com/q/1010000015174361/a-1020000015826871

参考

[0.] flask
[1.] 博客园: (翻译)使用python的Flask实现一个RESTful API服务器端
[2.] Java调用python restful接口
[3.] Ubuntu16.04安装Postman工具
[4.] 一个很不错的flask视频教程

你可能感兴趣的:(项目实践,flask,restful)