WordPress 调用 Python 服务
在上一篇文章介绍了如何通过 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 获取的结果了。