如何部署:ubuntu | apache | python | C++ | mysql

如何部署:ubuntu | apache | python | C++ | mysql

如果您想创建一个非平凡的网站和/或网络服务该怎么办?

如何部署生产服务器 Apache,其中使用 python 作为前端、使用 C++ 作为后端并使用 MySQL 作为持久性?

你应该使用什么胶水?

如何配置所有这些小东西?

常用术语:

LAMP 堆栈 = ubuntu大号inux +A帕赫 +ySQL +ython 部署

LAMP-C++ = 使用 C++ 的 LAMP 堆栈部署

常见免责声明:

本指南远非完整或理想,但我想给社区一些回报。我希望它要么能帮助人们,要么至少能创造一个讨论此类部署的导火索。我想澄清的是,python/c++ 组合选择超出了本讨论的范围。据我所知,它是业界感兴趣的部署之一,或者至少能提供大量经验。

公共堆栈:

  • Ubuntu 14.04.1 x64(lsb_release -a
  • Apache 2.4.7,构建于 2014 年 7 月 22 日(apache2 -v
  • mod_wsgi 2.7 ( cd /usr/lib/apache2/modules/; find . -name "*wsgi*")
  • python 2.7.6(python -V
  • Boost.Python 又名 libboost_python-py27.so.1.54.0 ( cd /usr/lib; find . -name "*boost*";)
  • GCC 4.8.2(gcc -v
  • GNU Make 3.81(make -v
  • Oracle Connector/C++ 7.1.1.3 又名 libmysqlcppconnd ( cd /usr/lib; find . -name "*mysqlcppconn*")
  • mysql 14.14(mysql -V

看起来有点可怕,所以我将一步一步描述。

常见先决条件:

  • 安装了 Ubuntu 14.04 x64(mb 适用于其他,但是我只测试了 14.04)
  • 你知道 Linux 的基础知识
  • 您已安装 GCC 和 GNU make ( sudo apt-get install gcc gcc-c++; sudo apt-get install build-essential;)
  • mysite.com 应该替换为您为网站选择的名称
  • MY_PC 应该替换为您的 PC 的名称,如果没有,请忽略。

答案1

选项:

  1. 选项 1 ->LAMP-C++ 与 web.py

    这是一个相当简单的部署选项,非常适合编写几乎没有或没有 GUI 的 Web 服务的情况。

    • web.py 0.37 ( pip list | grep web.py)
    • stackoverflow 上的 web.py 信息 ->关联
  2. 选项 2 ->LAMP-C++ 与 Django 和 Mezzanine

    如果您想创建一个网站,这可能是一个选择,可能仍包含服务部分。框架 web.py 仍可用于辅助任务,但大部分前端工作将由 Django 和基于它的 CMS Mezzanine 管理。Mezzanine 以基于 Django 构建的优秀 CMS 框架而闻名,可用于快速构建内容驱动的网站。

    • Django 1.6.1(pip list | grep Django
    • 夹层 3.1.10(pip list | grep Mezzanine

答案2

LAMP-C++ 与 web.py

git repo 中的所有文件 ->关联

1)网络:

  • 如果您想在家庭子网 (192.168.xxx.xxx IP-s) 上查看您的服务/站点,那么您应该确保 IP 地址稳定。我有一台路由器,它有一个内置的 DHCP 服务器,可以根据先连接的设备为设备提供家庭子网 IP-s。有两种方法可以解决这个问题:您可以设置设备以在家庭子网中具有首选 IP,或者您可以在路由器上配置 DHCP 例外(例如通过 Web 界面,192.168.1.1)。

  • 配置完成后(或者根据您的路由偏好,您不需要配置),您可以使用以下方式识别计算机的 IP 地址ifconfig

  • 更新 /etc/hosts 以使您的开发机器上有正确的 DNS 解析:

    #loopback
    127.0.0.1       localhost    #default
    127.0.1.1       MY_PC        #if your PC has a name
    
    #home subnet
    #192.168.1.2    mysite.com   #ethernet IP
    192.168.1.10    mysite.com   #wifi IP
    

2)阿帕奇

  • 安装:

    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get install apache2
    
  • 填写配置(Apache 2.4 与 Apache 2.2 的配置布局不同):

    cd /etc/apache2 && ll
    
  • apache2.conf,附加(稍后将需要 wsgi):

    # to manage python import statements in python WSGI wrapper
    WSGIPythonPath /path/to/work/www/mysite:/path/to/work/myproject/myproject_back
    
    # server name
    ServerName mysite.com
    
  • 端口.conf:

    # sets Apache listen on port 80
    Listen *:80
    
  • 站点可用/000-默认.conf

    备份后我删除了它。没有它我的网站在根 URL mysite.com/ 处可见。

  • sites-available/mysite.com.conf (恰好包含“.com”部分!!!):

    <VirtualHost 0.0.0.0:80>
    
    WSGIScriptAlias / /path/to/wsgi/entry/point/script/
    
    <Directory /path/to/work/>
        Require all granted
        Options Indexes FollowSymLinks
    </Directory>
    
    ServerName mysite.com
    ServerAlias www.mysite.com
    DocumentRoot /path/to/work/www/mysite/
    
    <Directory /path/to/work/www/mysite/>
        Require all granted
        Options Indexes FollowSymLinks
    </Directory>
    
    # to serve static content
    Alias /static /path/to/work/www/mysite/static/
    
    #for wsgi script, if you intend ro use .py extension
    AddType text/html .py
    
    </VirtualHost>
    
  • 检查您网站目录的权限。

  • 添加您的网站:

    sudo a2ensite mysite.com
    
  • 重新启动 apache2 服务:

    sudo service apache2 restart
    
  • 检查 apache2 是否正在运行:

    ps ax | grep apache2
    
  • 检查 apache 是否在端口 80 上侦听任何人的连接:

    sudo netstat -anp | grep apache
    

    输出如下:

    tcp6    0     0 :::80      :::*       LISTEN      1996/apache2
    

3) mod_wsgi

sudo apt-get install libapache2-mod-wsgi

此后,您应该在目录 /etc/apache2/mods-enabled 中拥有 wsgi.conf 和 wsgi.load。

4)安装python

sudo apt-get install python
sudo apt-get install python-pip

5)安装 web.py(webpy.org 网站已被替换为http://webpy.github.io/

sudo pip install web.py

6)安装 boost (autoremove 帮助我解决了损坏的软件包问题,以防万一):

sudo apt-get autoremove
sudo apt-get install libboost-all-dev

7)安装mysql:

关联

创建一个数据库测试,表 hello,其中包含 INT id 和 VARCHAR(100) msg​​,并在其中插入“Hello world!”。如果您是 mysql 新手,上面的链接在底部有一些关于如何实现此目的的资源。

顺便说一句,Oracle 为 mysql 制作了一个免费的 GUI,它被称为 MySQL Workbench,这里。您需要 Oracle 注册(免费)才能下载它。

8)从以下位置安装 Oracle Connector/C++这里,安装说明这里。他们目前没有 .deb 包,所以我从源代码构建了它,只需 3 个 shell 命令,没有任何麻烦。您需要 Oracle 注册(免费)才能下载它。

9) 为简单的‘Hello World’编写大量 python 和 C++ 代码,该代码通过 python 和 C++ 进入 MySQL。

  • 我有以下目录结构~/work

    work
    |
    +-www
    | |
    | +-mysite@ [symlink to ../myproject/mysite dir, for apache and neatness]
    |
    +-mysite
    | |
    | +-myproject_front.py [that's WSGI entry point]
    | +-gateway_front.py [in here I import wrapped C++]
    | +-__init__.py [to treat dir as python module]
    |   
    +-mysite_back [c++ backend is in separate folder]
      |
      +-gateway_back.cpp [Boost.Python wrapping code]
      +-hello_mysql.cpp [adapter to DB]
      +-gateway_back.o [object file after compilation]
      +-hello_mysql.o [object file after compilation]
      +-gateway_back.so [this will be a module for python]
      +-Makefile [cause Boost.Python works w/ python by an .so object]
    

    除了 (2) 中的 apache2 配置和 ~/.bashrc 和 ~/.bash_aliases 配置之外,这就是您需要接触的所有文件。

  • 更新 LD 和 PYTHON 的 .bashrc PATH 环境变量:

    # PATH env vars
    export PATH=$PATH:/usr/lib/x86_64-linux-gnu
    export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/lib:/usr/local/lib
    export PYTHONPATH = $PYTHONPATH:\
    /path/to/work/:\
    /path/to/work/myproject/:\
    /path/to/work/myproject/mysite/:\
    /path/to/work/myproject/myproject_back/:\
    /path/to/work/www:\
    /path/to/work/www/mysite/
    
  • 在 ~/.bash_aliases 中创建一个别名,以便从 shell 中获取“Hello World”[可选]

    alias wget_oq='wget --timeout=3 -O - -q'
    
    hello()
    {
      if [ "$1" == "get" ] ; then
        wget_oq "$2" | cat
      fi
    }
    

    别忘了source ~/.bashrc ~/.bash_aliases

    复制粘贴更多代码后,你应该能够使用命令获取 MySQL 存储的“Hello World”hello get mysite.com

  • 编写python代码:

  • 在里面.py:

  • myproject_front.py:[在此处指向 apache2 配置的 WSGIScriptAlias]

    import web             #web.py framework
    import gateway_front   #python adapter to c++
    
    urls = (
        '/.*', 'hello',    #url pattern for web.py to call hello.GET beneath
        )
    
    class hello:
        def GET(self):  
            #some browsers don't like plain text, so I use html
            web.header( 'Content-type', 'text/html' )  
            g = gateway_front.Gate() # get gateway to c++
            s = g.hello()            # get 'Hello World' message
            return str(s)            # return it as a HTTP response
    
    #sets web.py's func as WSGI entry point
    application = web.application(urls, globals()).wsgifunc() 
    
    # to test from console
    def main():
        g = backend.Gate()
        s = g.getDefaultQuote()
        print s
    
    if __name__ == '__main__':
        main()
    
  • 网关前端.py:

    import sys
    import gateway_back # .so object, written in C++ with Boost.Python
    
    #simple singletone
    class Gate(object):
        _instance = None
        def __new__(cls, *args, **kwargs):
            if not cls._instance:
                cls._instance = super(Gate, cls).__new__(
                                    cls, *args, **kwargs)
            return cls._instance
        def hello(self):
            return gateway_back.hello() #take hello from c++ backend
    
    # to test from console
    def main():
        g = Gate()
        s = g.hello()
        print s
    
    if __name__ == '__main__':
        main()
    
  • 编写 C++ 代码:

  • 网关后台.cpp:

    #include <boost/python.hpp>
    
    extern char const* hello();
    
    BOOST_PYTHON_MODULE(gateway_back)
    {
      using namespace boost::python;
      def("hello", hello);
    }
    
  • 你好mysql.cpp:

    这是从 Oracle 官方 Connector/C++ 文档中摘录的,关联,并稍作修改。

    #include <stdlib.h>
    #include <iostream>
    #include <string>
    
    #include "mysql_connection.h"
    
    #include <cppconn/driver.h>
    #include <cppconn/exception.h>
    #include <cppconn/resultset.h>
    #include <cppconn/statement.h>
    
    using namespace std;
    
    char const* hello()
    try {
      sql::Driver *driver;
      sql::Connection *con;
      sql::Statement *stmt;
      sql::ResultSet *res;
    
      /* Create a connection */
      driver = get_driver_instance();
    
      // MySQL IP address and your username
      con = driver->connect("tcp://127.0.0.1:3306", "username", "username");
      /* Connect to the MySQL test database */
      con->setSchema("test"); //your db name
    
      stmt = con->createStatement();
      res = stmt->executeQuery("SELECT * from hello;");
    
      string result;
    
      while (res->next()) {
        /* Access column data by alias or column name */
        result = res->getString("msg");  // field in db with actual 'Hello World'
        return result.c_str();
      }
      delete res;
      delete stmt;
      delete con;
    
    } catch (sql::SQLException &e) {
      cerr << "# ERR: SQLException in " << __FILE__;
      cerr << "(" << __FUNCTION__ << ") on line "
         << __LINE__ << endl;
      cerr << "# ERR: " << e.what();
      cerr << " (MySQL error code: " << e.getErrorCode();
      cerr << ", SQLState: " << e.getSQLState() << " )" << endl;
    }
    
  • 生成文件:

    # location of the Python header files
    PYTHON_VERSION = 2.7
    PYTHON_INCLUDE = /usr/include/python$(PYTHON_VERSION)
    
    # location of the Boost Python include files and library
    BOOST_INC = /usr/include
    BOOST_LIB = /usr/lib/x86_64-linux-gnu
    
    #compile mesh classes
    TARGET = gateway_back
    COTARGET = hello_mysql
    
    .PHONY: all clean
    
    all: $(TARGET).so
    
    clean:
            rm -rf *.o;
            rm $(TARGET).so
    
    # (!!!) broke the string for good formatting @ askubuntu
    # important: linking against boost.python, python and connector/c++
    # order might be crucial: had to place -lmysqlcppconn at the end
    $(TARGET).so: $(TARGET).o $(COTARGET).o
            g++ -shared -Wl,--export-dynamic $(TARGET).o $(COTARGET).o 
            -L$(BOOST_LIB) -lboost_python-py27 
            -L/usr/lib/python$(PYTHON_VERSION)/config 
            -lpython$(PYTHON_VERSION) -o $(TARGET).so -lmysqlcppconn
    
    # (!!!) broke the string for good formatting @ askubuntu
    # important: boost and python includes
    $(TARGET).o: $(TARGET).cpp $(COTARGET).cpp
            g++ -I$(PYTHON_INCLUDE) -I$(BOOST_INC) -fPIC -c 
            $(TARGET).cpp $(COTARGET).cpp
    
  • make使用shell 命令将 C++ 代码构建到 gateway_back.so 中

  • 将浏览器指向您在步骤(1)和(2)中选择的 URL 或 IP 地址,或hello get <your url or IP Address>从控制台输入以获取“Hello”。

10)它会起作用。最终。)如果它不起作用,或者有人知道更好的方法,让我们讨论并扩展指南,特别是在请改正标记的地方。

