四、基於Flask的Python和C#交互(中篇)


1.Flask環境安裝

  首先,進行Flask相應依賴庫的環境安裝(python這些我就不提了)。最基本的一些依賴庫還是需要我們進行安裝的,如下圖所示。直接本地安裝的話就照這個安裝,離線下載的話就下載好對應的*.whl文件依次安裝即可,其他用Pycharm啥的你就直接找Flask安裝就得了,我也不多介紹。

 

2.Flask腳本

  簡單的創建一個Python程序,暫定為CreateFlask.cs。代碼如下,網絡地址為127.0.0.1,若是遠程調用則該處需要更改為0.0.0.0。

  ##遠程訪問的話,設置端口為host=0.0.0.0##
  ##重點## 0.0.0.0表示任意地址,不能直接使用,使用時應該使用一個確定地址##
  ##本地仍舊是訪問http://127.0.0.1:8000/,遠程訪問的話就把0.0.0.0替換成服務器的IP地址##

# !/usr/bin/python
# -*- coding: UTF-8 -*-
# python服務器如果需要訪問靜態的文件,都需要放到static這個指定的文件夾。


from flask import Flask, jsonify, request
from flask import render_template
from wtforms import StringField, Form
from wtforms.validators import DataRequired
import AddNum


app = Flask(__name__)
app.logger.info('Finished Start Flask!')


# 開始數據轉移
@app.route('/add/', methods=['POST'])
def startTransfer(name=None):
    if request.method == 'POST':
        receiveData = request.data.decode('utf-8')    # 為了兼容中文輸入
        para = str(receiveData)
        print(para)        #輸出接收到的信息
        array = str(para).split('#')
        sum = AddNum.Add(array[1], array[2])
        return str(sum)


if __name__ == '__main__':
    app.run(host='127.0.0.1', port=8000, debug=False, threaded=True)
    # debug=True 時設置的多線程無效
    # 多線程和多進程功能只能開一個     1.processes=True      2.threaded=True

 

#!/usr/bin/python
# -*- coding: UTF-8 -*-

def Add(para1,para2):
    return int(para1)+int(para2)

  

  如下圖所示,啟動FLask服務器成功!

 

 

3.C#程序 

   簡單的建立一個window窗體進行編輯。添加控件和響應事件,如下圖所示,Url是功能網址;輸入參數后點擊開始計算,成功輸出結果。

   

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace FlaskClient
{
    public partial class FlaskClient : Form
    {
        public FlaskClient()
        {
            InitializeComponent();
        }

        private void buttonStart_Click(object sender, EventArgs e)
        {
            string log = "";//錯誤信息
            string Url = this.textBoxUrl.Text;//功能網址
            string add1 = this.textBoxAdd1.Text;
            string add2 = this.textBoxAdd2.Text;
            string jsonParams = "#" + add1 + "#" + add2 + "#";
            string result = RequestsPost(Url, jsonParams);
            if (result == null)
            {
                log = "Failed to Connect Flask Server!";
            }
            else
            {
                if (result.Contains("default"))
                {
                    log = "There is an error running the algorithm." + "\r\n" + result;
                }
                else
                {
                    this.textBoxSum.Text = result;
                    log = "Test Successed!";
                }
            }
            MessageBox.Show(log);
        }

        /// <summary>
        /// 通過網絡地址和端口訪問數據
        /// </summary>
        /// <param name="Url">網絡地址</param>
        /// <param name="jsonParas">json參數</param>
        /// <returns></returns>
        public string RequestsPost(string Url, string jsonParas)
        {
            string postContent = "";
            string strURL = Url;
            //創建一個HTTP請求  
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strURL);
            //Post請求方式  
            request.Method = "POST";
            //內容類型
            request.ContentType = "application/json";
            //設置參數,並進行URL編碼 

            string paraUrlCoded = jsonParas;//System.Web.HttpUtility.UrlEncode(jsonParas);   

            byte[] payload;
            //將Json字符串轉化為字節  
            payload = System.Text.Encoding.UTF8.GetBytes(paraUrlCoded);
            //設置請求的ContentLength 
            request.ContentLength = payload.Length;

            //發送請求,獲得請求流 
            Stream writer;
            try
            {
                writer = request.GetRequestStream();//獲取用於寫入請求數據的Stream對象
            }
            catch (Exception)
            {
                writer = null;
                MessageBox.Show("連接服務器失敗!");
                return null;
            }
            //將請求參數寫入流
            writer.Write(payload, 0, payload.Length);
            writer.Close();//關閉請求流
            HttpWebResponse response;
            try
            {
                //獲得響應流
                response = (HttpWebResponse)request.GetResponse();
            }
            catch (WebException ex)
            {
                response = ex.Response as HttpWebResponse;
                postContent = "default: The response is null." + "\r\n" + "Exception: " + ex.Message;
            }
            if (response != null)
            {
                try
                {
                    Stream s = response.GetResponseStream();
                    StreamReader sRead = new StreamReader(s);
                    postContent = sRead.ReadToEnd();
                    sRead.Close();
                }
                catch (Exception e)
                {
                    postContent = "default: The data stream is not readable." + "\r\n" + e.Message;
                }
            }
            return postContent;//返回Json數據
        }
    }
}

 

   初始代碼就這樣了,后續其他功能擴展也就在這個基礎上進行就可以了,C#這邊只需要添加相應的Url和輸入參數即可。Flask腳本那邊就增加對應的路由,搭配起來操作不會太麻煩。下篇會講一下Flask的主要用途,用於界面設計的搭配,這塊的話就完全可以去除掉C#的用處,從網頁端即可進行服務器的一些操作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM