web-dev-qa-db-fra.com

Comment déployer: ubuntu | Apache | python | C ++ | mysql

Que faire si vous souhaitez créer un site Web et/ou un service Web non trivial?

Comment déployer un serveur de production Apache avec python pour le frontend et C++ pour le backend et MySQL pour la persistance?

Quelle colle devriez-vous utiliser?

Comment configurer toutes ces petites choses?

Termes Communs:

LAMP-stack = ubuntu L inux + A pache + M ySQL + P = ython déploiement

LAMP-C++ = Déploiement LAMP-stack avec C++

Avertissement commun:

Ce guide est loin d’être complet ou idéal, mais je voulais rendre la communauté plus rentable. J'espère que cela aidera les gens ou, au moins, créera un point d'éclair pour discuter de ce type de déploiement. Je tiens à préciser que le choix de la combinaison python/c ++ sort du cadre de cette discussion. Autant que je sache, c’est un des déploiements d’intérêt dans l’industrie ou du moins qui donne beaucoup de xp.

Common Stack:

  • Ubuntu 14.04.1 x64 (lsb_release -a)
  • Apache 2.4.7, construit le 22 juillet 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)
  • Connecteur Oracle/C++ 7.1.1.3 AKA libmysqlcppconnd (cd /usr/lib; find . -name "*mysqlcppconn*")
  • mysql 14.14 (mysql -V)

Ça a l'air un peu terrifiant, alors je vais vous décrire une étape à la fois.

Préconditions communes:

  • Ubuntu 14.04 x64 installé (mb appliqué à d’autres cependant, j’ai testé seulement 14.04)
  • Vous connaissez les bases de Linux
  • Vous avez installé GCC et GNU make (Sudo apt-get install gcc gcc-c++; Sudo apt-get install build-essential;)
  • mysite.com doit être remplacé par le nom que vous avez choisi pour votre site
  • MY_PC devrait être remplacé par un nom de votre PC. S'il n'en a pas, ignorez-le.
2
sdd

Options:

  1. Option 1 -> LAMP-C++ avec web.py

    C'est une option de déploiement plutôt simple, idéale pour le cas où vous écrivez un service Web avec peu ou pas d'interface graphique.

    • web.py 0.37 (pip list | grep web.py)
    • info web.py sur stackoverflow -> lien
  2. Option 2 -> LAMP-C++ avec Django et Mezzanine

    C'est une option si vous voulez créer un site Web, peut-être toujours avec une partie service. Framework web.py peut toujours être utilisé pour des tâches auxiliaires, mais la majeure partie du travail frontal sera gérée par Django et par un CMS Mezzanine basé sur celui-ci. Mezzanine a la réputation d'être un bon framework CMS construit sur Django pour la création rapide de sites basés sur le contenu.

    • Django 1.6.1 (pip list | grep Django)
    • Mezzanine 3.1.10 (pip list | grep Mezzanine)
3
sdd

LAMP-C++ avec web.py

Tous les fichiers disponibles dans git repo -> link