答案3

LAMP-C++ 与 Django 和 Mezzanine

git repo 中的所有文件 ->关联

1)网络:

  • 如果您想在家庭子网 (192.168.xxx.xxx IP-s) 上查看您的服务/站点,那么您应该确保 IP 地址稳定。我有一台路由器,它有一个内置的 DHCP 服务器,可以根据先连接的设备为设备提供家庭子网 IP-s。有两种方法可以解决这个问题:您可以设置设备以在家庭子网中具有首选 IP,或者您可以在路由器上配置 DHCP 例外(例如通过 Web 界面,192.168.1.1)。

  • 配置完成后(或者根据您的路由偏好,您不需要配置),您可以使用以下方式识别计算机的 IP 地址ifconfig

  • 更新 /etc/hosts 以使您的开发机器上有正确的 DNS 解析:

    #loopback
    127.0.0.1       localhost    #default
    127.0.1.1       MY_PC        #if your PC has a name
    
    #home subnet
    #192.168.1.2    mysite.com   #ethernet IP
    192.168.1.10    mysite.com   #wifi IP
    

2)阿帕奇

  • 安装:

    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get install apache2
    
  • 填写配置(Apache 2.4 与 Apache 2.2 的配置布局不同):

    cd /etc/apache2 && ll
    
  • apache2.conf,附加(稍后将需要 wsgi):

    # server name
    ServerName mysite.com
    
  • 端口.conf:

    # sets Apache listen on port 80
    Listen *:80
    
  • 站点可用/000-默认.conf

    备份后我删除了它。没有它我的网站在根 URL mysite.com/ 处可见。

  • sites-available/mysite.com.conf (恰好包含“.com”部分!!!):

    <VirtualHost 0.0.0.0:80>
    
    # SERVER--------------------------------------
    
    ServerName mysite.com
    ServerAlias www.mysite.com
    DocumentRoot /path/to/work/www/mysite/
    
    # STATIC-------------------------------------
    
    Alias /robots.txt /path/to/work/www/mysite/static/robots.txt
    Alias /favicon.ico /path/to/work/www/mysite/static/favicon.ico
    
    Alias /static/ /path/to/work/www/mysite/static/
    
    # WSGI----------------------------------------
    
    WSGIDaemonProcess mysite.com processes=2 threads=15 display-name=%{GROUP} python-path=/path/to/work/:/home/sdd/work/myproject/:/path/to/work/myproject/mysite/:/path/to/work/myproject/backend/:/path/to/work/www/:/path/to/work/www/mysite/
    WSGIProcessGroup mysite.com
    
    WSGIScriptAlias / /path/to/work/www/mysite/wsgi.py/
    
    # DIRECTORIES---------------------------------
    
    <Directory /path/to/work/www/mysite/static/>
        Require all granted
        Options Indexes FollowSymLinks
    </Directory>
    
    <Directory /path/to/work/>
        Require all granted
        Options Indexes FollowSymLinks
    </Directory>
    
    <Directory /path/to/work/www/mysite/>
        <Files wsgi.py>
            Require all granted
        </Files>
        Options Indexes FollowSymLinks
    </Directory>
    
    # MISC----------------------------------------
    
    # add .py file type for mod_wsgi to start wsgi.py correctly
    AddType text/html .py
    
    </VirtualHost>
    
  • 检查您网站目录的权限。

  • 添加您的网站:

    sudo a2ensite mysite.com
    
  • 重新启动 apache2 服务:

    sudo service apache2 restart
    
  • 检查 apache2 是否正在运行:

    ps ax | grep apache2
    
  • 检查 apache 是否在端口 80 上侦听任何人的连接:

    sudo netstat -anp | grep apache
    

    输出如下:

    tcp6    0     0 :::80      :::*       LISTEN      1996/apache2
    

