由於先前在醫院收集的資料都是拍照得到的處方圖片,而需要用到的是處方的文字形式。因此這兩個星期寫了個小程式把伺服器的圖片顯示給使用者(到時候請一些人),讓使用者根據圖片錄入文字訊息。
之前都是用java寫web,想到自己最近學機器學習要用python,所以用python來寫一下,此外,因為想用點新東西,也介於程式比較小,所以考慮用mongodb來存儲(雖然確實沒有必要)。
基本架構是這樣:(後台語言)python +(web框架和網頁伺服器)tornado + (資料庫)mongodb +(進程管理)supervisor + (反向代理)nginx
(1)python:我是看廖學峰的python教學
#學了一些基本的語句,然後做的時候不懂再查。
(2)tornado:我是看這個教學開始學的
#tornado用起來特別快,它既可以像spring裡轉發器那樣直接映射請求,又可以像tomcat那樣直接監聽某個端口的http請求,這些東西tornado都幫我們做好了,我們只需要書寫get和post方法就可以了。
其它的就跟java web裡面差不多了。沒有springMVC和hibernate的框架,可以自己在python套件裡面分層controller, service, dao。
(3)mongodb:非關係型資料庫,對於一張表(mongodb裡叫collection集合)的每一行資料(mongodb裡叫document文檔)沒有要求統一相同的欄位名,可多可少,參差不齊。還有一點就是不支援事務,在python中執行多個讀寫語句的時候沒辦法回滾,所以要自己想辦法在程式中防止並發導致的問題。
例如我需要從collection中find一個status為0的document出來並update成1,代表用戶正在查看,用戶進行修改後,然後設定status為2之後再放回去,在這裡0代表未瀏覽,1代表正在瀏覽,2代表已修改。這時候可能有許多用戶同時取到了這個status為0的數據,這就違背了我們的意願,讓很多人對同一個數據進行了修改。可以考慮直接update_one把某個document的status由0改為1,然後增加一個唯一字段來標識這個document,用這個唯一字段來find到document,這個時候別的用戶是無法取到該document的,因為update_one的時候會上鎖,別人拿不到這條資料。
(4)supervisor:supervisor是用python開發的進程管理程序,可以將普通的指令變成後台的守護進程,並且監控進程狀態。
安裝好後可以在/etc/supervisor/conf.d目錄下新增設定檔printprescription.conf,設定範例如下
[program:printprescription] #设置守护进程名 command = python /home/liaohuqiang/Code/printprescription/main2.py #设置执行命令 autorstart=true #设置随supervisor的启动而启动 stdout_logfile = /home/liaohuqiang/Code/printprescription/printprescription.log #设置日志路径
設定完成後,可開啟,關閉和重新啟動supervisor服務。可以用supervisorctl status查看進程狀態,也可以在相關日誌檔查看錯誤訊息
sudo /etc/init.d/supervisor start sudo /etc/init.d/supervisor stop sudo /etc/init.d/supervisor restart<br><br>sudo supervisorctl status printprescripton<br>vim cat /var/log/supervisor/xxx.log
#(5)nginx:nginx用於反向代理,可以監控80端口,把相應的請求轉發到別的主機以及別的端口上,這裡我們顯示的圖片的路徑不在tornado的static中(static用來存放js和css等前端靜態資源),而是在伺服器另外的位置,所以可以透過nginx的轉送來取得圖片。另一方面,一般不會暴露其它連接埠(例如tornado監聽的8001連接埠)給用戶,所以用nginx來轉送。此外,location /static/指令告訴nginx直接提供靜態目錄文件,而不再代理請求到tornado,nginx可以比tornado更有效率地提供靜態文件。
安裝好nginx後,查看相關設定文件,發現這句話:include /etc/nginx/sites-enabled/*。可以在這個目錄下新建設定檔進行設定
cat /etc/nginx/nginx.conf<br>sudo touch /etc/nginx/sites-enabled/default2
配置範例如下,要注意的是最下面的http://127.0.0.1:8001/ 這裡最後一個斜杠如果不打,實際上會加上上面的printprescription,用戶訪問”主機/printprescription"就相當於存取"主機:8001/printprescription「了,由於自己在tornado上映射的是主機:8001/的請求,所以這個時候會出現404。
<span style="color: #000000"> upstream frontends { server </span><span style="color: #800080">222.222</span>.<span style="color: #800080">222.222</span>:<span style="color: #800080">8000</span><span style="color: #000000">; server </span><span style="color: #800080">222.222</span>.<span style="color: #800080">222.222</span>:<span style="color: #800080">8001</span><span style="color: #000000">; } server { listen </span><span style="color: #800080">80</span><span style="color: #000000">; location </span>/<span style="color: #000000"> { proxy_read_timeout </span><span style="color: #800080">1800</span><span style="color: #000000">; proxy_pass_header Server; proxy_set_header Host $http_host; proxy_redirect off; proxy_set_header X</span>-Real-<span style="color: #000000">IP $remote_addr; proxy_set_header X</span>-<span style="color: #000000">Scheme $scheme; proxy_pass http:</span><span style="color: #008000">//</span><span style="color: #008000">frontends;</span> <span style="color: #000000"> } location </span>/doctorAfter/<span style="color: #000000"> { #配置图片路径 root </span>/home/<span style="color: #000000">wenserver; } location </span>/static/<span style="color: #000000"> { #配置前端静态资源路径 root </span>/home/xxx/Code/printprescription/<span style="color: #000000">view; } location </span>/printprescription/<span style="color: #000000"> { proxy_read_timeout </span><span style="color: #800080">1800</span><span style="color: #000000">; proxy_pass_header Server; proxy_set_header Host $http_host; proxy_redirect off; proxy_set_header X</span>-Real-<span style="color: #000000">IP $remote_addr; proxy_set_header X</span>-<span style="color: #000000">Scheme $scheme; proxy_pass http:</span><span style="color: #008000">//</span><span style="color: #008000">127.0.0.1:8001/;</span> <span style="color: #000000"> } }</span>
(6)opencv:一个计算机视觉库,实现了图像处理和计算机视觉方面的很多通用算法。由于之前采集数据的时候在处方图片数据中混杂了人脸图片,所以采用oepncv里的算法检测人脸,如果是人脸则删除该记录。然而还是会残留一些人脸图片,需要人工清洗,这个数据好像之前有师兄清洗过,到时候拿过来重构一下数据库。
ps:安装opencv的时候imshow报错,虽然imshow用不到,但是强迫症使然,搞了我一天,来来回回装了十多次,最后还是没搞定,真是心力交瘁,特想吐嘈:垃圾opencv!毁我青春!颓我精神!耗我时间!磨我意志!浪费人生!!!
好吧我就随便说说,回头还要靠它干活。
cv2.error: /io/opencv/modules/highgui/src/window.<span style="color: #0000ff">cpp</span>:<span style="color: #800080">583</span>: error: (-<span style="color: #800080">2</span>) The <span style="color: #0000ff">function</span> is not implemented. Rebuild the library with Windows, GTK+ <span style="color: #800080">2</span>.x or Carbon support. If you are on Ubuntu or Debian, <span style="color: #0000ff">install</span> libgtk2.<span style="color: #800080">0</span>-dev and <span style="color: #0000ff">pkg-config</span>, <span style="color: #0000ff">then</span> re-run cmake or configure script <span style="color: #0000ff">in</span> <span style="color: #0000ff">function</span> cvShowImage
以上是ubuntu下python+tornado+supervisor+nginx部署的詳細內容。更多資訊請關注PHP中文網其他相關文章!