Câu hỏi Cách triển khai: ubuntu | apache | python | C ++ | mysql [closed]


Điều gì sẽ xảy ra nếu bạn muốn tạo một trang web và / hoặc dịch vụ web không quan trọng?

Làm thế nào để triển khai máy chủ sản xuất Apache với python cho giao diện người dùng và C ++ cho backend và MySQL cho persistance?

Bạn nên sử dụng keo nào?

Làm thế nào để cấu hình tất cả những điều nhỏ nhặt này?

Điều khoản chung:

LAMP-stack = ubuntu Linux + Apache + MySQL + Ptriển khai ython

LAMP-C ++ = Triển khai LAMP-stack với C ++

Tuyên bố từ chối trách nhiệm chung:

Hướng dẫn này là không đầy đủ hoặc lý tưởng, nhưng tôi muốn cung cấp cho một số hoàn vốn cộng đồng. Tôi hy vọng rằng nó sẽ giúp mọi người hoặc ít nhất là tạo ra một điểm chớp nhoáng để thảo luận về kiểu triển khai như vậy. Tôi muốn làm rõ rằng sự lựa chọn kết hợp python / c ++ nằm ngoài phạm vi của cuộc thảo luận này. AFAIK, nó là một trong những triển khai quan tâm trong ngành công nghiệp hoặc ít nhất là cung cấp cho rất nhiều xp.

Ngăn xếp chung:

  • Ubuntu 14.04.1 x64 (lsb_release -a)
  • Apache 2.4.7, được xây dựng ngày 22 tháng 7 năm 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)
  • Trình kết nối Oracle / C ++ 7.1.1.3 AKA libmysqlcppconnd (cd /usr/lib; find . -name "*mysqlcppconn*")
  • mysql 14.14 (mysql -V)

Có vẻ hơi đáng sợ, vì vậy tôi sẽ mô tả từng bước một.

Điều kiện tiên quyết chung:

  • Ubuntu 14.04 x64 cài đặt (mb áp dụng cho khác tuy nhiên, tôi đã thử nghiệm chỉ 14.04)
  • Bạn biết những điều cơ bản về linux
  • Bạn đã cài đặt GCC và GNU (sudo apt-get install gcc gcc-c++; sudo apt-get install build-essential;)
  • mysite.com nên được thay thế bằng tên bạn đã chọn cho trang web của mình
  • MY_PC nên được thay bằng tên máy tính của bạn, nếu nó không có, bỏ qua.

2
2017-11-27 19:01


gốc


Bạn có thể cụm từ này như là một câu hỏi trong cơ thể câu hỏi của bạn? - don.joey
Tôi sẽ viết lại phần Chủ đề làm câu hỏi và đặt nó lên trên tất cả, được không? - sdd
Vâng, ý tưởng hay. - don.joey
askubuntu.com/help/dont-ask "Bạn chỉ nên hỏi những câu hỏi thực tế, có thể trả lời dựa trên những vấn đề thực tế mà bạn phải đối mặt" - NGRhodes
Ok, tôi nên làm gì nếu tôi muốn đặt loại hướng dẫn này ở đâu đó? Askubuntu không phải là nơi để hướng dẫn triển khai ubuntu? Nó không hữu ích cho cộng đồng? Tôi thực sự đã cố gắng để làm cho nó tốt. Và khi tôi chọn hộp kiểm 'wiki cộng đồng', tôi nghĩ tôi đang tuyên bố ý định làm nhiều hơn một chút so với Giải Đáp nhỏ. - sdd


Các câu trả lời:


Tùy chọn:

  1. Tùy chọn 1 -> LAMP-C ++ với web.py

    Đó là một tùy chọn triển khai khá đơn giản, lý tưởng cho trường hợp bạn đang viết một dịch vụ web với ít hoặc không có GUI.

    • web.py 0.37 (pip list | grep web.py)
    • web.py thông tin trên stackoverflow -> liên kết
  2. Tùy chọn 2 -> LAMP-C ++ với Django và Mezzanine

    Đó là một tùy chọn nếu bạn muốn tạo một trang web, có thể vẫn còn với một phần dịch vụ. Framework web.py vẫn có thể được sử dụng cho các nhiệm vụ phụ trợ, nhưng phần lớn các công việc frontend sẽ được quản lý bởi Django và một Mezzanine CMS dựa trên nó. Tầng lửng có danh tiếng là một khung CMS tốt được xây dựng trên đầu trang của Django để xây dựng các trang web hướng nội dung nhanh chóng.

    • Django 1.6.1 (pip list | grep Django)
    • Tầng lửng 3.1.10 (pip list | grep Mezzanine)

3



