python実装wsgiインタフェースはhttpサービス応答httpリクエスト(コード言語間データインタラクション)を提供する

7728 ワード

前回Javaがrestful APIがhttpサービスを提供してphpとデータのインタラクションを行うことをどのように実現するかについて述べましたが、python言語がhttpサービスをどのように提供して言語間データのインタラクションを実現するかについてお話しします.同様に,実際のニーズ要件に基づいて,異なるキーワードに基づいてリポジトリ内の対応するマッチング情報を推奨する必要がある.(機械自身に分析推薦をさせるには、深さ学習の部分監督アルゴリズムと組み合わせて実現する必要がある.)アルゴリズム部分はpythonで行う必要があることは明らかであり、表示はphpで生成されたページを通じてユーザーにデータを表示する.この編ではphpとpythonが対話するプロセス実現について述べる(深さ学習アルゴリズムの部分は別の文章で具体的に説明します).では、pythonがユーザーのhttpリクエストにどのように応答しているかを見てみましょう.複雑な機能は必要ないので、pythonがhttpサービスを実現するフレームワークを探すのではなく、python言語が持参したwsgiインタフェースを使用してhttpリクエストに応答します.インタフェースを実現するコードは以下の通りです.
import json
import time
from wsgiref.simple_server import make_server
from PathDispatcher import PathDispatcher
from loadData import loadData
from retrieve import retrieve

_hello_resp = '''\

  
     Hello {name}
   
   
     

Hello {name}!

'''
def hello_world(environ, start_response): start_response('200 OK', [('Content-type', 'text/html')]) params = environ['params'] resp = _hello_resp.format(name=params.get('name')) yield resp.encode('utf-8') def match_info(environ, start_response): start_response('200 OK', [('Content-type', 'text/html')]) params = environ['params'] load = loadData() content = load.getTaskInfo(params.get('id')) deal = retrieve() resp = json.dumps(deal.getMatchInfos(content),ensure_ascii=False) yield resp.encode('utf-8') def set_model(environ, start_response): start_response('200 OK', [('Content-type', 'text/html')]) deal = retrieve() resp = deal.setModel() yield resp.encode('utf-8') _localtime_resp = '''\ ''' def localtime(environ, start_response): start_response('200 OK', [('Content-type', 'application/xml')]) resp = _localtime_resp.format(t=time.localtime()) yield resp.encode('utf-8') if __name__ == '__main__': # Create the dispatcher and register functions dispatcher = PathDispatcher() dispatcher.register('GET', '/hello', hello_world) dispatcher.register('GET', '/getInfo', match_info) dispatcher.register('GET', '/setModel', set_model) dispatcher.register('GET', '/localtime', localtime) # Launch a basic server httpd = make_server('', 8080, dispatcher) print('Serving on port 8080...') httpd.serve_forever()

pythonが正しいurlアクセスパスを識別するアダプタコードは、次のとおりです.
import cgi

def notfound_404(environ, start_response):
    start_response('404 Not Found', [ ('Content-type', 'text/plain') ])
    return [b'Not Found']

class PathDispatcher:
    def __init__(self):
        self.pathmap = { }

    def __call__(self, environ, start_response):
        path = environ['PATH_INFO']
        params = cgi.FieldStorage(environ['wsgi.input'],
                                  environ=environ)
        method = environ['REQUEST_METHOD'].lower()
        environ['params'] = { key: params.getvalue(key) for key in params }
        handler = self.pathmap.get((method,path), notfound_404)
        return handler(environ, start_response)

    def register(self, method, path, function):
        self.pathmap[method.lower(), path] = function
        return function

これで簡単なhttpサービスを実現できます.8080ポートからのhttpリクエストを傍受します.同じようにコードをサーバに置いて実行する必要があります.同様に、php側がこのhttpサービスにどのようにアクセスして自分の欲しいデータを取得するかを見てみましょう(実際にはJava,CurlGet()とHTTPリクエストを送信してurlにパラメータを入れればいいのです)
$base_url = "http://".SEARCH_SERVER."/searchOp/myresource/getUserList?".urldecode($condition);
        $info = CurlGet($base_url);

CurlGet()関数の中のコードを知らない人は私の前のブログを見てもいいです.ここでは余計なことは言いません.これでデータインタラクションが完了します.markちょっと、君と励まして~