【发布时间】:2019-08-03 11:26:45
【问题描述】:
我已经挣扎了几十个小时,试图弄清楚为什么应用程序会产生 CORS(跨源资源共享)错误
Access to XMLHttpRequest at 'https://api-client.herokuapp.com/retrieve_email' from origin 'https://front-application.firebaseapp.com' has been blocked by
CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
虽然我已将 CORS 添加到我的后端应用程序中,并且可以在 localhost 上完美运行以进行测试。将前端和后端都部署到托管服务器后,我会收到 CORS 错误。更有趣的是,它仅适用于 /retrieve_email 路径,但适用于 login - 虽然两条路径都需要 CORS。 / 路径可以正常工作,它会显示其中的 JSON,我还使用 Postman 对其进行了测试。
from flask import Flask, jsonify, request
from flask_cors import CORS
from email_receive import EmailReceive
from email_send import EmailSend
app = Flask(__name__)
CORS(app)
email_test = EmailReceive()
@app.route('/', methods=['GET'])
def index():
return jsonify({'key': 'value'})
@app.route('/retrieve_email', methods=['GET'])
def retrieve_email():
if request.method == 'GET':
email_test.email_receive()
return jsonify(email_test.get_email_data())
@app.route('/login', methods=['POST', 'GET'])
def login():
if request.method == 'POST':
data = request.get_json()
email_test.set_credentials(data)
return jsonify(data)
elif request.method == 'GET':
return jsonify(email_test.get_email_data())
@app.route('/send_email', methods=['POST', 'GET'])
def send_email():
sending = EmailSend()
if request.method == 'POST':
data = request.get_json()
sending.set_information(data)
sending.email_send()
return jsonify(data)
elif request.method == 'GET':
return jsonify({'key': 'value'})
if __name__ == '__main__':
app.run(debug=True)
以上是我使用 CORS 的代码的 sn-p。请不要嘲笑代码的结构,这是第一次使用 API 并使用 GET 和 POST 请求。前端(Angular)托管在 Firebase 上,后端(Flask)托管在 Heroku 上。
编辑1:我跑heroku logs --tail,基本上只是通过终端查看一些日志,以下是我得到的:
2019-03-14T19:03:35.999761+00:00 app[web.1]: [2019-03-14 19:03:35,999] ERROR in app: Exception on /retrieve_email [GET]
2019-03-14T19:03:35.999772+00:00 app[web.1]: Traceback (most recent call last):
2019-03-14T19:03:35.999774+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/flask/app.py", line 2292, in wsgi_app
2019-03-14T19:03:35.999776+00:00 app[web.1]: response = self.full_dispatch_request()
2019-03-14T19:03:35.999778+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/flask/app.py", line 1815, in full_dispatch_request
2019-03-14T19:03:35.999779+00:00 app[web.1]: rv = self.handle_user_exception(e)
2019-03-14T19:03:35.999780+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/flask_cors/extension.py", line 161, in wrapped_function
2019-03-14T19:03:35.999782+00:00 app[web.1]: return cors_after_request(app.make_response(f(*args, **kwargs)))
2019-03-14T19:03:35.999783+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/flask/app.py", line 1718, in handle_user_exception
2019-03-14T19:03:35.999785+00:00 app[web.1]: reraise(exc_type, exc_value, tb)
2019-03-14T19:03:35.999787+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/flask/_compat.py", line 35, in reraise
2019-03-14T19:03:35.999790+00:00 app[web.1]: raise value
2019-03-14T19:03:35.999791+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/flask/app.py", line 1813, in full_dispatch_request
2019-03-14T19:03:35.999793+00:00 app[web.1]: rv = self.dispatch_request()
2019-03-14T19:03:35.999794+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.7/site-packages/flask/app.py", line 1799, in dispatch_request
2019-03-14T19:03:35.999796+00:00 app[web.1]: return self.view_functions[rule.endpoint](**req.view_args)
2019-03-14T19:03:35.999798+00:00 app[web.1]: TypeError: decorator() missing 1 required positional argument: 'f'
2019-03-14T19:03:36.001321+00:00 app[web.1]: 10.45.158.146 - - [14/Mar/2019:19:03:35 +0000] "GET /retrieve_email HTTP/1.1" 500 291 "-" "PostmanRuntime/7.6.0"
2019-03-14T19:03:36.063632+00:00 heroku[router]: at=info method=GET path="/retrieve_email" host=email-client-live.herokuapp.com request_id=3dd5bc4a-0f57-4a82-b5f7-1bcccc64f263 fwd="73.210.197.125" dyno=web.1 connect=1ms service=73ms status=500 bytes=488 protocol=https
以下是 email_receive() 函数的代码:
import email
import email.header
import imaplib
import sys
class EmailReceive:
imap_host = ''
imap_user = ''
imap_pass = ''
email_package = []
def __init__(self):
self.imap_host = 'imap.gmail.com'
self.imap_user = 'xxxxxxxx@gmail.com'
self.imap_pass = 'xxxxxxxxxx'
def set_credentials(self, data):
self.imap_user = data['email']
self.imap_pass = data['password']
def email_receive(self):
self.email_package = []
email_instance = imaplib.IMAP4_SSL(self.imap_host)
try:
print(self.imap_user, self.imap_pass)
rv, data = email_instance.login(self.imap_user, self.imap_pass)
except imaplib.IMAP4.error:
print('[*] email_receive.py: LOGIN FAILED')
sys.exit(1)
print(rv, data)
rv, data = email_instance.list()
if rv == 'OK':
print('Mailboxes: ')
print(data)
rv, data = email_instance.select('Inbox')
if rv == 'OK':
print('Processing mailbox...')
print(data)
rv, data = email_instance.search(None, 'ALL')
if rv != 'OK':
print('[*] email_receive.py: No messages found!')
return
for num in data[0].split():
rv, data = email_instance.fetch(num, '(RFC822)')
if rv != 'OK':
# print('[*] email_receive.py: ERROR getting message', num)
return
# print(data[0][1])
message = email.message_from_bytes(data[0][1])
subject = email.header.make_header(email.header.decode_header(message['Subject']))
# print(message.keys())
message_id = message['Message-ID']
# print(header)
sender = message['From']
for part in message.walk():
if part.get_content_type() == 'text/html':
self.email_package.append({'body': part.get_payload(decode=True).decode('utf-8'),
'subject': str(subject),
'from': str(sender),
'messageid': str(message_id)})
def get_email_data(self):
return self.email_package
【问题讨论】:
标签: python-3.x firebase heroku flask cors