Как развернуть: ubuntu | apache | питон | C ++ | mysql [closed]

Что делать, если вы хотите создать нетривиальный веб-сайт и / или веб-службу?

Как развернуть производственный сервер Apache с python для внешнего интерфейса и C ++ для внутреннего интерфейса и MySQL для обеспечения устойчивости?

] Какой клей использовать?

Как настроить все эти мелочи?

Общие термины:

LAMP-stack = ubuntu L inux + A pache + M ySQL + P развертывание ython

LAMP-C ++ = развертывание LAMP-стека с помощью C ++

Общий отказ от ответственности:

Это руководство далеко не полное или идеальное, но я хотел немного отплатить сообществу. Я надеюсь, что это либо поможет людям, либо, по крайней мере, создаст горячую точку для обсуждения такого типа развертывания. Я хочу уточнить, что выбор комбинации python / c ++ выходит за рамки этого обсуждения. AFAIK, это одно из развертываний, представляющих интерес в отрасли, или, по крайней мере, дает много опыта.

Общий стек:

  • Ubuntu 14.04.1 x64 ( lsb_release -a )
  • Apache 2.4.7, построен 22 июля 2014 г. ( apache2 -v )
  • mod_wsgi 2.7 ( cd / usr / lib / apache2 / modules /; find. -name "* wsgi *" )
  • python 2.7.6 ( python -V )
  • Boost.Python AKA 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 / C ++ 7.1.1.3 AKA 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 следует заменить на имя вашего ПК, если их нет, игнорируйте.
2
задан 5 December 2014 в 03:23

3 ответа

Опции:

  1. Опция 1-> C++ ЛАМПЫ с web.py

    Это - опция довольно простого развертывания, идеал для случая, когда Вы пишете веб-сервис с минимальным GUI.

    • web.py 0.37 (pip list | grep web.py)
    • web.py информация о stackoverflow-> ссылка
  2. Опция 2-> C++ ЛАМПЫ с Django и Дополнительным уровнем

    Это - опция, если Вы хотите сделать веб-сайт, возможно, все еще с запасной частью. Платформа web.py может все еще использоваться для вспомогательных задач, но объемом frontend задания будут управлять Django и Дополнительный уровень CMS на основе ее. Дополнительный уровень имеет репутацию быть хорошей Платформой CMS, созданной сверху Django для создания управляемых содержанием сайтов быстро.

    • Django 1.6.1 (pip list | grep Django)
    • Дополнительный уровень 3.1.10 (pip list | grep Mezzanine)
3
ответ дан 19 November 2019 в 22:30

C++ ЛАМПЫ с web.py

Все файлы, доступные в мерзавце repo-> ссылка

1) Сеть:

  • Если Вы хотите видеть свой сервис/сайт на домашнюю подсеть (192.168.xxx.xxx дюйм/с), то необходимо удостовериться, что IP-адреса стабильны. У меня есть маршрутизатор, который имеет встроенный сервер DHCP, который дает домашнего дюйм/с подсети устройствам на основе который соединенный сначала. Существует два способа решить эту проблему: можно установить, настраивают устройство, чтобы иметь предпочтительный IP в домашней подсети, или можно настроить исключения DHCP на маршрутизаторе (например, через веб-интерфейс, 192.168.1.1).

  • После конфигурации (или в случае, если Вам не был нужен ни один на основе Ваших предпочтений маршрутизации), можно определить IP-адрес компьютера с ifconfig

  • Обновите/etc/hosts, чтобы иметь корректное разрешение DNS на Вашей dev машине:

    #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) Apache

  • Установка:

    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
    
  • ports.conf:

    # sets Apache listen on port 80
    Listen *:80
    
  • sites-available/000-default.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
    
  • проверьте, что апач слушает на порте 80 на соединениях от любого:

    sudo netstat -anp | grep apache
    

    Вывод как:

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

3) mod_wsgi

sudo apt-get install libapache2-mod-wsgi

После этого у Вас должны быть wsgi.conf и wsgi.load в каталоге/etc/apache2/mods-enabled.

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) Повышение установки (автоудаляют, помогло мне с поврежденной проблемой пакетов, так на всякий случай):

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