Gợi ý: Sử dụng Github hoặc một số trang VCS công cộng khác cho bất kỳ tệp hoàn chỉnh nào trong câu trả lời này. - muru
Tôi sẽ viết một hướng dẫn riêng để triển khai django + mezzanine: đó là một tình huống hoàn toàn khác và tôi phải thay đổi rất nhiều. Hướng dẫn này khá đầy đủ, tôi nghĩ vậy. Tuy nhiên, tôi sẽ tạo một liên kết đến nó từ đây. Bạn nghĩ sao? - sdd
Tôi đồng ý. Hướng dẫn này là khá khó sử dụng, vì vậy bổ sung thêm nên được trong một riêng biệt. - muru


LAMP-C ++ với web.py

Tất cả các tệp có sẵn trong git repo -> liên kết

1) Mạng:

  • Nếu bạn muốn xem dịch vụ / trang web của bạn trên mạng con nhà (192.168.xxx.xxx IP-s), thì bạn nên đảm bảo rằng địa chỉ IP ổn định. Tôi có một bộ định tuyến có một máy chủ DHCP tích hợp cung cấp cho các IP mạng con cho các thiết bị dựa trên kết nối đầu tiên. Có hai cách để xử lý vấn đề này: bạn có thể đặt cấu hình thiết bị để có IP ưa thích trong mạng con nhà hoặc bạn có thể định cấu hình các ngoại lệ DHCP trên bộ định tuyến của mình (ví dụ: thông qua giao diện web, 192.168.1.1).

  • Sau khi cấu hình (hoặc trong trường hợp bạn không cần dựa trên các tùy chọn định tuyến của bạn), bạn có thể xác định địa chỉ IP của máy tính của bạn với ifconfig

  • Cập nhật / etc / hosts để có độ phân giải DNS chính xác trên máy tính của bạn:

    #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

  • Cài đặt, dựng lên:

    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get install apache2
    
  • Fill configs (Apache 2.4 có cách bố trí cấu hình khác với Apache 2.2):

    cd /etc/apache2 && ll
    
  • apache2.conf, gắn thêm (wsgi sẽ là cần thiết sau):

    # 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

    Tôi đã xóa thông tin này sau khi đã sao lưu. Trang web của tôi hiển thị tại url gốc mysite.com/ mà không có trang web đó.

  • sites-available / mysite.com.conf (chính xác với phần ".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>
    
  • kiểm tra các quyền đối với thư mục trang web của bạn.

  • thêm trang web của bạn:

    sudo a2ensite mysite.com
    
  • khởi động lại dịch vụ apache2:

    sudo service apache2 restart
    
  • kiểm tra xem apache2 có đang chạy hay không:

    ps ax | grep apache2
    
  • kiểm tra xem apache có nghe trên cổng 80 trên các kết nối từ bất kỳ ai không:

    sudo netstat -anp | grep apache
    

    Đầu ra như:

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

3) mod_wsgi

sudo apt-get install libapache2-mod-wsgi

Sau đó, bạn nên có wsgi.conf và wsgi.load trong thư mục / etc / apache2 / mods-enabled.

4) Cài đặt python

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

5) Cài đặt web.py (trang web webpy.org đã được thay thế bằng http://webpy.github.io/)

sudo pip install web.py

6) Cài đặt tăng (autoremove đã giúp tôi với vấn đề gói bị hỏng, vì vậy chỉ trong trường hợp):

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

7) Cài đặt mysql:

liên kết

Tạo một bài kiểm tra cơ sở dữ liệu, bảng hello với INT id và VARCHAR (100) msg ​​và chèn 'Hello world!' vào nó. Liên kết ở trên có một số tài nguyên về cách đạt được điều này ở phía dưới, nếu bạn mới dùng mysql.

Nhân tiện, Oracle đã tạo một GUI miễn phí cho mysql, nó được gọi là MySQL Workbench, đây. Bạn sẽ cần đăng ký Oracle (miễn phí) để tải xuống.

8) Cài đặt Trình kết nối / C ++ của Oracle từ đây, hướng dẫn cài đặt là đây. Họ không có gói .deb bây giờ, vì vậy tôi đã xây dựng nó từ nguồn, nó chỉ là 3 lệnh shell và không đau. Bạn sẽ cần đăng ký Oracle (miễn phí) để tải xuống.