1) réseau:

  • Si vous souhaitez voir votre service/site sur le sous-réseau de base (adresses IP 192.168.xxx.xxx), vous devez vous assurer que les adresses IP sont stables. J'ai un routeur qui a un serveur DHCP intégré qui donne le sous-réseau IP-s à la maison aux périphériques en fonction de celui qui est connecté en premier. Il existe deux manières de gérer ce problème: vous pouvez définir le périphérique de manière à avoir une adresse IP préférée dans le sous-réseau domestique ou vous pouvez configurer des exceptions DHCP sur votre routeur (par exemple, via l'interface Web 192.168.1.1).

  • Après la configuration (ou au cas où vous n'en auriez pas besoin en fonction de vos préférences de routage), vous pouvez identifier l'adresse IP de votre ordinateur avec ifconfig

  • Mettez à jour/etc/hosts pour que la résolution DNS soit correcte sur votre ordinateur 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

  • Installer:

    Sudo apt-get update
    Sudo apt-get upgrade
    Sudo apt-get install Apache2
    
  • Remplir les configurations (Apache 2.4 a une structure de configuration différente d'Apache 2.2, par exemple):

    cd /etc/Apache2 && ll
    
  • Apache2.conf, append (wsgi sera nécessaire ultérieurement):

    # 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

    Je l'ai supprimé après l'avoir sauvegardé. Mon site est visible à l'URL racine mysite.com/ sans celui-ci.

  • sites-available/mysite.com.conf (exactement avec la partie ".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>
    
  • vérifiez les droits pour le répertoire de votre site.

  • ajoutez votre site:

    Sudo a2ensite mysite.com
    
  • redémarrez le service Apache2:

    Sudo service Apache2 restart
    
  • vérifiez que Apache2 est en cours d'exécution:

    ps ax | grep Apache2
    
  • vérifiez qu'Apache écoute le port 80 sur les connexions de quiconque:

    Sudo netstat -anp | grep Apache
    

    Sortie comme:

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

3) mod_wsgi

Sudo apt-get install libapache2-mod-wsgi

Ensuite, vous devriez avoir wsgi.conf et wsgi.load dans le répertoire/etc/Apache2/mods-enabled.

4) Installer Python

Sudo apt-get install python
Sudo apt-get install python-pip

5) Installer web.py (le site webpy.org a été remplacé par http://webpy.github.io/ )

Sudo pip install web.py

6) Installer boost (autoremove m'a aidé avec le problème des paquets cassés, donc juste au cas où):

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

7) Installez mysql:

lien

Créez un test de base de données, table hello avec INT id et msg VARCHAR (100) et insérez 'Hello world!' dans ça. Le lien ci-dessus contient des ressources sur la façon de procéder, si vous êtes nouveau sur mysql.

A propos, Oracle a créé une interface graphique gratuite pour mysql, appelée MySQL Workbench, ici . Vous aurez besoin d'un enregistrement Oracle (c'est gratuit) pour le télécharger.

8) Installez le connecteur/C++ d’Oracle à partir de ici , les instructions d’installation sont ici . Ils n’ont pas de paquet .deb pour le moment, je l’ai donc construit à partir de la source, c’était juste 3 commandes Shell et pas de problème. Vous aurez besoin d'un enregistrement Oracle (c'est gratuit) pour le télécharger.

9) Ecrivez beaucoup de python et de code C++ pour un simple 'Hello World', qui passe par python et C++ dans MySQL.

  • J'ai la structure de répertoire suivante dans ~/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]
    

    Ce sont tous les fichiers que vous devez toucher, sauf les configurations Apache2 dans les configurations (2) et ~/.bashrc & ~/.bash_aliases.

  • Mettez à jour vos variables d'environnement PATH .bashrc pour LD et 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/
    
  • Créez un alias dans ~/.bash_aliases pour obtenir 'Hello World' depuis Shell [facultatif]

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

    Et n'oubliez pas de source ~/.bashrc ~/.bash_aliases!

    Après avoir copié-collé le code supplémentaire, vous devriez pouvoir obtenir votre 'Hello World' stocké dans MySQL avec la commande hello get mysite.com

  • Écrivez le code python:

  • init . py:

  • myproject_front.py: [pointez WSGIScriptAlias ​​sur Apache2 config ici]

    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 __== '__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 __== '__main__':
        main()
    
  • Écrivez le code 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:

    Ceci est tiré de la documentation officielle d'Oracle Connector/C++, lien , et modifié un peu.

    #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;
    }
    
  • Makefile:

    # 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
    
  • construire du code C++ dans gateway_back.so avec la commande make Shell

  • indiquez à votre navigateur l'URL ou l'adresse IP que vous avez choisie aux étapes (1) et (2) ou tapez hello get <your url or IP Address> à partir de la console pour obtenir le message "Hello".

10) Cela fonctionnera. Finalement. ) Discutons et développons le guide s'il ne le sait pas ou si quelqu'un connaît un meilleur moyen, en particulier dans , veuillez corriger les lieux marqués.