7) Установка mysql:

ссылка

Создайте тест базы данных, таблица привет с идентификатором INT и VARCHAR (100) сообщение и вставьте 'Привет мир!' в него. Ссылка выше имеет некоторые ресурсы о том, как достигнуть этого внизу, если Вы плохо знакомы с mysql.

Между прочим, Oracle сделала свободный GUI для mysql, она назвала MySQL Workbench, здесь. Вам будет нужна регистрация Oracle (это свободно) загружать его.

8) Установите Коннектор/C++ Oracle отсюда, инструкции по установке здесь. У них нет .deb пакета на данный момент, таким образом, я создал его из источника, это были всего 3 команды оболочки и никакая боль. Вам будет нужна регистрация Oracle (это свободно) загружать его.

9) Запишите много 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]
    

    Это - все файлы, которых необходимо будет коснуться кроме конфигураций apache2 в (2) и ~/.bashrc и ~/.bash_aliases конфигурации.

  • Обновите свои .bashrc переменные окружения PATH для LD и Python:

    # 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 для получения 'Привет Мира' от [дополнительной] оболочки

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

    И не забывайте source ~/.bashrc ~/.bash_aliases!

    После Вас вставка копии дальнейший код необходимо смочь получить сохраненный MySQL 'Привет Мир' с командой hello get mysite.com

  • Напишите код Python:

  • init.py:

  • myproject_front.py: [укажите на WSGIScriptAlias apache2 конфигурации здесь]

    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()
    
  • gateway_front.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++:

  • gateway_back.cpp:

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

    Это было взято из официальной документации Коннектора/C++ Oracle, ссылки, и изменило немного.

    #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;
    }
    
  • Make-файл:

    # 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
    
  • встройте код C++ в gateway_back.so с make команда оболочки

  • укажите на свой браузер на URL или IP-адрес, который Вы выбрали на шагах (1) и (2) или типе hello get <your url or IP Address> от консоли для получения 'Привет'.

10) Это будет работать. В конечном счете.) Позволяют нам обсудить и развернуть руководство, если это не делает или если кто-то знает лучший путь, особенно в, исправьте отмеченные места.

0
ответ дан 2 December 2019 в 02:59

C++ ЛАМПЫ с Django и дополнительным уровнем

Все файлы, доступные в мерзавце repo-> ссылка

1) Сеть:

  • Если Вы хотите видеть свой сервис/сайт на домашнюю подсеть (192.168.xxx.xxx дюйм/с), то необходимо удостовериться, что IP-адреса стабильны. У меня есть маршрутизатор, который имеет встроенный сервер DHCP, который дает домашнего дюйм/с подсети устройствам на основе который соединенный сначала. Существует два способа решить эту проблему: можно установить, настраивают устройство, чтобы иметь предпочтительный IP в домашней подсети, или можно настроить исключения DHCP на маршрутизаторе (например, через веб-интерфейс, 192.168.1.1).

  • После конфигурации (или в случае, если Вам не был нужен ни один на основе Ваших предпочтений маршрутизации), можно определить IP-адрес компьютера с ifconfig

  • Обновите/etc/hosts, чтобы иметь корректное разрешение DNS на Вашей dev машине:

    #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) Apache

  • Установка:

    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
    
  • ports.conf:

    # sets Apache listen on port 80
    Listen *:80
    
  • sites-available/000-default.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
    
  • проверьте, что апач слушает на порте 80 на соединениях от любого:

    sudo netstat -anp | grep apache
    

    Вывод как:

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

3) mod_wsgi

sudo apt-get install libapache2-mod-wsgi

После этого у Вас должны быть wsgi.conf и wsgi.load в каталоге/etc/apache2/mods-enabled.

4) Python установки

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

5) Установка django

sudo pip install Django

6) Повышение установки (автоудаляют, помогло мне с поврежденной проблемой пакетов, так на всякий случай):

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

7) Установка mysql:

ссылка

Создайте тест базы данных, таблица привет с идентификатором INT и VARCHAR (100) сообщение и вставьте 'Привет мир!' в него. Ссылка выше имеет некоторые ресурсы о том, как достигнуть этого внизу, если Вы плохо знакомы с mysql.

