flask——接口簡單示例

原文:http://www.javashuo.com/article/p-quiocrfn-kg.htmlphp

 

目錄html

前言python

1 準備工做nginx

2 具體實現git

 

 


前言

最近在搗鼓如何使用阿里雲服務器搭建一個簡單的基於Flask框架的後端接口,剛開始爲了圖方便,就直接買了一個Windows Server 2008系統服務器,這也埋下了不小的坑。web

 

服務買下來後,會給你一個公網IP和內網IP,因爲是第一次學習搭建後端接口,對於如何正確使用阿里雲服務器,來處理好公網IP和內網IP之間的關係埋下了不小的坑,真是對應的一句話:技術的成長每每是一步一個坑。mongodb

 

下面簡單說一下搭建Flask服務器端遇到的問題:數據庫

首先,Flask自帶了一個服務器,直接使用很方便,不過這個服務器的性能過低,可是對於調試和學習仍是綽綽有餘。剛開始把代碼放到阿里雲服務器上,並跑通後,測試接口時公網IP沒法訪問,那時我覺得是Flask自帶服務器的問題,即由於Flask自帶服務器緣由致使沒法使用公網IP訪問。django

 

那麼,問題出現了,就要尋找解決辦法吧,網上查找資料給出參照意見:使用nginx +gunicorn來部署Flask相關服務,能夠避免公網IP沒法訪問問題。而後,我就去找資料,安裝gunicorn,結果運行測試時一直報錯,最後發現gunicorn不支持Windows系統,這也太坑了,早知道我當時買服務器時就不應圖方便,直接買一個基於Linux的系統了。json

 

如今,新的問題又來了,既然不能使用nginx +gunicorn來部署Flask相關服務,那就要使用其它方式來解決吧,網上資料參照結果:使用tornado。好,那麼我又來查看學習tornado部署應用開發文檔,按照開發文檔部署完畢後,在服務器上跑通後,發現依舊不能使用公網IP進行接口訪問和測試。

 

到了這裏,就讓我反思,這個難道真是Flask部署應用服務器問題嗎?後來,就在網上找到了一篇關於阿里雲公網IP沒法訪問問題的文章,發現這個須要本身去阿里雲官網上去配置設置。

 

即以上遇到的問題,壓根就不是Flask部署服務器問題,是本身沒有搞清楚阿里雲服務器如何使用的問題......

 

具體配置設置方法見:阿里雲服務器 ECS 訪問不了公網 ip 可能的緣由及解決方法

附:

 

 

 


1 準備工做

導入Flask及相關擴展:

pip install flask

pip install flask-pymongo

pip install tornado(此處可選可不選。若是不選擇,直接使用Flask自帶的服務器部署便可;若是選擇,可使用tornado部署)

 

MongoDB數據庫綁定服務ip地址設置(PS:若是不進行下述設置,默認ip爲本機127.0.0.1地址):

打開CMD,進入MongoDB安裝的bin文件夾下,例如個人安裝目錄爲:C:\Program Files\MongoDB\Server\3.2\bin

而後在CMD中輸入mongod.exe --bind_ip yourIPadress

其中參數--bind_ip意思:綁定服務IP,若綁定127.0.0.1,則只能本機訪問,不指定默認本地全部IP。(注意:其中yourIPadress填寫本身搭建服務器的內網ip地址)

具體以下圖:

 

 

開啓Flask自帶的服務器,通常使用app.run(),其中通常使用以下三個參數:host(指定ip地址,若是不填寫,默認爲127.0.0.1)、port(指定使用的端口,若是不指定,默認爲5000端口)、debug(開啓調試模式,默認值爲Flase,即不開啓調試模式,如要開啓則能夠設置爲True)。

 

若是在服務器上搭建Flask接口相關服務,設置其中host=’0.0.0.0’表示在公網ip下的同一個局域網段全部ip均可以訪問這個服務,若是把host指定爲其中一個內網ip地址,則這個局域網下全部用戶能夠經過訪問這個指定的ip地址訪問Flask服務。

 

後面介紹能夠略微看看,也至關因而瞭解一下nginx +gunicorn以及tornado的基本概念。也能夠忽略,直接查看2 具體實現

 

使用nginx +gunicorn來部署Flask相關服務,即不使用Flask自帶的服務器。

 

看到上面的部署方式,做爲初學者,難免會有新的疑問,什麼是nginx和gunicorn呢?

我本身也是新接觸的,查看了一下網上資料,大概瞭解了一下。

 

什麼是nginx呢?

摘抄自百度百科(https://baike.baidu.com/item/nginx/3817705?fr=aladdin)的一段解釋:Nginx是一款輕量級Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,並在一個BSD-like 協議下發行。其特色是佔有內存少,併發能力強,事實上nginx的併發能力確實在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。

 

什麼是gunicorn呢?

摘抄自網上一遍文章(http://www.pythontip.com/blog/post/5155/)一段解釋:Gunicorn「綠色獨角獸」是一個被普遍使用的高性能的Python WSGI UNIX HTTP服務器,移植自Ruby的獨角獸(Unicorn )項目,使用pre-fork worker模式,具備使用很是簡單,輕量級的資源消耗,以及高性能等特色。

Gunicorn 服務器做爲wsgi app的容器,可以與各類Web框架兼容(flask,django等),得益於gevent等技術,使用Gunicorn可以在基本不改變wsgi app代碼的前提下,大幅度提升wsgi app的性能。

 

看到上面的解決辦法,試着搭建安裝,發現gunicorn不支持Windows系統,坑啊,早知道這樣就買一個Linux服務器。

使用gunicorn報錯信息:

複製代碼
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。)

 

至於具體怎麼運用,能夠查看上面文章介紹,也能夠參見下文的具體使用代碼。

 

 


2 具體實現

看到下面具體實現代碼,會讓你們感嘆,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})

# 接
口收到多個參數
@app.route('/users/<page>/<count>', methods=['GET'])
def get_user_list(page, count):
return jsonify({'page': page, 'count': count})

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

相關文章
相關標籤/搜索