时间:2021-07-01 10:21:17 帮助过:48人阅读
Traceback (most recent call last): File "d:\program files (x86)\python27\Lib\runpy.py", line 174, in _run_module_as_main "__main__", fname, loader, pkg_name) File "d:\program files (x86)\python27\Lib\runpy.py", line 72, in _run_code exec code in run_globals File "E:\WorkPlace\Git_python\liu_demo\venv\Scripts\gunicorn.exe\__main__.py", line 5, in <module> File "e:\workplace\git_python\liu_demo\venv\lib\site-packages\gunicorn\app\wsgiapp.py", line 10, in <module> from gunicorn.app.base import Application File "e:\workplace\git_python\liu_demo\venv\lib\site-packages\gunicorn\app\base.py", line 12, in <module> from gunicorn import util File "e:\workplace\git_python\liu_demo\venv\lib\site-packages\gunicorn\util.py", line 9, in <module> import fcntl ImportError: No module named fcntl
然而我的服务器依旧是Windows版本,Flask服务器环境还是要搭建,那么得采用什么方案呢?
此处推荐采用tornado。
那么什么是tornado呢?
摘抄至网上一篇文章(http://www.tornadoweb.cn/)介绍:Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本。这个 Web 框架看起来有些像 web.py 或者 Google 的 webapp,不过为了能有效利用非阻塞式服务器环境,这个 Web 框架还包含了一些相关的有用工具 和优化。
Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,这意味着对于实时 Web 服务来说,Tornado 是一个理想的 Web 框架。我们开发这个 Web 服务器的主要目的就是为了处理 FriendFeed 的实时功能 ——在 FriendFeed 的应用里每一个活动用户都会保持着一个服务器连接。(关于如何扩容 服务器,以处理数以千计的客户端的连接的问题,请参阅 C10K problem。)
至于具体怎么运用,可以查看上面文章介绍,也可以参见下文的具体使用代码。
看到下面具体实现代码,会让大家感叹,Python的确是一个优美的语言,Flask框架也的确是对应小而又轻量级的框架美称呀。使用MongoDB数据库,操作数据库也变得极为简单。
在看下面代码之前,需要简单说一下REST的基本思想原理,也相当于是我自己进一步加深印象吧。下面解释应用自阮一峰博客的一个评论,我感觉这样描述的很在理。
REST四个基本原则:
1.使用HTTP动词:GET POST PUT DELETE;
2.无状态连接,服务器端不应保存过多上下文状态,即每个请求都是独立的;
3.为每个资源设置URI;
4.通过XML JSON进行数据传递;
实现上述原则的架构即可称为RESTFul架构。
1.互联网环境下,任何应用的架构和API可以被快速理解;
2.分布式环境下,任何请求都可以被发送到任意服务器;
3.异构环境下,任何资源的访问和使用方式都统一;
看到上面介绍,既然说了REST方式使用HTTP动词GET POST PUT DELETE来实现相关操作。
那么下面代码就简单实现一下这四个动词的具体操作功能。
GET:实现从服务器后台获取数据功能,例如登陆接口功能实现;
POST:实现向服务器后台提交数据功能,例如注册接口功能实现;
PUT:实现修改服务器后台已有数据功能;
DELETE:实现删除服务器后台已有数据功能。
看完上面介绍,下面就请看代码:
如果不使用tornado,直接使用下面一个mongo.py文件中代码即可实现本文标题所述功能:
#coding=utf-8 #mongo.py from flask import Flask,abort from flask import jsonify from flask import request from flask_pymongo import PyMongo app = Flask(__name__) app.config[‘MONGO_DBNAME‘] = ‘rest‘ app.config[‘MONGO_URI‘] = ‘mongodb://172.18.252.20:27017/rest‘ #如果部署在本上,其中ip地址可填127.0.0.1 mongo = PyMongo(app) @app.route(‘/login‘, methods=[‘GET‘]) def get_all_users(): star = mongo.db.userInfo.find() output = [] for s in star: output.append({‘name‘ : s[‘name‘], ‘pwd‘ : s[‘pwd‘]}) return jsonify({‘result‘ : output}) @app.route(‘/register‘, methods=[‘POST‘]) def add_user(): star = mongo.db.userInfo name = request.json[‘name‘] pwd = request.json[‘pwd‘] star_id = star.insert({‘name‘: name, ‘pwd‘: pwd}) new_star = star.find_one({‘_id‘: star_id }) output = {‘name‘ : new_star[‘name‘], ‘pwd‘ : new_star[‘pwd‘]} return jsonify({‘result‘ : output}) @app.route(‘/modify/<string:name>‘, methods=[‘PUT‘]) def update_user(name): user = mongo.db.userInfo.find({"name":name}) output = [] for s in user: output.append({‘name‘: s[‘name‘], ‘pwd‘: s[‘pwd‘]}) if len(output) == 0: abort(404) mongo.db.userInfo.update({"name":name},{‘$set‘:{"name":"LZ111"}}) return jsonify({‘result‘: output}) @app.route(‘/delete/<string:name>‘, methods=[‘DELETE‘]) def delete_user(name): user = mongo.db.userInfo.find({"name": name}) output = [] for s in user: output.append({‘name‘: s[‘name‘], ‘pwd‘: s[‘pwd‘]}) if len(output) == 0: abort(404) mongo.db.userInfo.remove({‘name‘: name}) return jsonify({‘result‘: True}) if __name__ == ‘__main__‘: # app.run(host = ‘0.0.0.0‘, port = 80, debug = True) app.run()
如果使用tornado,新建一个tornado_server.py文件,添加以下代码,作为Flask服务启动部署,也可以实现相关功能:
#coding=utf-8 #tornado_server.py from tornado.wsgi import WSGIContainer from tornado.httpserver import HTTPServer from tornado.ioloop import IOLoop from mongo import app http_server = HTTPServer(WSGIContainer(app)) # http_server.listen(9000) #此时,开启端口9000,默认本机127.0.0.1的IP地址 http_server.bind(80, "172.18.252.20")# 开启端口为9000,172.18.252.20为内网ip地址,也可以设置为0.0.0.0, http_server.start(1) IOLoop.instance().start()
看完上面代码,点击运行,即可实现相关接口功能了。既然是接口,GET方式还好说,如果是POST方式,使用浏览器就不那么好操作了,此时我们需要使用一款接口测试软件,在这里我推荐使用Postman(PS:Postman百度经验介绍,Postman官网下载链接 , 附加百度云盘WIN64位下载链接:https://pan.baidu.com/s/12t09OMcrezgNY3_JfYFx8g 密码:z1vk),如果有同学使用基于Linux相关系统,推荐使用CURL来实现。
下面就正式开始使用Postman测试Get、Post、Put和Delete方式接口:
Get方式,选中下图中下拉框GET方式,直接输入URL,然后点击Send蓝色按钮即可得到请求数据。
Post方式,选中下拉框中Post方式,这里由于要发送数据,需要稍微设置一下。
首先,在下图中Headers中要选择Content-Type的数据方式,这里我选择的是json格式:
然后,点开下图中Body,选择raw,添加要存入的json格式数据,如下:
最后,点击Send按钮,在最下面出现相关提示信息后,即可查看Post请求结果。
Put方式操作和Get方式雷同,不同的是需要选中操作方式为Put,具体如下图:
Delete方式和Put请求几乎一样,不同的是一个执行修改操作,一个执行删除操作而已,具体如下图:
基本操作就这样,看完上面代码,发现使用FLask+MongoDB写后端接口是不是特别简单?
参考资料:
1.Designing a RESTful API with Python and Flask(PS:附加一个中文版,不过里面代码有bug)
2.理解RESTful架构
3.MONGODB RESTFUL API WITH FLASK
使用Flask+MongoDB实现基于REST的接口简单操作
标签:any article flask框架 推荐 发送数据 .json 协议 无法 快速理解