9) Viết rất nhiều mã python và C ++ cho một 'Hello World' đơn giản, đi qua python và C ++ vào MySQL.

  • Tôi có cấu trúc thư mục sau trong ~/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]
    

    Đó là tất cả các tệp bạn sẽ cần phải chạm ngoại trừ cấu hình apache2 trong cấu hình (2) và ~ / .bashrc & ~ / .bash_aliases.

  • Cập nhật biến môi trường PATH .bashrc của bạn cho LD và 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/
    
  • Tạo một bí danh trong ~ / .bash_aliases để lấy 'Hello World' từ trình bao [tùy chọn]

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

    Và đừng quên source ~/.bashrc ~/.bash_aliases!

    Sau khi bạn sao chép và dán mã tiếp theo, bạn sẽ có thể nhận được 'Hello World' được lưu trữ trên MySQL bằng lệnh hello get mysite.com

  • Viết mã python:

  • trong đó.py:

  • myproject_front.py: [WSGIScriptAlias ​​của cấu hình điểm apache2 tại đây]

    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()
    
  • Viết mã 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:

    Điều này được lấy từ tài liệu chính thức của Connector / C ++ của Oracle, liên kếtvà sửa đổi một chút.

    #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
    
  • xây dựng mã C ++ vào gateway_back.so với make lệnh shell

  • trỏ trình duyệt của bạn đến url hoặc Địa chỉ IP mà bạn đã chọn ở các bước (1) và (2) hoặc nhập hello get <your url or IP Address>từ bảng điều khiển để nhận 'Hello'.

10) Nó sẽ hoạt động. Cuối cùng. ) Hãy thảo luận và mở rộng hướng dẫn nếu nó không hoặc nếu ai đó biết một cách tốt hơn, đặc biệt là trong vui lòng sửa các địa điểm được đánh dấu.


0





LAMP-C ++ với Django và Mezzanine

Tất cả các tệp có sẵn trong git repo -> liên kết

1) Mạng:

  • Nếu bạn muốn xem dịch vụ / trang web của bạn trên mạng con nhà (192.168.xxx.xxx IP-s), thì bạn nên đảm bảo rằng địa chỉ IP ổn định. Tôi có một bộ định tuyến có một máy chủ DHCP tích hợp cung cấp cho các IP mạng con cho các thiết bị dựa trên kết nối đầu tiên. Có hai cách để xử lý vấn đề này: bạn có thể đặt cấu hình thiết bị để có IP ưa thích trong mạng con nhà hoặc bạn có thể định cấu hình các ngoại lệ DHCP trên bộ định tuyến của mình (ví dụ: thông qua giao diện web, 192.168.1.1).

  • Sau khi cấu hình (hoặc trong trường hợp bạn không cần dựa trên các tùy chọn định tuyến của bạn), bạn có thể xác định địa chỉ IP của máy tính của bạn với ifconfig

  • Cập nhật / etc / hosts để có độ phân giải DNS chính xác trên máy tính của bạn:

    #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

  • Cài đặt, dựng lên:

    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get install apache2
    
  • Fill configs (Apache 2.4 có cách bố trí cấu hình khác với Apache 2.2):

    cd /etc/apache2 && ll
    
  • apache2.conf, gắn thêm (wsgi sẽ là cần thiết sau):

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

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

    Tôi đã xóa thông tin này sau khi đã sao lưu. Trang web của tôi hiển thị tại url gốc mysite.com/ mà không có trang web đó.

  • sites-available / mysite.com.conf (chính xác với phần ".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>
    
  • kiểm tra các quyền đối với thư mục trang web của bạn.

  • thêm trang web của bạn:

    sudo a2ensite mysite.com
    
  • khởi động lại dịch vụ apache2:

    sudo service apache2 restart
    
  • kiểm tra xem apache2 có đang chạy hay không:

    ps ax | grep apache2
    
  • kiểm tra xem apache có nghe trên cổng 80 trên các kết nối từ bất kỳ ai không:

    sudo netstat -anp | grep apache
    

    Đầu ra như:

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

3) mod_wsgi

sudo apt-get install libapache2-mod-wsgi

Sau đó, bạn nên có wsgi.conf và wsgi.load trong thư mục / etc / apache2 / mods-enabled.

4) Cài đặt python

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

5) Cài đặt django

sudo pip install Django

6) Cài đặt tăng (autoremove đã giúp tôi với vấn đề gói bị hỏng, vì vậy chỉ trong trường hợp):

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

7) Cài đặt mysql:

liên kết

Tạo một bài kiểm tra cơ sở dữ liệu, bảng hello với INT id và VARCHAR (100) msg ​​và chèn 'Hello world!' vào nó. Liên kết ở trên có một số tài nguyên về cách đạt được điều này ở phía dưới, nếu bạn mới dùng mysql.

Nhân tiện, Oracle đã tạo một GUI miễn phí cho mysql, nó được gọi là MySQL Workbench, đây. Bạn sẽ cần đăng ký Oracle (miễn phí) để tải xuống.

Sau đó, có các phần mysql cho python:

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

Và nếu có điều gì sai, hãy làm theo điều này -> liên kết

8) Cài đặt Trình kết nối / C ++ của Oracle từ đây, hướng dẫn cài đặt là đây. Họ không có gói .deb bây giờ, vì vậy tôi đã xây dựng nó từ nguồn, nó chỉ là 3 lệnh shell và không đau. Bạn sẽ cần đăng ký Oracle (miễn phí) để tải xuống.