0
sdd

LAMP-C++ avec Django et Mezzanine

Tous les fichiers disponibles dans git repo -> link

1) réseau:

  • Si vous souhaitez voir votre service/site sur le sous-réseau de base (adresses IP 192.168.xxx.xxx), vous devez vous assurer que les adresses IP sont stables. J'ai un routeur qui a un serveur DHCP intégré qui donne le sous-réseau IP-s à la maison aux périphériques en fonction de celui qui est connecté en premier. Il existe deux manières de gérer ce problème: vous pouvez définir le périphérique de manière à avoir une adresse IP préférée dans le sous-réseau domestique ou vous pouvez configurer des exceptions DHCP sur votre routeur (par exemple, via l'interface Web 192.168.1.1).

  • Après la configuration (ou au cas où vous n'en auriez pas besoin en fonction de vos préférences de routage), vous pouvez identifier l'adresse IP de votre ordinateur avec ifconfig

  • Mettez à jour/etc/hosts pour que la résolution DNS soit correcte sur votre ordinateur 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

  • Installer:

    Sudo apt-get update
    Sudo apt-get upgrade
    Sudo apt-get install Apache2
    
  • Remplir les configurations (Apache 2.4 a une structure de configuration différente d'Apache 2.2, par exemple):

    cd /etc/Apache2 && ll
    
  • Apache2.conf, append (wsgi sera nécessaire ultérieurement):

    # server name
    ServerName mysite.com
    
  • ports.conf:

    # sets Apache listen on port 80
    Listen *:80
    
  • sites-available/000-default.conf

    Je l'ai supprimé après l'avoir sauvegardé. Mon site est visible à l'URL racine mysite.com/ sans celui-ci.

  • sites-available/mysite.com.conf (exactement avec la partie ".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>
    
  • vérifiez les droits pour le répertoire de votre site.

  • ajoutez votre site:

    Sudo a2ensite mysite.com
    
  • redémarrez le service Apache2:

    Sudo service Apache2 restart
    
  • vérifiez que Apache2 est en cours d'exécution:

    ps ax | grep Apache2
    
  • vérifiez qu'Apache écoute le port 80 sur les connexions de quiconque:

    Sudo netstat -anp | grep Apache
    

    Sortie comme:

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

3) mod_wsgi

Sudo apt-get install libapache2-mod-wsgi

Ensuite, vous devriez avoir wsgi.conf et wsgi.load dans le répertoire/etc/Apache2/mods-enabled.

4) Installer Python

Sudo apt-get install python
Sudo apt-get install python-pip

5) Installer Django

Sudo pip install Django

6) Installer boost (autoremove m'a aidé avec le problème des paquets cassés, donc juste au cas où):

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

7) Installez mysql:

lien

Créez un test de base de données, table hello avec INT id et msg VARCHAR (100) et insérez 'Hello world!' dans ça. Le lien ci-dessus contient des ressources sur la façon de procéder, si vous êtes nouveau sur mysql.

A propos, Oracle a créé une interface graphique gratuite pour mysql, appelée MySQL Workbench, ici . Vous aurez besoin d'un enregistrement Oracle (c'est gratuit) pour le télécharger.

Ensuite, il y a des morceaux mysql pour python:

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

Et si quelque chose ne va pas, suivez ceci -> lien

8) Installez le connecteur/C++ d’Oracle à partir de ici , les instructions d’installation sont ici . Ils n’ont pas de paquet .deb pour le moment, je l’ai donc construit à partir de la source, c’était juste 3 commandes Shell et pas de problème. Vous aurez besoin d'un enregistrement Oracle (c'est gratuit) pour le télécharger.

9) Installer et configurer Mezzanine

Sudo pip install Mezzanine
cd work
mezzanine-project mysite

