Что делать, если вы хотите создать нетривиальный веб-сайт и / или веб-службу?
Как развернуть производственный сервер Apache с python для внешнего интерфейса и C ++ для внутреннего интерфейса и MySQL для обеспечения устойчивости?
] Какой клей использовать?
Как настроить все эти мелочи?
Общие термины:
LAMP-stack = ubuntu L inux + A pache + M ySQL + P развертывание ython
LAMP-C ++ = развертывание LAMP-стека с помощью C ++
Общий отказ от ответственности:
Это руководство далеко не полное или идеальное, но я хотел немного отплатить сообществу. Я надеюсь, что это либо поможет людям, либо, по крайней мере, создаст горячую точку для обсуждения такого типа развертывания. Я хочу уточнить, что выбор комбинации python / c ++ выходит за рамки этого обсуждения. AFAIK, это одно из развертываний, представляющих интерес в отрасли, или, по крайней мере, дает много опыта.
Общий стек:
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
) Выглядит немного устрашающе, поэтому я буду описывать шаг за шагом.
Общие предварительные условия:
sudo apt- get install gcc gcc-c ++; sudo apt-get install build-essential;
) Опции:
Опция 1-> C++ ЛАМПЫ с web.py
Это - опция довольно простого развертывания, идеал для случая, когда Вы пишете веб-сервис с минимальным GUI.
pip list | grep web.py
) Опция 2-> C++ ЛАМПЫ с Django и Дополнительным уровнем
Это - опция, если Вы хотите сделать веб-сайт, возможно, все еще с запасной частью. Платформа web.py может все еще использоваться для вспомогательных задач, но объемом frontend задания будут управлять Django и Дополнительный уровень CMS на основе ее. Дополнительный уровень имеет репутацию быть хорошей Платформой CMS, созданной сверху Django для создания управляемых содержанием сайтов быстро.
pip list | grep Django
) pip list | grep Mezzanine
) 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) Это будет работать. В конечном счете.) Позволяют нам обсудить и развернуть руководство, если это не делает или если кто-то знает лучший путь, особенно в, исправьте отмеченные места.
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) Результат. Теперь, если бы все было сделано правильно и если бы я не пропустил что-то, то у Вас должно быть следующее:
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 документах-> ссылка.