Страницы

Поиск по вопросам

вторник, 28 мая 2019 г.

Как сделать простой сервер на Python работающий как автономно, так и через apache?

Необходимо создать простой одностраничный сайт для тестовых целей. На странице необходимо иметь возможность делать AJAX запросы к серверу. Пожалуйста, подскажите, каким образом реализовать самым простым и быстрым способом инфраструктуру сервера? Необходимо учитывать, что сервер будет запускаться как на локальной машине не техническим специалистом, так и на общем тестовом сервере. На локальной машине не технического специалиста нет какого–либо специального ПО. На сервере используется apache2, а также настроено окружение для django–проектов.


Ответ

Самым простым способом реализовать указанное будет использование встроенного python HTTP–сервера на локальной машине и простого WSGI–приложения на сервере. При создании структуры проекта необходимо учитывать, что при работе через WSGI статические файлы лучше отдавать напрямую через apache.
Предлагаемая структура проекта будет следующей
server.py static/ | - index.html | - m/ | - styles.css | - scripts.js | - img/
В этом случае, мы сможем одинаково работать с файлами проекта. В html/css коде ссылки на статические файлы будут выглядеть следующим образом
/m/scripts.js
Конфигурация apache
ServerAdmin webmaster@mysite.ru DocumentRoot "/path/to/my/site/root/" ServerName mysite.ru
WSGIApplicationGroup %{GLOBAL} WSGIDaemonProcess mysite WSGIProcessGroup mysite WSGIScriptAlias / /path/to/my/site/root/server.py
Alias /m/ /path/to/my/site/root/static/m/
Order deny,allow Allow from all
ErrorLog "/var/log/apache2/mysite_error.log" LogLevel warn CustomLog "/var/log/apache2/mysite_warning.log" combined

В конфигурационном файле для сервера мы казали, где находится наш WSGI скрипт (WSGIScriptAlias / /path/to/my/site/root/server.py). Предлагается использовать тот же скрипт и для локального сервера. Также мы добавили псевдоним для /m/ (Alias /m/ /path/to/my/site/root/static/m/). Таким образом, все что остается – сделать папку static рабочей директорией для локального сервера, а apache автоматически сам будет обрабатывать ссылки на файлы.
import SimpleHTTPServer import SocketServer import os import sys
PORT = 8000 AJAX_ENPOINT_URL = "/ajax/endpoint" DOCUMENT_ROOT = "/path/to/my/site/root/"
# Обработчик локального сервера. class CustomHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): # Обрабатываем GET–запрос к серверу. # Если запрос к приходит по известному нам URL, формируем ответ. # Если мы не знаем URL, предлагаем стандартной библиотеки обработать его. def do_GET(self): if self.path == AJAX_ENPOINT_URL: self.send_response(200) self.send_header('Content-type','application/json') self.end_headers() self.wfile.write("My ajax response") return else: SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self)
if __name__ == "__main__": os.chdir("./static/") httpd = SocketServer.TCPServer(("", PORT), CustomHandler) print "Serving at port", PORT httpd.serve_forever() quit()
def get_index(): f = open(DOCUMENT_ROOT +'/static/index.html', 'r') data = f.read() f.close() return data
def application(environ, start_response): output = "" status = "200 OK" content_type = "text/plain" path = environ.get('PATH_INFO', None)
if path == "/" or path == "index.html": output = get_index() content_type = 'text/html' elif path == AJAX_ENPOINT_URL: content_type = 'application/json' output = "My Ajax response"
if output == "": status = "404 Not Found" output = "Not Found"
response_headers = [('Content-type', content_type), ('Content-Length', str(len(output)))] start_response(status, response_headers) return [output]
Для запуска сервера на локальной машине, достаточно перейти в корень проекта и выполнить команду
python server.py
В случае запуска на сервер, необходимо добавить конфигурацию apache в папку конфигураций и перезапустить его.

Комментариев нет:

Отправить комментарий