docker - 为什么 Flask-Cors 在生产中没有检测到我的跨域域?

标签 docker flask cors webserver flask-cors

我的网站有一个独立的前端和后端服务器,所以我的后端服务器需要开放CORS权限,以便前端可以从中请求数据。
我正在使用 Flask-Cors 成功 在开发中,但当我部署到生产时它不起作用。 (请注意,我已经查看了关于 SO 的其他flask-cors 问题,但没有一个适合我的情况)
这是相关的代码,即 工作 开发中:

# 3rd party imports
import flask
from flask import Flask, request, redirect, send_from_directory, jsonify
from flask_cors import CORS

# Create the app
app = Flask(__name__)
CORS(app, origins=[
  'http://localhost:5001',
])

# Define the routes
@app.route('/')
def index():
  # no CORS code was necessary here
  app.logger.info(f'request is: {flask.request}')
我试过的:
  • 添加我的服务器的 IP 地址 'http://162.243.168.182:5001' CORS 列表是 不是 足以解决这个问题,虽然我明白它应该在那里。
  • 似乎使用 '*'允许所有来源不是 工作。 (非常可疑!)

  • 请注意,我使用的是 Docker 容器,因此开发和生产之间的环境几乎相同。但不同的是,我在不同的服务器上,我修改了前端以将请求发送到新的 IP 地址(导致著名的 “Access-Control-Allow-Origin” header missing CORS 错误)。
    现在我想知道是否 flask.request对象不知何故丢失了信息,这导致 Flask-Cors 没有像预期的那样发送 Access-Control-Allow-Origin header 。如果您认为有帮助,我可以提供该日志信息!
    更多信息!
    我在 PROD 中使用的 Dockerfile 是:
    # base image
    FROM tiangolo/uwsgi-nginx-flask:python3.8-2020-12-19
    
    # install deps
    RUN pip3 install ediblepickle==1.1.3
    # RUN pip3 install flask==1.1.2 # pre-installed on tiangolo/uwsgi-nginx-flask
    RUN pip3 install flask-cors==3.0.9
    RUN pip3 install numpy==1.19.2
    RUN pip3 install scipy==1.5.2
    RUN pip3 install pandas==1.1.2
    RUN pip3 install networkx==2.5
    
    # pull in files for deployment
    COPY ./app /app
    
    # Note that there is no CMD to run because the CMD set in the base image is what we already wanted.  As long as the Flask app is called `app`, the python file is named `main.py`, the parent directory is named `app`, and that same directory gets copied into `/app`, then the base image is designed to make our app work out-of-the-box.
    
    我用来启动它的命令是:
    docker build -t mvlancellotti/tennis-backend:prod -f prod.Dockerfile . && docker run --rm -p 5000:80 --name tennis-backend-container mvlancellotti/tennis-backend:prod
    
    走进/app容器目录,有文件uwsgi.ini内容:
    [uwsgi]
    module = main
    callable = app
    
    这似乎有效,文件 /etc/nginx/nginx.conf有内容:
    user  nginx;
    worker_processes 1;
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    events {
        worker_connections 1024;
    }
    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
        access_log  /var/log/nginx/access.log  main;
        sendfile        on;
        keepalive_timeout  65;
        include /etc/nginx/conf.d/*.conf;
    }
    daemon off;
    
    和文件 /etc/nginx/conf.d/nginx.conf有内容:
    server {
        listen 80;
        location / {
            try_files $uri @app;
        }
        location @app {
            include uwsgi_params;
            uwsgi_pass unix:///tmp/uwsgi.sock;
        }
        location /static {
            alias /app/static;
        }
    }
    

    最佳答案

    如果您在实际应用程序之前使用 NGINX 或 Apache2 作为代理,您也可以配置它来为您处理 CORS header 。
    NGINX :

    add_header Access-Control-Allow-Origin *;
    
    Apache2 :
    Header set Access-Control-Allow-Origin "*"
    
    将它放在生成初始响应的地方,它将允许从任何来源加载资源。在 prod 中,您可能应该替换 *与您将使用的原点。如果原点不会经常或动态更改 - 您可能不需要 flask CORS。
    否则,您需要做的第一件事是在浏览器中打开开发者控制台并检查您对网站的初始请求的响应 header 。这是定义来源和 CORS 策略的地方。应该有一个响应头 Access-Control-Allow-Origin它定义了允许浏览器加载额外资源的位置。如果没有标题,则不允许有额外的来源。如果 header 在那里并且您仍然收到错误,那么您尝试加载的资源来源与规则不匹配。在这种情况下检查拼写错误。
    对于 CORS 的新手,我推荐这两个( 12 )来自 Mozilla 的简短读数。我认为他们在解释基础知识方面做得很好。

    关于docker - 为什么 Flask-Cors 在生产中没有检测到我的跨域域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65587708/

    相关文章:

    docker - 无法将我的 docker 推送到Bluemix-登录错误

    java - 如何解决 alfresco sdk 中的 alfresco webscripts 中的 CORS 错误?

    javascript - 如何使用 CORS 向多个域验证同一用户的身份?

    docker - 从容器内获取 docker 图像摘要/哈希

    docker - 安装适用于 Windows 的 Docker Desktop 时遇到问题

    python-3.x - 如何在 Flask Wtform 的提交按钮中添加很棒的字体图标?

    nginx - sqlite3无法打开数据库文件,运行Centos,flask uwsgi nginx

    json - Python Flask 以反斜杠返回 JSON curl 请求

    flask - 由于不允许的预检 header ,Vue.js 前端与 Flask 后端交互出现 CORS 问题

    Docker.IO 文件系统一致性