Как включить CORS в Python - PullRequest
0 голосов
/ 27 апреля 2018

Позвольте мне начать с того, что я не знаю Python, у меня был, возможно, 1 день, проходящий уроки по Python. Ситуация такая. У меня есть угловое приложение, в котором есть приложение Python, размещенное с Apache на виртуальной машине в iframe. Я не писал приложение на python, но другой разработчик написал мне конечную точку, где я должен иметь возможность публиковать сообщения из своего углового приложения.

Разработчик, который создал конечную точку Python, говорит, что с моим запросом что-то не так, но я уверен, что в этом нет ничего плохого. Я почти на 100% уверен, что проблема в том, что в ответе нет заголовков CORS и / или ответ не настроен для ответа на метод OPTIONS. Ниже приведена полная информация о конечной точке Python:

import os, site, inspect
site.addsitedir(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))+"/../")
import json
from datetime import datetime

import pymongo

from Config import Config


def application(environ, start_response):
  response = environ['wsgi.input'].read(int(environ['CONTENT_LENGTH']))

  if response:
    json_response = json.loads(response)

    document = {
      'payment_id': json_response['payment_id'],
      'log': json_response['log'],
      'login_id': json_response['login_id'],
      'browser': environ.get('HTTP_USER_AGENT', None),
      'ip_address': environ.get('REMOTE_ADDR', None),
      'created_at': datetime.utcnow(),
    }

    client = pymongo.MongoClient(Config.getValue('MongoServer'))
    db = client.updatepromise
    db.PaymentLogs.insert(document)

    start_response('200 OK', [('Content-Type', 'application/json')
    return '{"success": true}'

  start_response('400 Bad Request', [('Content-Type', 'application/json')])
  return '{"success": false}'

Я попытался сделать это следующим образом: я добавил в обе функции start_response больше заголовков, чтобы код теперь выглядел следующим образом:

start_response('201 OK', [('Content-Type', 'application/json',
  ('Access-Control-Allow-Headers','authorization'),
  ('Access-Control-Allow-Methods','HEAD, GET, POST, PUT, PATCH, DELETE'),
  ('Access-Control-Allow-Origin','*'),
  ('Access-Control-Max-Age','600'))])

Не: я сделал это сначала с ответом 200 и 400, и вообще не увидел никаких изменений в ответе, затем, черт возьми, я решил изменить 200 на 201, это также сделало Я не подозреваю, что этот код по какой-то причине даже не запускается.

Пожалуйста, помогите, Python newb здесь.

Приложение, я подумал, что это поможет, вот как выглядят заголовки в ответе:

General:

Request URL: http://rpc.local/api/payment_log_api.py
Request Method: OPTIONS
Status Code: 200 OK
Remote Address: 10.1.20.233:80
Referrer Policy: no-referrer-when-downgrade

Response Headers:

Allow: GET,HEAD,POST,OPTIONS
Connection: Keep-Alive
Content-Length: 0
Content-Type: text/x-python
Date: Fri, 27 Apr 2018 15:18:55 GMT
Keep-Alive: timeout=5, max=100
Server: Apache/2.4.18 (Ubuntu)

Request Headers:

Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
Access-Control-Request-Headers: authorization,content-type
Access-Control-Request-Method: POST
Connection: keep-alive
Host: rpc.local
Origin: http://10.1.20.61:4200
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36

Ответы [ 2 ]

0 голосов
/ 13 апреля 2019

Для Python с CGI я обнаружил, что это работает:

print '''Access-Control-Allow-Origin: *\r\n''',
print '''Content-Type: text/html\r\n'''

Не забудьте также включить CORS на другой стороне, например, JavaScript jQuery:

    $.ajax({ url: URL, 
             type: "GET", 
             crossDomain: true, 
             dataType: "text", etc, etc
0 голосов
/ 27 апреля 2018

Вот оно. Просто добавьте это в приложение в самом начале:

def application(environ, start_response):
  if environ['REQUEST_METHOD'] == 'OPTIONS':
    start_response(
      '200 OK',
      [
        ('Content-Type', 'application/json'),
        ('Access-Control-Allow-Origin', '*'),
        ('Access-Control-Allow-Headers', 'Authorization, Content-Type'),
        ('Access-Control-Allow-Methods', 'POST'),
      ]
    )
    return ''
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...