3) mod_wsgi

sudo apt-get install libapache2-mod-wsgi

此后,您应该在目录 /etc/apache2/mods-enabled 中拥有 wsgi.conf 和 wsgi.load。

4)安装python

sudo apt-get install python
sudo apt-get install python-pip

5)安装django

sudo pip install Django

6)安装 boost (autoremove 帮助我解决了损坏的软件包问题,以防万一):

sudo apt-get autoremove
sudo apt-get install libboost-all-dev

7)安装mysql:

关联

创建一个数据库测试,表 hello,其中包含 INT id 和 VARCHAR(100) msg​​,并在其中插入“Hello world!”。如果您是 mysql 新手,上面的链接在底部有一些关于如何实现此目的的资源。

顺便说一句,Oracle 为 mysql 制作了一个免费的 GUI,它被称为 MySQL Workbench,这里。您需要 Oracle 注册(免费)才能下载它。

然后,有用于 python 的 mysql 部分:

sudo apt-get install libmysqlclient-dev
sudo pip install MySQL-python

如果出现问题,请按照以下步骤操作 ->关联

8)从以下位置安装 Oracle Connector/C++这里,安装说明这里。他们目前没有 .deb 包,所以我从源代码构建了它,只需 3 个 shell 命令,没有任何麻烦。您需要 Oracle 注册(免费)才能下载它。