9) Cài đặt và cấu hình Gác lửng

sudo pip install Mezzanine
cd work
mezzanine-project mysite

Hướng dẫn cài đặt lửng so với đề xuất bạn sử dụng createdb và runserver từ manage.py wrapper. Đối với db tôi sử dụng cách tiếp cận khác nhau và cho máy chủ - Apache và không phải là máy chủ django dev.

Trong thư mục mysite, được tạo bởi Mezzanine, trong 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",
    }
}

hơn là thực thi

python manage.py syncdb

mà sẽ tạo ra các bảng django cùng với db của bạn, được tạo ra trong (7)

thay đổi ALLOWED_HOSTS trong settings.py trong thư mục mysite được tạo bởi mezzanine:

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

thêm nội dung sau vào urls.py:

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

trực tiếp sau urlpatterns += patterns('', hàng. điều này là cần thiết để có đầu ra dịch vụ văn bản thuần túy trên mysite / test / url cùng với trang chủ lửng tại url mysite.com.

10) thu thập các tệp tĩnh

tạo / static / subdir trong thư mục mysite của bạn nếu không có

có một đường dẫn trong phần settings.py config (đó là cấu hình django với một số addzz lửng), chúng ta cần phải kiểm tra thiết lập STATIC_URL và thêm đường dẫn đến các tệp tĩnh django-admin

STATIC_URL = "/static/"

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

bây giờ chúng tôi có thể thu thập các tệp tĩnh vào một nơi duy nhất - đó là những gì các tác giả django đề xuất để lưu trữ tất cả nội dung css, js, txt vv

python manage.py collectstatic

11) Bây giờ chúng ta cần điền mã python và C ++

  • Tôi có cấu trúc thư mục sau trong ~/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]
    

    Đó là tất cả các tệp bạn sẽ cần phải chạm ngoại trừ cấu hình apache2 trong cấu hình (2) và ~ / .bashrc & ~ / .bash_aliases.

  • Cập nhật biến môi trường PATH .bashrc của bạn cho LD và 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/
    
  • Tạo một bí danh trong ~ / .bash_aliases để lấy 'Hello World' từ trình bao [tùy chọn]

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

    Và đừng quên source ~/.bashrc ~/.bash_aliases!

    Sau khi bạn sao chép và dán mã tiếp theo, bạn sẽ có thể nhận được 'Hello World' được lưu trữ trên MySQL bằng lệnh hello get mysite.com

  • Viết mã python:

  • trong đó.py: trống, đặt bất kỳ khởi tạo mô-đun nào ở đây nếu cần

  • 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 ​​của cấu hình điểm apache2 tại đây]

    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()
    
  • Viết mã 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:

    Điều này được lấy từ tài liệu chính thức của Connector / C ++ của Oracle, liên kếtvà sửa đổi một chút.

    #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
    
  • xây dựng mã C ++ vào gateway_back.so với make lệnh shell

  • trỏ trình duyệt của bạn đến url hoặc Địa chỉ IP mà bạn đã chọn ở các bước (1) và (2) hoặc nhập hello get <your url or IP Address>từ bảng điều khiển để nhận 'Hello'.

12) Kết quả. Bây giờ, nếu tất cả đã được thực hiện đúng và nếu tôi không bỏ lỡ một cái gì đó, bạn nên có sau:

  • Trang chủ mặc định lửng trông dễ thương tại www.mysite.com
  • văn bản đơn giản 'hello world' tại www.mysite.com/test (phần này là cần thiết nếu bạn muốn tạo một dịch vụ web với API cùng với trang web)

P.S. phải làm gì tiếp theo:

  • bạn có thể dùng python manage.py collecttemplates từ thư mục mysite để bắt đầu làm việc trên các mẫu lửng

  • bạn có thể đăng nhập vào giao diện quản trị của bạn (mysite / admin) với thông tin đăng nhập / mật khẩu mysql của bạn.

nếu chúng ta sử dụng cách mặc định - python manage.py createdb, hơn đăng nhập / mật khẩu sẽ là admin / default. nhưng tôi đã cố gắng để làm cho tất cả mọi thứ theo cách của tôi để django đồng bộ hóa với tài khoản mysql hiện tại của tôi và nó là đăng nhập / pw. Đây là cùng một mà bạn đăng nhập vào khách hàng mysql hoặc bạn sử dụng trong mysql_hello.cpp.

bạn có thể thay đổi mật khẩu quản trị thông qua giao diện web của mysite / admin hoặc manage.py changepassword your_user_name chỉ huy.

quản lý django với tiện ích django-admin và kịch bản manage.py được mô tả tốt nhất trong tài liệu chính thức của django -> liên kết.


0