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:
lsb_release -a
)Apache2 -v
)cd /usr/lib/Apache2/modules/; find . -name "*wsgi*"
)python -V
)cd /usr/lib; find . -name "*boost*";
)gcc -v
)make -v
)cd /usr/lib; find . -name "*mysqlcppconn*"
)mysql -V
)Ça a l'air un peu terrifiant, alors je vais vous décrire une étape à la fois.
Préconditions communes:
Sudo apt-get install gcc gcc-c++; Sudo apt-get install build-essential;
)Options:
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.
pip list | grep web.py
)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.
pip list | grep Django
)pip list | grep Mezzanine
)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:
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.
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:
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:
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 .