Между прочим, Oracle сделала свободный GUI для mysql, она назвала MySQL Workbench, здесь. Вам будет нужна регистрация Oracle (это свободно) загружать его.

Затем существуют mysql части для Python:

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

И если что-то идет не так, как надо, следуйте за этим-> ссылка

8) Установите Коннектор/C++ Oracle отсюда, инструкции по установке здесь. У них нет .deb пакета на данный момент, таким образом, я создал его из источника, это были всего 3 команды оболочки и никакая боль. Вам будет нужна регистрация Oracle (это свободно) загружать его.

9) Установите и настройте Дополнительный уровень

sudo pip install Mezzanine
cd work
mezzanine-project mysite

Дополнительная руководство по инсталляции, чем предлагает, чтобы Вы использовали createdb и runserver от manage.py обертки. Для дб я использовал другой подход и для сервера - Apache а не django dev сервер.

В mysite dir, созданном Дополнительным уровнем, в 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)

измените ALLOWED_HOSTS в settings.py в созданном из дополнительного уровня mysite dir:

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

добавьте следующее к urls.py:

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

непосредственно после urlpatterns += patterns('', строка. это необходимо, чтобы иметь эксплуатационную мощность простого текста на mysite/test/URL вместе с дополнительной домашней страницей в URL mysite.com.

10) соберите статические файлы

создайте/static/subdir в Вашем mysite dir, если нет ни одного

существует раздел путей в конфигурации settings.py (который является конфигурацией django с некоторыми дополнительными дополнениями), мы должны проверить установку STATIC_URL и добавить путь к django-администратору статические файлы

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) Теперь мы должны заполнить код C++ и Python

  • У меня есть следующая структура каталогов в ~/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]
    

    Это - все файлы, которых необходимо будет коснуться кроме конфигураций apache2 в (2) и ~/.bashrc и ~/.bash_aliases конфигурации.

  • Обновите свои .bashrc переменные окружения PATH для LD и Python:

    # 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 для получения 'Привет Мира' от [дополнительной] оболочки

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

    И не забывайте source ~/.bashrc ~/.bash_aliases!

    После Вас вставка копии дальнейший код необходимо смочь получить сохраненный MySQL 'Привет Мир' с командой hello get mysite.com

  • Напишите код Python:

  • init.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: [укажите на WSGIScriptAlias apache2 конфигурации здесь]

    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()
    
  • gateway.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++:

  • gateway_back.cpp:

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

    Это было взято из официальной документации Коннектора/C++ Oracle, ссылки, и изменило немного.

    #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;
    }
    
  • Make-файл:

    # 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
    
  • встройте код C++ в gateway_back.so с make команда оболочки

  • укажите на свой браузер на URL или IP-адрес, который Вы выбрали на шагах (1) и (2) или типе hello get <your url or IP Address> от консоли для получения 'Привет'.

12) Результат. Теперь, если бы все было сделано правильно и если бы я не пропустил что-то, то у Вас должно быть следующее:

  • Дополнительная домашняя страница по умолчанию, выглядящая милой на www.mysite.com
  • простой текст 'привет мир' по www.mysite.com/test (эта часть необходима, если Вы хотите сделать веб-сервис с API вместе с сайтом),

P.S., что сделать затем:

  • можно использовать python manage.py collecttemplates от mysite dir, чтобы начать работать над дополнительными шаблонами

  • можно войти администраторский интерфейс (mysite/admin) с mysql входом в систему/паролем.

если мы использовали путь по умолчанию - python manage.py createdb, чем вход в систему/пароль был бы администратор/значение по умолчанию. но я пытался сделать все моим путем так, чтобы django синхронизировал с моей существующей учетной записью mysql, и это - login/pw. Это то же, с которым Вы входите в систему в mysql клиент или который Вы используете в mysql_hello.cpp.

можно изменить пароль администратора через mysite/admin веб-интерфейс или manage.py changepassword your_user_name команда.

управление django с django-администраторской утилитой и manage.py сценарием лучше всего описано в официальных django документах-> ссылка.

0
ответ дан 2 December 2019 в 02:59

Другие вопросы по тегам:

Похожие вопросы: