создание локального веб-сервера и отправка данных на javascript - PullRequest
1 голос
/ 08 апреля 2020

Я пытаюсь научиться создавать веб-приложение, и этому приложению нужны данные, сгенерированные из сценария python. Погуглив вокруг. Я нашел эту ссылку , и мне кажется, что мне нужно:

  1. написать приложение на стороне сервера в Python. Определите URL (маршрут), на котором выполняется ваш скрипт.
  2. в моем коде Javascript, сделайте HTTP-запрос к URL, определенному в шаге 1.

В моем java скрипт, у меня следующий ajax вызов, я не слишком уверен, что идет в поле URL:

$.ajax({
  type: "get",
  url: "http://localhost:5000",
  cache: false,
  async: "asynchronous",
  dataType: "text",
  success: function (data) {
    //console.log(JSON.stringify(data));
    console.log("---->" + data);
  },
  error: function (request, status, error) {
    console.log("Error: " + error);
  },
});

Что касается моего веб-сервера, я хотел написать его из сокетов, так как я хочу чтобы также научиться программированию сокетов, поэтому, следуя другой записи , я написал свой сервер ниже, на этом сервере моя цель - просто вернуть простую строку, чтобы доказать, что это работает, но в конечном итоге я хочу иметь возможность вернуть объект json:

import socket
import threading
import json
import pdb

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

sock.bind(('localhost', 5000))

sock.listen(1)

print("Listening at------>>> ", sock.getsockname())
connections = []

# Reply as HTTP/1.1 server, saying "HTTP OK" (code 200).
response_proto = 'HTTP/1.1'
response_status = '200'
response_status_text = 'OK'  # this can be random
res_status = "{} {} {}".format(response_proto, response_status,
                               response_status_text)

response_body_raw = "hello world"
# Clearly state that connection will be closed after this response,
# and specify length of response body
response_headers = {
    'Content-Type': 'text; encoding=utf8',
    'Content-Length': len(response_body_raw),
    'Connection': 'close',
}

response_headers_raw = ''.join('%s: %s\n' % (k, v) for k, v in
                               response_headers.items())


def handler(c, a):
    global connections
    while True:
        data = c.recv(1024)
        print(data)
        for connection in connections:
            # sending all this stuff
            connection.sendall(res_status.encode('utf-8'))
            connection.sendall('\n'.encode('utf-8'))
            connection.sendall(response_headers_raw.encode('utf-8'))
            # to separate headers from body
            connection.sendall('\n'.encode('utf-8'))
            connection.sendall(response_body_raw.encode('utf-8'))

        if not data:
            connections.remove(c)
            c.close()
            break


while True:
    c, a = sock.accept()
    print("Connected by------->>>", a)
    cThread = threading.Thread(target=handler, args=(c, a))
    cThread.daemon = True
    cThread.start()
    connections.append(c)

, когда я запускаю свой веб-сайт, используя расширение сервера VS Code Live, я получаю следующие ошибки:

Доступ к XMLHttpRequest в 'http://localhost: 5000 /? _ = 1586356660223 'от источника' http://127.0.0.1: 5500 'заблокировано политикой CORS: заголовок «Access-Control-Allow-Origin» отсутствует присутствует на запрошенном ресурсе.

GET http://localhost: 5000 /? _ = 1586356660223 net :: ERR_ FAILED

Я обнаружил ошибку No 'Access-Control-Allow-Origin', и мне кажется, что я не могу предоставить url в качестве localhost в моем вызове ajax. если нет, то что я должен указать в поле url, если я хочу общаться с моим локальным сервером?

Ответы [ 2 ]

2 голосов
/ 08 апреля 2020

Добавьте Access-Control-Allow-Origin в заголовок вашего ответа:

response_headers = {
  'Access-Control-Allow-Origin': '*',
  ...
}
1 голос
/ 08 апреля 2020

Итак, как уже упоминалось в моем комментарии, я использовал сервер Flask для обработки POST-данных, отправленных с Ajax.

По сути, вы можете настроить сервер следующим образом:

from flask import Flask, requests

app = Flask(__name__)

@app.route("/", methods=['POST', 'GET'])
def main_page():
    return "200"

if __name__ == "__main__":
    app.run(debug=True, host='192.169.178.62')

с помощью host='192.169.178.62' вы можете указать IP-адрес вашего приложения Flask. Я бы посоветовал вам узнать свой IP-адрес компьютера и использовать его для запуска Flask или использовать IP-адрес в той же сети.

В вашем AJAX вам необходимо ввести этот URL-адрес для отправки просьба.

Если что-то не работает, как следует, не стесняйтесь связаться со мной.

...