WordPress 调用 Python 服务

wordpress-access-python-app

在上一篇文章介绍了如何通过 uWSGI 集成 WordPress 和 Web.py,本篇文章以此为基础将进一步说明如何在 WordPress 中调用 Python 中的服务,其中的思路和方法可以应用在多种场景,比如 REST、XML-RPC、SOAP等。

首先按照上一篇文章的方法配置好 uWSGI 和 Nginx,然后分别增加 WordPress 客户端代码和修改 Python 服务端代码,两边的数据传递使用 JSON。

一、Python 服务端

import os
import sys
import web
import json
sys.path.append('/home/user/work/www/webpy/app')
os.environ['PYTHON_EGG_CACHE'] = '/home/user/work/www/webpy/.python-egg'
urls = (
  '/uwsgi-test', 'index'
)
app = web.application(urls, globals())
class index:
        def POST(self):
            user_data = json.loads(web.data())
            user_key = web.ctx.env.get('HTTP_X_PYTHON_KEY')
            if user_key =='1234567' and user_data['param'] == 'wordpress':
               return json.dumps({"txtstr": "Hello, World!"})
            else:
               return json.dumps({"txtstr": "Sorry, no data can be found!"})
if __name__ == "__main__": app.run()
application = app.wsgifunc()

为了说明方法,服务端使用了 HTTP 的方式处理响应,当然也可以构建较复杂的 XML-RPC、REST 等服务端。

二、WordPRess 客户端

为了方便介绍调用 Python 服务端的方法,使用了重载父主题页面模板的方式,实际上还可以开发小工具、短码、插件等客户端,请参考站内相关的文章。

首先按照这篇文章建立一个子主题,然后修改父主题的 Page 模板文件。

<?php
/*
Template Name: Call Python Service
Description: Custom page template that call python service to get something results.
*/
get_header();
?>
  <div id="primary" class="content-area">
    <main id="main" class="site-main">
    <h3>Call python service</h3>
      <?php
      $curl = curl_init();
      curl_setopt_array($curl, array(
        CURLOPT_URL => "http://127.0.0.1/uwsgi-test",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_MAXREDIRS => 2,
        CURLOPT_TIMEOUT => 10,
        CURLOPT_ENCODING => "gzip,deflate",
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_HTTPHEADER => array(
          "Content-type: application/json;charset='utf-8'",
          "Accept: application/json",
          "Accept-Encoding: gzip, deflate",
          "x-python-host: uwsgi.xyz",
          "x-python-key: 1234567"
        ),
      ));
      curl_setopt($curl, CURLOPT_POST, true);
      curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode(array('param' => 'wordpress')));
      $response = curl_exec($curl);
      $err = curl_error($curl);
      curl_close($curl);
      if ($err) {
        echo "Error: " . $err;
      } else {
        echo "Results from python: ";
        $jsonObj = json_decode($response);
        echo $jsonObj->{'txtstr'};
      }
      ?>
    </main>
    <?php get_sidebar( 'content-bottom' ); ?>
  </div>
<?php
get_sidebar();
get_footer();

完成后点击该模板的 URL,就可以看到从 Python 获取的结果了。

发表评论

邮箱地址不会被公开。 必填项已用*标注