Как запустить питоновский скрипт (обработка 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 шт):

Автор решения: Ret7020

Смотрите, в любом случае запрос надо посылать не на 127.0.0.1, а надо на внешний айпишник сервака(белый). app.run(debug=True) Тут надо добавить значение host="0.0.0.0"

app.run(debug=True, host="0.0.0.0")

Это расшарит сервак на всю сеть, а не только на локалке. Так же почитайте про запуск flask на продаешене, чтобы выбрать безопасный сервак и т.д.

→ Ссылка