Как запустить питоновский скрипт (обработка post-запросов и отправка email) на стороннем сервере
Имеется сайт небольшого онлайн-магазина, написанный на js, размещен на виртуальном хостинге Макхост. После того, как клиент набрал товары в корзину и заполнил в ней свои контактные данные, данные отправляются post запросом на сервер. Нужно было написать на питоне обработчик таких запросов, их парсинг и отправку на рабочий email. Я написал такой скрипт и на моем локальном сервере все работает - запрос обрабатывается, формируется текст письма и отправляется на указанную почту. Вот текст скрипта:
#! /usr/bin/python3.6
# -*- coding: utf-8 -*-
from flask import Flask, request, render_template, make_response
import json
import smtplib
from email.mime.text import MIMEText
app = Flask(__name__)
@app.route("/shop", methods=['POST'])
def shop_form():
data = request.get_data().decode('utf-8')
data = json.loads(data)
send_email(data)
response = make_response("Status Code: 200 OK")
response.headers["Access-Control-Allow-Origin"] = "http://нужный домен"
response.headers["Access-Control-Allow-Headers"] = "*"
response.headers["Access-Control-Allow-Methods"] = "*"
response.headers["Access-Control-Allow-Credentials"] = True
return response
def send_email(message):
sender = ''
password = ''
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
true, false = True, False
basket_list = []
for i in range(len(message['items'])):
item = f"{i+1}. {message['items'][i]['_id']} {message['items'][i]['title']}: {message['items'][i]['amount']} шт."
basket_list.append(item)
final_message = \
f'''
Данные заказчика:
ФИО: {message["name"]}
Телефон: {message["phone"]}
E-mail: {message["email"]}
Адрес доставки: {message["address"]}
Состав заказа:
'''
for i in range(len(basket_list)):
final_message += f'\n{basket_list[i]}'
try:
server.login(sender, password)
msg = MIMEText(str(final_message))
msg['Subject'] = 'НОВЫЙ ЗАКАЗ НА САЙТЕ!'
server.sendmail(sender, sender, msg.as_string())
return 'The message was sent successfully!'
except Exception as _ex:
return f'{_ex}\nCheck your login or password, please!'
if __name__ == '__main__':
app.run(debug=True, host="0.0.0.0")
Функция в js, которая отправляет данные из формы:
let res = await fetch('my_domain/shop', {
method: 'POST',
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
body: JSON.stringify(data)
});
if (res.status === 200) {
console.log('Отправлено!')
} else {
console.log('Ошибка');
}
Установил на сервере хостинга виртуальное окружение питона, установил flask. Если я все правильно понял из информации, которую нашел, свой сервер мне запускать на хостинге не нужно, там уже есть апач, а мне нужно его настроить.
По инструкции с хостинга создал fcgi-скрипт mysite.fcgi в директории $HOME/cgi-bin/
#!/home/httpd/vhosts/rooreeroo.mcdir.ru/private/venvs/myvenv/bin/python3.6
import sys
sys.path.append('/home/httpd/vhosts/rooreeroo.mcdir.ru/private/venvs/myvenv/lib/python3.6/site-packages')
sys.path.append('/home/httpd/vhosts/rooreeroo.mcdir.ru/private/venvs/myvenv/lib64/python3.6/site-packages')
sys.path.append("/home/httpd/vhosts/rooreeroo.mcdir.ru/private/myapp")
from app import app
application = app
Однако инструкция приведена для Django и в ней в fcgi-скрипте также импортируются и вызываются следующие методы
from django_fastcgi.servers.fastcgi import runfastcgi
from django.core.servers.basehttp import get_internal_wsgi_application
wsgi_application = get_internal_wsgi_application()
runfastcgi(wsgi_application, method="threaded", daemonize="false")
Я не понимаю, это нужно для взаимодействия приложения с апачем? А как должен выглядеть fcgi-скрипт для flask?
И совсем не понял, как настроить сервер в файле .htaccess. В инструкции на хостинге для Django этот файл имеет такой вид:
AddHandler fcgid-script .fcgi
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule ^(media/.*)$ - [L]
RewriteRule ^(static/.*)$ - [L]
RewriteCond %{REQUEST_URI} !(cgi-bin/mysite.fcgi)
RewriteRule ^(.*)$ cgi-bin/mysite.fcgi/$1 [L]
С таким файлом в папке с публичными документами сайт вообще не открывается (ошибка 500), видимо, потому что у меня в приложении прописан только один обработчик для post запроса, да и fcgi-скрипт не выглядит правильным. Искал информацию про заполнение .htaccess, нашел, что мне нужно в этом файле перенаправить POST запрос в mysite.fcgi. Это должно выглядеть как-то так?
AddHandler fcgid-script .fcgi
Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_METHOD} POST
RewriteRule ^(.*)$ cgi-bin/mysite.fcgi/$1 [L]
Буду благодарен за помощь, может направите к нужному ресурсу, где я бы смог посмотреть информацию.
Ответы (1 шт):
Смотрите, в любом случае запрос надо посылать не на 127.0.0.1, а надо на внешний айпишник сервака(белый). app.run(debug=True) Тут надо добавить значение host="0.0.0.0"
app.run(debug=True, host="0.0.0.0")
Это расшарит сервак на всю сеть, а не только на локалке. Так же почитайте про запуск flask на продаешене, чтобы выбрать безопасный сервак и т.д.