Le guide d’installation mezzanine qui vous suggère d’utiliser createdb et runserver à partir du wrapper manage.py. Pour la base de données, j’ai utilisé une approche différente et pour serveur - Apache et non pas le serveur Django dev.

Dans mysite dir, créé par Mezzanine, dans 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",
    }
}

qu'exécuter

python manage.py syncdb

qui créera Django tables à côté de votre base de données, créé dans (7)

changez ALLOWED_HOSTS dans settings.py dans le répertoire mysite créé par mezzanine:

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

ajoutez ce qui suit à urls.py:

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

directement après la ligne urlpatterns += patterns('',. ceci est nécessaire pour que le texte en sortie soit affiché sur mysite/test/url à côté de la page d'accueil mezzanine à l'adresse mysite.com.

10) rassembler des fichiers statiques

créez/static/subdir dans votre répertoire mysite s'il n'y en a pas

il y a une section chemins dans settings.py config (qui est Django config avec quelques addons mezzanine), nous devons vérifier le paramètre STATIC_URL et ajouter le chemin vers Django- fichiers statiques admin

STATIC_URL = "/static/"

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

nous pouvons maintenant collecter des fichiers statiques à un seul endroit - c’est ce que Django les auteurs proposent de stocker tous les contenus css, js, txt, etc.

python manage.py collectstatic

11) Nous devons maintenant renseigner le code python et le code C++.

  • J'ai la structure de répertoire suivante dans ~/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]
    

    Ce sont tous les fichiers que vous devez toucher, sauf les configurations Apache2 dans les configurations (2) et ~/.bashrc & ~/.bash_aliases.

  • Mettez à jour vos variables d'environnement PATH .bashrc pour LD et 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/
    
  • Créez un alias dans ~/.bash_aliases pour obtenir 'Hello World' depuis Shell [facultatif]

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

    Et n'oubliez pas de source ~/.bashrc ~/.bash_aliases!

    Après avoir copié-collé le code supplémentaire, vous devriez pouvoir obtenir votre 'Hello World' stocké dans MySQL avec la commande hello get mysite.com

  • Écrivez le code python:

  • init . py: vide, placez toute initialisation du module ici si nécessaire

  • 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: [pointez WSGIScriptAlias ​​sur Apache2 config ici]

    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 __== '__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 __== '__main__':
        main()
    
  • Écrivez le code 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:

    Ceci est tiré de la documentation officielle d'Oracle Connector/C++, lien , et modifié un peu.

    #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;
    }
    
  • Makefile:

    # 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
    
  • construire du code C++ dans gateway_back.so avec la commande make Shell

  • indiquez à votre navigateur l'URL ou l'adresse IP que vous avez choisie aux étapes (1) et (2) ou tapez hello get <your url or IP Address> à partir de la console pour obtenir le message "Hello".

12) Résultat. Maintenant, si tout a été bien fait et si je n'ai rien manqué, vous devriez avoir:

  • La page d'accueil par défaut de Mezzanine est mignonne sur www.monsite.fr
  • texte en clair 'hello world' sur www.monsite.com/test (cette partie est nécessaire si vous souhaitez créer un service Web avec une API à côté du site)

P.S. que faire ensuite:

  • vous pouvez utiliser python manage.py collecttemplates de mysite dir pour commencer à travailler sur des modèles mezzanine

  • vous pouvez vous connecter à votre interface d'administration (mysite/admin) avec votre login/mot de passe mysql.

si nous utilisions la méthode par défaut - python manage.py createdb, alors login/password serait admin/default. mais j'ai essayé de tout faire pour que Django soit synchronisé avec mon compte mysql existant et qu'il se connecte/pw. Ce sont les mêmes avec lesquels vous vous connectez au client mysql ou que vous utilisez dans mysql_hello.cpp.

vous pouvez changer le mot de passe de l'administrateur via l'interface Web mysite/admin ou la commande manage.py changepassword your_user_name.

la gestion de Django à l'aide de l'utilitaire Django-admin et du script manage.py est mieux décrite dans le document officiel Django docs -> lien .

0
sdd