9)安装并配置Mezzanine

sudo pip install Mezzanine
cd work
mezzanine-project mysite

Mezzanine 安装指南建议您使用createdbmanage.pyrunserver包装器。对于数据库,我使用了不同的方法,对于服务器 - Apache 而不是 django dev 服务器。

在由 Mezzanine 创建的 mysite 目录中,在 local_config.py 中:

DATABASES = {
    "default": {
        # Add "postgresql_psycopg2", "mysql", "sqlite3" or "oracle".
        "ENGINE": "django.db.backends.mysql",
        # DB name or path to database file if using sqlite3.
        "NAME": "your_db_name",
        # Not used with sqlite3.
        "USER": "your_user",
        # Not used with sqlite3.
        "PASSWORD": "your_mysql_password",
        # Set to empty string for localhost. Not used with sqlite3.
        "HOST": "localhost",
        # Set to empty string for default. Not used with sqlite3.
        "PORT": "3306",
    }
}

比执行

python manage.py syncdb

这将在你的数据库旁边创建django表,创建于(7)

在 mezzanine-created mysite 目录中的 settings.py 中更改 ALLOWED_HOSTS:

ALLOWED_HOSTS = [
        '.mysite.com',
        '.mysite.com/test'
        ]

将以下内容添加到 urls.py:

url("^test/$", 'hello.test', name='test'),

紧接着urlpatterns += patterns('',行。这需要在 mysite/test/url 上以及 mysite.com url 上的夹层主页上进行纯文本服务输出。

10)收集静态文件

如果没有,请在 mysite 目录中创建 /static/ 子目录

有一个路径在 settings.py 配置(带有一些中间插件的 django 配置)部分,我们需要检查 STATIC_URL 设置并添加 django-admin 静态文件的路径

STATIC_URL = "/static/"

#additional static files' dirs
STATICFILES_DIRS = (
    "/usr/lib/python2.7/dist-packages/django/contrib/admin/static/admin",
)

现在我们可以将静态文件收集到一个地方 - 这就是 django 作者建议存储所有 css、js、txt 等内容

python manage.py collectstatic

11)现在我们需要填写python和C++代码

  • 我有以下目录结构~/work

    work
    |
    +-www
    | |
    | +-mysite@ [symlink to ../myproject/mysite dir, for apache and neatness]
    |
    +-mysite
    | |
    | +-deploy/    [mezzanine deploy stuff]
    | +-static/    [static files we collected]
    | +-fabfile.py [script that creates mezzanine-project]
    | +-hello.py   [script for testing service output]  
    | +-local_settings.py [mezzanine site-specific settings]
    | +-settings.py [django settings with mezzanine addon]
    | +-manage.py   [management script wrapping calls to django admin functions]
    | +-urls.py     [url patterns]
    | +-wsgi.py     [wsgi entry point]
    | +-gateway.py  [in here I import wrapped C++]
    | +-__init__.py [to treat dir as python module]
    |   
    +-backend [c++ backend is in separate folder]
      |
      +-gateway.cpp [Boost.Python wrapping code]
      +-hello_mysql.cpp [adapter to DB]
      +-gateway_back.o [object file after compilation]
      +-hello_mysql.o [object file after compilation]
      +-gateway_back.so [this will be a module for python]
      +-Makefile [cause Boost.Python works w/ python by an .so object]
      +-__init__.py [to import backend into python app]
    

    除了 (2) 中的 apache2 配置和 ~/.bashrc 和 ~/.bash_aliases 配置之外,这就是您需要接触的所有文件。

  • 更新 LD 和 PYTHON 的 .bashrc PATH 环境变量:

    # PATH env vars
    export PATH=$PATH:/usr/lib/x86_64-linux-gnu
    export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/lib:/usr/local/lib
    export PYTHONPATH = $PYTHONPATH:\
    /path/to/work/:\
    /path/to/work/myproject/:\
    /path/to/work/myproject/mysite/:\
    /path/to/work/myproject/backend/:\
    /path/to/work/www:\
    /path/to/work/www/mysite/
    
  • 在 ~/.bash_aliases 中创建一个别名,以便从 shell 中获取“Hello World”[可选]

    alias wget_oq='wget --timeout=3 -O - -q'
    
    hello()
    {
      if [ "$1" == "get" ] ; then
        wget_oq "$2" | cat
      fi
    }
    

    别忘了source ~/.bashrc ~/.bash_aliases

    复制粘贴更多代码后,你应该能够使用命令获取 MySQL 存储的“Hello World”hello get mysite.com

  • 编写python代码:

  • 在里面.py:空,如果需要,可以在此处放置模块的任何初始化

  • wsgi.py:

    from __future__ import unicode_literals
    
    import os
    import sys
    
    PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
    sys.path.append( '/path/to/work/myproject/mysite' )
    
    os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
    
    from django.core.wsgi import get_wsgi_application
    application = get_wsgi_application()
    
  • hello.py:[在此处指向 apache2 配置的 WSGIScriptAlias]

    from django.http import HttpResponse
    
    import gateway
    
    def test(request):
        text = str( gateway.Gate().hello() )
        return HttpResponse( text, content_type="text/plain" )
    
    def main():
        g = gateway.Gate()
        s = g.getDefaultQuote()
        print s
    
    if __name__ == '__main__':
        main()
    
  • 网关.py:

    import sys
    import backend.gateway
    
    class Gate(object):
        _instance = None
        def __new__(cls, *args, **kwargs):
            if not cls._instance:
                cls._instance = super(Gate, cls).__new__(
                                    cls, *args, **kwargs)
            return cls._instance
        def hello(self):
            return backend.gateway.hello()
    
    def main():
        g = Gate()
        s = g.hello()
        print s
    
    if __name__ == '__main__':
        main()
    
  • 编写 C++ 代码:

  • 网关后台.cpp:

    #include <boost/python.hpp>
    
    extern char const* hello();
    
    BOOST_PYTHON_MODULE(gateway)
    {
      using namespace boost::python;
      def("hello", hello);
    }
    
  • 你好mysql.cpp:

    这是从 Oracle 官方 Connector/C++ 文档中摘录的,关联,并稍作修改。

    #include <stdlib.h>
    #include <iostream>
    #include <string>
    
    #include "mysql_connection.h"
    
    #include <cppconn/driver.h>
    #include <cppconn/exception.h>
    #include <cppconn/resultset.h>
    #include <cppconn/statement.h>
    
    using namespace std;
    
    char const* hello()
    try {
      sql::Driver *driver;
      sql::Connection *con;
      sql::Statement *stmt;
      sql::ResultSet *res;
    
      /* Create a connection */
      driver = get_driver_instance();
    
      // MySQL IP address and your username
      con = driver->connect("tcp://127.0.0.1:3306", "username", "username");
      /* Connect to the MySQL test database */
      con->setSchema("test"); //your db name
    
      stmt = con->createStatement();
      res = stmt->executeQuery("SELECT * from hello;");
    
      string result;
    
      while (res->next()) {
        /* Access column data by alias or column name */
        result = res->getString("msg");  // field in db with actual 'Hello World'
        return result.c_str();
      }
      delete res;
      delete stmt;
      delete con;
    
    } catch (sql::SQLException &e) {
      cerr << "# ERR: SQLException in " << __FILE__;
      cerr << "(" << __FUNCTION__ << ") on line "
         << __LINE__ << endl;
      cerr << "# ERR: " << e.what();
      cerr << " (MySQL error code: " << e.getErrorCode();
      cerr << ", SQLState: " << e.getSQLState() << " )" << endl;
    }
    
  • 生成文件:

    # location of the Python header files
    PYTHON_VERSION = 2.7
    PYTHON_INCLUDE = /usr/include/python$(PYTHON_VERSION)
    
    # location of the Boost Python include files and library
    BOOST_INC = /usr/include
    BOOST_LIB = /usr/lib/x86_64-linux-gnu
    
    #compile mesh classes
    TARGET = gateway
    COTARGET = hello_mysql
    
    .PHONY: all clean
    
    all: $(TARGET).so
    
    clean:
            rm -rf *.o;
            rm $(TARGET).so
    
    # (!!!) broke the string for good formatting @ askubuntu
    # important: linking against boost.python, python and connector/c++
    # order might be crucial: had to place -lmysqlcppconn at the end
    $(TARGET).so: $(TARGET).o $(COTARGET).o
            g++ -shared -Wl,--export-dynamic $(TARGET).o $(COTARGET).o 
            -L$(BOOST_LIB) -lboost_python-py27 
            -L/usr/lib/python$(PYTHON_VERSION)/config 
            -lpython$(PYTHON_VERSION) -o $(TARGET).so -lmysqlcppconn
    
    # (!!!) broke the string for good formatting @ askubuntu
    # important: boost and python includes
    $(TARGET).o: $(TARGET).cpp $(COTARGET).cpp
            g++ -I$(PYTHON_INCLUDE) -I$(BOOST_INC) -fPIC -c 
            $(TARGET).cpp $(COTARGET).cpp
    
  • make使用shell 命令将 C++ 代码构建到 gateway_back.so 中

  • 将浏览器指向您在步骤(1)和(2)中选择的 URL 或 IP 地址,或hello get <your url or IP Address>从控制台输入以获取“Hello”。

12) 结果。现在,如果所有操作都正确并且我没有遗漏任何东西,你应该得到以下结果:

  • www.mysite.com 上的夹层默认主页看起来很可爱
  • www.mysite.com/test 上的纯文本“hello world”(如果您想在网站旁边创建带有 API 的 Web 服务,则此部分是必需的)

PS 下一步该做什么:

  • 您可以python manage.py collecttemplates从 mysite 目录开始处理夹层模板

  • 您可以使用您的 mysql 登录名/密码登录到您的管理界面(mysite/admin)。

如果我们使用默认方式 - python manage.py createdb,则登录名/密码将是 admin/default。但我尝试按照我的方式进行操作,以便 django 与我现有的 mysql 帐户及其登录名/密码同步。这些与您登录 mysql 客户端或在 mysql_hello.cpp 中使用的相同。

您可以通过 mysite/admin 网络界面或manage.py changepassword your_user_name命令更改管理员密码。

使用 django-admin 实用程序和 manage.py 脚本管理 django 在官方 django 文档中有最好的描述 ->关联

相关内容