Необходимо создать простой одностраничный сайт для тестовых целей. На странице необходимо иметь возможность делать 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
WSGIApplicationGroup %{GLOBAL}
WSGIDaemonProcess mysite
WSGIProcessGroup mysite
WSGIScriptAlias / /path/to/my/site/root/server.py
Alias /m/ /path/to/my/site/root/static/m/
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 в папку конфигураций и перезапустить его.
Комментариев нет:
Отправить комментарий